summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--Makefile21
-rw-r--r--arch/x86_64/hal/msr.c15
-rw-r--r--arch/x86_64/hal/msr.h2
-rw-r--r--arch/x86_64/hal/process.c2
-rw-r--r--arch/x86_64/hal/uacpi.c15
-rw-r--r--arch/x86_64/main.c7
-rw-r--r--boot/limine/memorymap.c2
-rw-r--r--boot/limine/start.c9
-rw-r--r--boot/limine/uacpi.c10
-rw-r--r--config.mk4
-rw-r--r--hal/uacpi.c13
-rw-r--r--lib/printf.c174
m---------uacpi0
-rw-r--r--uacpi.mk20
15 files changed, 230 insertions, 65 deletions
diff --git a/.gitignore b/.gitignore
index 6872380..b5cb1ee 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
*.elf
*.o
*.d
+*.a
.cache
diff --git a/Makefile b/Makefile
index a584ec9..33af30f 100644
--- a/Makefile
+++ b/Makefile
@@ -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;
+}
diff --git a/config.mk b/config.mk
index 16e3859..760d264 100644
--- a/config.mk
+++ b/config.mk
@@ -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)