diff options
Diffstat (limited to 'arch/x86_64')
| -rw-r--r-- | arch/x86_64/debug/console.c | 39 | ||||
| -rw-r--r-- | arch/x86_64/hal/paging.c | 18 | ||||
| -rw-r--r-- | arch/x86_64/hal/serial_com.c | 16 | ||||
| -rw-r--r-- | arch/x86_64/hal/serial_com.h | 3 | ||||
| -rw-r--r-- | arch/x86_64/proc/process.c | 2 |
5 files changed, 65 insertions, 13 deletions
diff --git a/arch/x86_64/debug/console.c b/arch/x86_64/debug/console.c new file mode 100644 index 0000000..b73e980 --- /dev/null +++ b/arch/x86_64/debug/console.c @@ -0,0 +1,39 @@ +#ifdef DEBUG_CONSOLE +#include "debug/console.h" +#include "lib/printf.h" +#include "../hal/serial_com.h" + +static char +s_console_getc(void) +{ +#ifdef DEBUG_SERIAL + char c = serial_com_getc(SERIAL_COM1); +#endif + serial_com_putc(SERIAL_COM1, c); + return c; +} + +int +debug_console_readinput(char *buf, size_t len) +{ + serial_com_putc(SERIAL_COM1, '>'); + char readc; + int readw = 0; + while((readc = s_console_getc()) != 0xD) { + if(readw > len) break; + buf[readw++] = readc; + } + buf[readw] = 0; + return readw; +} + +void debug_console_start(void) +{ + char input_buffer[128]; + while(1) { + debug_console_readinput(input_buffer, 128); + debug_console_parsecmd(input_buffer); + } +} + +#endif diff --git a/arch/x86_64/hal/paging.c b/arch/x86_64/hal/paging.c index d5bcee3..35d39e2 100644 --- a/arch/x86_64/hal/paging.c +++ b/arch/x86_64/hal/paging.c @@ -162,6 +162,16 @@ inline bool pagedir_mapping_is_present(virtaddr_t *mapping) return ((page_t*)mapping)->p; } +inline bool pagedir_mapping_is_writeable(virtaddr_t *mapping) +{ + return ((page_t*)mapping)->rw; +} + +inline bool pagedir_mapping_is_executable(virtaddr_t *mapping) +{ + return ((page_t*)mapping)->xd; +} + inline void pagedir_mapping_set_pfn(virtaddr_t *mapping, size_t pfn) { ((page_t*)mapping)->pfn = pfn; @@ -205,7 +215,7 @@ int pagedir_map_frame(page_t *pml4, int pagedir_map_frame_type(page_t *pml4, uintptr_t pptr, uintptr_t vptr, - struct syscall_pagedir_flags flg, int type) + struct pagedir_mapping_flags flg, int type) { uintmax_t real_flg = PAGE_USER | (type << PAGE_SHL_TYPE); if(flg.writeable) { @@ -219,7 +229,7 @@ int pagedir_map_frame_type(page_t *pml4, int pagedir_map_untyped_frame( jove_owned_obj_t *tgt, jove_perm_obj_t *untyped, - uintptr_t vptr, struct syscall_pagedir_flags flg) + uintptr_t vptr, struct pagedir_mapping_flags flg) { page_t *pml4 = obj_deref(tgt); @@ -260,7 +270,7 @@ int pagedir_map_table(page_t *pml4, target_table = &pml2[pml2i]; goto map_table; } - return EHASMAP; + return -EHASMAP; map_table: memset(frame_ident, 0, 0x1000); @@ -288,7 +298,7 @@ int pagedir_map_untyped_table( int pagedir_map_shmem_frame( jove_owned_obj_t *tgt, jove_perm_obj_t *shmem, uint8_t page_offset, - uintptr_t vptr, struct syscall_pagedir_flags flg) + uintptr_t vptr, struct pagedir_mapping_flags flg) { page_t *pml4 = obj_deref(tgt); diff --git a/arch/x86_64/hal/serial_com.c b/arch/x86_64/hal/serial_com.c index c571057..ec39d21 100644 --- a/arch/x86_64/hal/serial_com.c +++ b/arch/x86_64/hal/serial_com.c @@ -10,26 +10,26 @@ serial_com_recv(uint16_t port) return inb(SERIAL_COM_LSR(port)) & 1; } -static char -serial_com_getc(uint16_t port) -{ - while(serial_com_recv(port) == 0); - return inb(port); -} - static int serial_com_put_ready(uint16_t port) { return inb(SERIAL_COM_LSR(port)) & 0x20; } -static void +void serial_com_putc(uint16_t port, char c) { while(serial_com_put_ready(port) == 0); outb(port, c); } +char +serial_com_getc(uint16_t port) +{ + while(serial_com_recv(port) == 0); + return inb(port); +} + int serial_com_init_port( uint16_t port, diff --git a/arch/x86_64/hal/serial_com.h b/arch/x86_64/hal/serial_com.h index cf0badc..3850a7b 100644 --- a/arch/x86_64/hal/serial_com.h +++ b/arch/x86_64/hal/serial_com.h @@ -23,6 +23,9 @@ void serial_com_init(void); +char serial_com_getc(uint16_t port); +void serial_com_putc(uint16_t port, char c); + int serial_com_write(uint16_t port, const char *s, size_t len); #endif diff --git a/arch/x86_64/proc/process.c b/arch/x86_64/proc/process.c index b10d538..638303c 100644 --- a/arch/x86_64/proc/process.c +++ b/arch/x86_64/proc/process.c @@ -17,7 +17,7 @@ PAGEALIGN char _init_pcb_bytes[0x1000] = { 0 }; int _pcb_new_arch(pcb_t *pcb) { - return 0; + return pcb->header.pid; } void |
