Add ports files and add use ANSI C.

This commit is contained in:
Nicolás Ortega Froysa 2018-02-24 10:00:00 +01:00
parent 842ae8b49d
commit 37cb11cec0
No known key found for this signature in database
GPG Key ID: FEC70E3BAE2E69BF
3 changed files with 44 additions and 3 deletions

View File

@ -1,11 +1,11 @@
ASM=nasm ASM=nasm
BIN=bin BIN=bin
CFLAGS=-ffreestanding -fno-pie -m32 CFLAGS=-ffreestanding -fno-pie -m32 -ansi
CC=gcc CC=gcc
LD=ld LD=ld
LDFLAGS=-melf_i386 -Ttext 0x1000 --oformat binary LDFLAGS=-melf_i386 -Ttext 0x1000 --oformat binary
OBJ=kernel/kernel_entry.o kernel/kernel.o OBJ=kernel/kernel_entry.o kernel/kernel.o kernel/ports.o
all: os-image all: os-image
@ -29,5 +29,5 @@ kernel/kernel.bin: $(OBJ)
.PHONY: clean .PHONY: clean
clean: clean:
rm -rf boot/*.bin boot/*.o rm -rf boot/*.bin kernel/*.bin
rm -rf kernel/*.o boot/*.o drivers/*.o rm -rf kernel/*.o boot/*.o drivers/*.o

23
kernel/ports.c Normal file
View File

@ -0,0 +1,23 @@
unsigned char port_byte_in(unsigned char port) {
unsigned char res;
/*
* `"=a" (res)' means: put result of `al' into `res' variable
* `"d" (port)' means: load `port' into `dx'.
*/
__asm__("in %%dx, %%al" : "=a" (res) : "d" (port));
return res;
}
void port_byte_out(unsigned char port, unsigned char data) {
__asm__("out %%al, %%dx" : : "a" (data), "d" (port));
}
unsigned short port_word_in(unsigned short port) {
unsigned short res;
__asm__("in %%dx, %%ax" : "=a" (res) : "d" (port));
return res;
}
void port_word_out(unsigned short port, unsigned short data) {
__asm__("out %%ax, %%dx" : : "a" (data), "d" (port));
}

18
kernel/ports.h Normal file
View File

@ -0,0 +1,18 @@
#pragma once
/*
* return a byte from a port.
*/
unsigned char port_byte_in(unsigned char port);
/*
* write a byte of data to a port.
*/
void port_byte_out(unsigned char port, unsigned char data);
/*
* return a word of data from a port.
*/
unsigned short port_word_in(unsigned short port);
/*
* write a word of data to a port.
*/
void port_word_out(unsigned short port, unsigned short data);