diff options
| -rw-r--r-- | .gitignore | 1 | ||||
| -rw-r--r-- | Makefile | 21 | ||||
| -rw-r--r-- | arch/x86_64/hal/msr.c | 15 | ||||
| -rw-r--r-- | arch/x86_64/hal/msr.h | 2 | ||||
| -rw-r--r-- | arch/x86_64/hal/process.c | 2 | ||||
| -rw-r--r-- | arch/x86_64/hal/uacpi.c | 15 | ||||
| -rw-r--r-- | arch/x86_64/main.c | 7 | ||||
| -rw-r--r-- | boot/limine/memorymap.c | 2 | ||||
| -rw-r--r-- | boot/limine/start.c | 9 | ||||
| -rw-r--r-- | boot/limine/uacpi.c | 10 | ||||
| -rw-r--r-- | config.mk | 4 | ||||
| -rw-r--r-- | hal/uacpi.c | 13 | ||||
| -rw-r--r-- | lib/printf.c | 174 | ||||
| m--------- | uacpi | 0 | ||||
| -rw-r--r-- | uacpi.mk | 20 |
15 files changed, 230 insertions, 65 deletions
@@ -1,4 +1,5 @@ *.elf *.o *.d +*.a .cache @@ -16,22 +16,28 @@ SFILES += $(foreach dir, $(CDIRS), $(wildcard arch/$(TARGET_MACHINE)/$(dir)/*.s) OBJFILES := $(patsubst %.c,%.o,$(CFILES)) OBJFILES += $(patsubst %.s,%.o,$(SFILES)) +OBJFILES += uacpi.a DEPFILES := $(patsubst %.c,%.d,$(CFILES)) -CLEAN_DEPENDS = +CLEAN_DEPENDS = BIN := jove.elf INCDIR := $(OUT)/usr/include/kernel all: $(BIN) - headers: mkdir -p $(INCDIR) - -$(foreach dir,$(CDIRS),$$(mkdir -p $(INCDIR)/$(dir) $(INCDIR)/arch/$(dir)/)) + -$(foreach dir,$(CDIRS),mkdir -p $(INCDIR)/$(dir) $(INCDIR)/arch/$(dir)/;) -cp *.h $(INCDIR)/ - -$(foreach dir,$(CDIRS),$$(cp $(dir)/*.h $(INCDIR)/$(dir)/)) - -$(foreach dir,$(CDIRS),$$(cp arch/$(TARGET_MACHINE)/$(dir)/*.h $(INCDIR)/arch/$(dir)/)) + -$(foreach dir,$(CDIRS),cp $(dir)/*.h $(INCDIR)/$(dir)/;) + -$(foreach dir,$(CDIRS),cp arch/$(TARGET_MACHINE)/$(dir)/*.h $(INCDIR)/arch/$(dir)/;) + +$(BIN): ${OBJFILES} + $(LD) $(LDFLAGS) ${OBJFILES} -o $(BIN) + +include uacpi.mk +-include ${DEPFILES} .PHONY: clean clean: $(CLEAN_DEPENDS) @@ -39,11 +45,6 @@ clean: $(CLEAN_DEPENDS) -rm $(DEPFILES) -rm $(BIN) -$(BIN): ${OBJFILES} - $(LD) $(LDFLAGS) ${OBJFILES} -o $(BIN) - --include ${DEPFILES} - %.o:%.c $(CC) $(CFLAGS) -c $< -o $@ diff --git a/arch/x86_64/hal/msr.c b/arch/x86_64/hal/msr.c index f27e303..849f0ff 100644 --- a/arch/x86_64/hal/msr.c +++ b/arch/x86_64/hal/msr.c @@ -44,6 +44,21 @@ msr_enable_sce(void) } void +msr_enable_sse(void) +{ + uint64_t cr4 = 0; + __asm__ volatile("mov %%cr4, %0": "=r"(cr4)); + + cr4 &= 0xFFFFFFFFFFFFFFFB; + cr4 |= 0x2; + __asm__ volatile("mov %0, %%cr4":: "r"(cr4)); + __asm__ volatile("mov %%cr4, %0": "=r"(cr4)); + + cr4 |= (3 << 9); + __asm__ volatile("mov %0, %%cr4":: "r"(cr4)); +} + +void msr_set_lstar(void *lstar_value) { union msr_lstar lstar; diff --git a/arch/x86_64/hal/msr.h b/arch/x86_64/hal/msr.h index 69d96be..f65b621 100644 --- a/arch/x86_64/hal/msr.h +++ b/arch/x86_64/hal/msr.h @@ -40,6 +40,8 @@ void msr_set_gs_base(uintptr_t gs_base); uintptr_t msr_get_gs_base(void); void msr_enable_sce(void); +void msr_enable_sse(void); + void msr_set_lstar(void *syscall_entry); void msr_read(uint32_t msr, uint32_t *lo, uint32_t *hi); diff --git a/arch/x86_64/hal/process.c b/arch/x86_64/hal/process.c index 872be5a..6cc9372 100644 --- a/arch/x86_64/hal/process.c +++ b/arch/x86_64/hal/process.c @@ -41,7 +41,7 @@ pcb_rootdir(pcb_t *pcb) void processing_setup(void (*process_main)) { - uintptr_t ksp = ((uintptr_t)&s_init_pcb_bytes) + 0xFF0; + uintptr_t ksp = ((uintptr_t)&s_init_pcb_bytes) + 0xFF8; s_init_pcb->pid = 1; s_init_pcb->ksp = (void*)ksp; diff --git a/arch/x86_64/hal/uacpi.c b/arch/x86_64/hal/uacpi.c new file mode 100644 index 0000000..052f849 --- /dev/null +++ b/arch/x86_64/hal/uacpi.c @@ -0,0 +1,15 @@ +#include "lib/printf.h" +#include "uacpi/kernel_api.h" +#include "paging.h" + +void *uacpi_kernel_map(uacpi_phys_addr addr, uacpi_size len) +{ + //kprintf("UACPI kernel map %p -> %p\n", addr, (uintptr_t)addr | IDENT_VIRT_BASE); + return (void*)(addr | IDENT_VIRT_BASE); +} + +void uacpi_kernel_unmap(void *addr, uacpi_size len) +{ + (void)addr; + (void)len; +} diff --git a/arch/x86_64/main.c b/arch/x86_64/main.c index 2d4599e..d688fa0 100644 --- a/arch/x86_64/main.c +++ b/arch/x86_64/main.c @@ -4,6 +4,7 @@ #include "lib/virtterm.h" #include "lib/panic.h" #include "../../hal/obj.h" +#include "hal/msr.h" #include "hal/serial_com.h" #include "hal/smp.h" #include "hal/memory.h" @@ -11,6 +12,7 @@ #include "hal/process.h" #include "boot/initrd.h" #include "boot/cmdline.h" +#include "uacpi/uacpi.h" int errno = 0; @@ -23,6 +25,8 @@ static void kernel_process_entry(void); void kernel_entry(void) { + msr_enable_sse(); + obj_settype(_rootdir_obj, JOVE_OBJ_OBJDIR); serial_com_init(); @@ -45,6 +49,9 @@ kernel_entry(void) static void kernel_process_entry(void) { + uint8_t uacpi_buffer[1024]; + uacpi_setup_early_table_access(uacpi_buffer, 1024); + init_setup(); kpanic("Reached the end of kernel main!\n"); } diff --git a/boot/limine/memorymap.c b/boot/limine/memorymap.c index 3ee9bdc..72c8de3 100644 --- a/boot/limine/memorymap.c +++ b/boot/limine/memorymap.c @@ -40,6 +40,8 @@ mem_setup_untyped(void) kprintf("Memory map provided by Limine:\n"); size_t untyped_i = 0; + size_t acpi_i = 0; + uintptr_t highest_phys = 0; for(size_t i = 0; i < _limine_memmap_resp->entry_count; i++) { struct limine_memmap_entry *entry = _limine_memmap_resp->entries[i]; diff --git a/boot/limine/start.c b/boot/limine/start.c index b371f92..9fffb0b 100644 --- a/boot/limine/start.c +++ b/boot/limine/start.c @@ -2,7 +2,6 @@ #include <stddef.h> #include "boot/cmdline.h" -#include "hal/framebuffer.h" #include "limine.h" void _start(void); @@ -53,12 +52,19 @@ static volatile struct limine_framebuffer_request framebuffer_request = { }; LIMINE_REQUEST_SECTION +static volatile struct limine_rsdp_request rsdp_request = { + .id = LIMINE_RSDP_REQUEST_ID, + .revision = 0, .response = NULL +}; + +LIMINE_REQUEST_SECTION static volatile uint64_t limine_requests_end_marker[] = LIMINE_REQUESTS_END_MARKER; void *_kernel_physptr = NULL; void *_initrd_module = NULL; struct limine_framebuffer_response *_limine_framebuffers; struct limine_memmap_response *_limine_memmap_resp = NULL; +struct limine_rsdp_response *_limine_rsdp_resp = NULL; __attribute__((noreturn)) void @@ -67,6 +73,7 @@ _start(void) _kernel_physptr = (void*)executable_address_req.response->physical_base; _limine_memmap_resp = memmap_req.response; _limine_framebuffers = framebuffer_request.response; + _limine_rsdp_resp = rsdp_request.response; if(module_req.response->module_count > 0) { _initrd_module = module_req.response->modules[0]->address; diff --git a/boot/limine/uacpi.c b/boot/limine/uacpi.c new file mode 100644 index 0000000..93b4fd1 --- /dev/null +++ b/boot/limine/uacpi.c @@ -0,0 +1,10 @@ +#include "uacpi/kernel_api.h" +#include "limine.h" + +extern struct limine_rsdp_response *_limine_rsdp_resp; + +uacpi_status uacpi_kernel_get_rsdp(uacpi_phys_addr *out_rsdp_address) +{ + *out_rsdp_address = (uintptr_t)_limine_rsdp_resp->address; + return UACPI_STATUS_OK; +} @@ -14,8 +14,10 @@ LDFLAGS = -nostdlib \ -T link/$(TARGET_TRIPLET).ld ifeq "$(TARGET_MACHINE)" "x86_64" - CFLAGS += -m64 \ + CFLAGS += -march=x86-64 \ + -m64 \ -mno-red-zone \ + -mno-mmx \ -mcmodel=kernel \ -mfsgsbase endif diff --git a/hal/uacpi.c b/hal/uacpi.c new file mode 100644 index 0000000..0af50b2 --- /dev/null +++ b/hal/uacpi.c @@ -0,0 +1,13 @@ +#include "uacpi/uacpi.h" +#include "lib/printf.h" + +void uacpi_kernel_log(uacpi_log_level lvl, const uacpi_char* fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + + kvprintf(fmt, ap); + + va_end(ap); +} + diff --git a/lib/printf.c b/lib/printf.c index b96c616..0a9cc15 100644 --- a/lib/printf.c +++ b/lib/printf.c @@ -17,6 +17,13 @@ int kprintf(const char *fmt, ...) if(str && i < size) str[i] = (c); \ i++ +struct print_flags +{ + char flg_alt, flg_zeropad, flg_ladjust, flg_showsign, flg_signspace; + int fieldw, precision; + int lenmod, lenspec, radix, unsign; +}; + static int convert_as_int( char *str, @@ -51,26 +58,40 @@ convert_as_int( enum printf_state { FSTATE_DIRECT = 0, + FSTATE_FLAG, + FSTATE_FIELDWIDTH, + FSTATE_PRECISION, + FSTATE_LENMOD, FSTATE_CONVERT }; static int -s_convert_string(char *str, size_t size, va_list ap, size_t stri) +s_convert_string(char *str, size_t size, va_list ap, size_t stri, struct print_flags flags) { const char *strarg = va_arg(ap, const char*); - for(const char *strargc = strarg; *strargc; strargc++) { - SPRINTF_PUTC(str, size, stri, *strargc); + if((uintptr_t)strarg < 0xFFFF800000000000ULL) return stri; + + int arglen = flags.precision == 0 ? strlen(strarg) : flags.precision; + int minlen = flags.fieldw; + char padc = flags.flg_zeropad ? '0' : ' '; + + for(int i = 0; i < minlen - arglen; i++) { + SPRINTF_PUTC(str, size, stri, padc); + } + + for(int i = 0; i < arglen; i++) { + SPRINTF_PUTC(str, size, stri, strarg[i]); } return stri; } static int s_convert_int(char *str, size_t size, va_list ap, size_t stri, - int fw, char fp, int typelen, int radix, int usign, int caps) + struct print_flags flags) { char num_buf[64]; uintmax_t value = 0; - switch(typelen) { + switch(flags.lenspec) { case 1: value = (uintmax_t)(int8_t)va_arg(ap, int); break; case 2: value = (uintmax_t)(int16_t)va_arg(ap, int); break; default: @@ -79,17 +100,19 @@ s_convert_int(char *str, size_t size, va_list ap, size_t stri, } size_t pad_stri = stri; - int advance = convert_as_int(num_buf, 64, 0, value, radix, usign); - if(caps) { + int advance = convert_as_int(num_buf, 64, 0, value, flags.radix, flags.unsign); + if(flags.flg_alt) { for(int i = 0; i < advance; i++) { num_buf[i] = c_toupper(num_buf[i]); } } - int pad_diff = fw - advance; + int pad_diff = flags.fieldw - advance; + char padchar = flags.flg_zeropad ? '0' : ' '; for(int i = 0; i < pad_diff; i++) { - SPRINTF_PUTC(str, size, stri, fp); + SPRINTF_PUTC(str, size, stri, padchar); } + for(int i = 0; i < advance; i++) { SPRINTF_PUTC(str, size, stri, num_buf[i]); } @@ -119,57 +142,104 @@ vsnprintf( int stri = 0; int state = FSTATE_DIRECT; + struct print_flags flags = { 0 }; + flags.lenspec = 4; + for(const char *fmtc = fmt; *fmtc; fmtc++) { if(state == FSTATE_DIRECT) { if(*fmtc == '%') { - state = FSTATE_CONVERT; + state++; continue; } SPRINTF_PUTC(str, size, stri, *fmtc); - }else { - int field_width = 0; - char field_pad = ' '; - - int lenspec = 4; - - int radix = 10; - int unsign = 0; - int caps = 0; - - if(state == FSTATE_CONVERT) { - switch(*fmtc) { - case 's': - stri = s_convert_string(str, size, ap, stri); - break; - case 'b': - stri = s_convert_int(str, size, ap, stri, field_width, field_pad, lenspec, 2, 1, 0); - break; - case 'o': - stri = s_convert_int(str, size, ap, stri, field_width, field_pad, lenspec, 8, 0, 0); - break; - case 'p': - lenspec = sizeof(uintptr_t); - field_width = lenspec * 2; - field_pad = '0'; - case 'X': - caps = 1; - case 'x': - unsign = 1; - stri = s_convert_int(str, size, ap, stri, field_width, field_pad, lenspec, 16, unsign, caps); - break; - case 'u': - unsign = 1; - case 'd': - case 'i': - stri = s_convert_int(str, size, ap, stri, field_width, field_pad, lenspec, 10, unsign, caps); - break; - /*custom formatters for jove.*/ - case 'P': - stri = s_convert_path(str, size, ap, stri); - break; + }else + if(state == FSTATE_FLAG) { + switch(*fmtc) { + case '#': flags.flg_alt = 1; break; + case '0': flags.flg_zeropad = 1; break; + case '-': flags.flg_ladjust = 1; break; + case ' ': flags.flg_signspace = 1; break; + case '+': flags.flg_showsign = 1; break; + default: + state++; + fmtc--; + break; + } + }else + if(state == FSTATE_FIELDWIDTH) { + if(*fmtc > '0' && *fmtc <= '9') { + do { + flags.fieldw *= 10; + flags.fieldw += *fmtc - '0'; + fmtc++; + } while(*fmtc >= '0' && *fmtc <= '9'); + } + fmtc--; + state++; + }else + if(state == FSTATE_PRECISION) { + if(*fmtc == '.') { + fmtc++; + while(*fmtc >= '0' && *fmtc <= '9') { + flags.precision *= 10; + flags.precision += *fmtc - '0'; + fmtc++; } } - state = FSTATE_DIRECT; + fmtc--; + state++; + }else + if(state == FSTATE_LENMOD) { + switch(*fmtc) { + case 'l': + flags.lenmod = + flags.lenmod == 'l' ? 'L' : 'l'; + break; + default: + fmtc--; + state++; + break; + } + }else + if(state == FSTATE_CONVERT) { + switch(*fmtc) { + case 's': + stri = s_convert_string(str, size, ap, stri, flags); + break; + case 'b': + flags.radix = 2; + stri = s_convert_int(str, size, ap, stri, flags); + break; + case 'o': + flags.radix = 8; + stri = s_convert_int(str, size, ap, stri, flags); + break; + case 'p': + flags.lenspec = sizeof(uintptr_t); + flags.fieldw = flags.lenspec * 2; + flags.flg_zeropad = 1; + flags.flg_alt = 1; + case 'X': + flags.flg_alt = 1; + case 'x': + flags.unsign = 1; + flags.radix = 16; + stri = s_convert_int(str, size, ap, stri, flags); + break; + case 'u': + flags.unsign = 1; + case 'd': + case 'i': + flags.radix = 10; + stri = s_convert_int(str, size, ap, stri, flags); + break; + /*custom formatters for jove.*/ + case 'P': + stri = s_convert_path(str, size, ap, stri); + break; + } + flags = (struct print_flags) { 0 }; + state = FSTATE_DIRECT; } } if(str && stri < size) str[stri] = 0; diff --git a/uacpi b/uacpi new file mode 160000 +Subproject f5f6cc29f85dd5db0dd79c47700c8f3ebce18be diff --git a/uacpi.mk b/uacpi.mk new file mode 100644 index 0000000..8e1e90c --- /dev/null +++ b/uacpi.mk @@ -0,0 +1,20 @@ +UACPI_DIR := uacpi + +UACPI_CFILES := $(wildcard $(UACPI_DIR)/source/*.c) +UACPI_OFILES := $(patsubst %.c,%.o,$(UACPI_CFILES)) +UACPI_DFILES := $(patsubst %.c,%.d,$(UACPI_CFILES)) + +UACPI_IDIR := $(UACPI_DIR)/include + +CLEAN_DEPENDS += uacpi_clean + +CFLAGS += -DUACPI_BAREBONES_MODE -DUACPI_FORMATTED_LOGGING -I$(UACPI_IDIR) +DEPFILES += $(UACPI_DFILES) + +.PHONY: uacpi.a +uacpi.a: $(UACPI_OFILES) + ar rcs $@ $^ + +uacpi_clean: + -rm $(UACPI_OFILES) + -rm $(UACPI_DFILES) |
