summaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
Diffstat (limited to 'arch')
-rw-r--r--arch/x86_64/debug/console.c39
-rw-r--r--arch/x86_64/hal/paging.c18
-rw-r--r--arch/x86_64/hal/serial_com.c16
-rw-r--r--arch/x86_64/hal/serial_com.h3
-rw-r--r--arch/x86_64/proc/process.c2
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