diff options
Diffstat (limited to 'arch/x86_64/proc/process.c')
| -rw-r--r-- | arch/x86_64/proc/process.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/arch/x86_64/proc/process.c b/arch/x86_64/proc/process.c index 5935303..b10d538 100644 --- a/arch/x86_64/proc/process.c +++ b/arch/x86_64/proc/process.c @@ -40,3 +40,44 @@ processing_setup(void (*process_main)) scheduler_init(init_pcb_obj, process_main); } + +inline physaddr_t +pcb_get_syscall_stack(pcb_t *pcb) +{ + return pcb->syscall_page.pfn << 12; +} + +inline physaddr_t +pcb_get_interrupt_stack(pcb_t *pcb) +{ + return pcb->interrupt_page.pfn << 12; +} + +physaddr_t +pcb_set_syscall_stack(pcb_t *pcb, physaddr_t page) +{ + physaddr_t old_page = pcb_get_syscall_stack(pcb); + pcb->syscall_page.pfn = page >> 12; + pcb->syscall_page.p = 1; + pcb->syscall_page.rw = 1; + return old_page; +} +physaddr_t +pcb_set_interrupt_stack(pcb_t *pcb, physaddr_t page) +{ + physaddr_t old_page = pcb_get_interrupt_stack(pcb); + pcb->interrupt_page.pfn = page >> 12; + pcb->interrupt_page.p = 1; + pcb->interrupt_page.rw = 1; + return old_page; +} + +inline void pcb_map_syscall_stack(pcb_t *pcb) +{ + *__syscall_stack_mapping = pcb->syscall_page.value; +} + +inline void pcb_map_interrupt_stack(pcb_t *pcb) +{ + *__interrupt_stack_mapping = pcb->interrupt_page.value; +} |
