POK(kernelpart)
|
Handle address spaces. More...
#include <types.h>
#include <errno.h>
#include <libc.h>
#include <bsp.h>
#include <arch.h>
#include <arch/x86/interrupt.h>
#include "gdt.h"
#include "tss.h"
#include "space.h"
Go to the source code of this file.
Defines | |
#define | KERNEL_STACK_SIZE 8192 |
Functions | |
pok_ret_t | pok_create_space (uint8_t partition_id, uint32_t addr, uint32_t size) |
pok_ret_t | pok_space_switch (uint8_t old_partition_id, uint8_t new_partition_id) |
uint32_t | pok_space_base_vaddr (uint32_t addr) |
uint32_t | pok_space_context_create (uint8_t partition_id, uint32_t entry_rel, uint32_t stack_rel, uint32_t arg1, uint32_t arg2) |
void | pok_dispatch_space (uint8_t partition_id, uint32_t user_pc, uint32_t user_sp, uint32_t kernel_sp, uint32_t arg1, uint32_t arg2) |
Handle address spaces.
Definition in file space.c.
#define KERNEL_STACK_SIZE 8192 |
pok_ret_t pok_create_space | ( | uint8_t | partition_id, |
uint32_t | addr, | ||
uint32_t | size | ||
) |
Set ptd and pte for the given partition.
Definition at line 40 of file space.c.
{ gdt_set_segment (GDT_PARTITION_CODE_SEGMENT (partition_id), addr, size, GDTE_CODE, 3); gdt_set_segment (GDT_PARTITION_DATA_SEGMENT (partition_id), addr, size, GDTE_DATA, 3); return (POK_ERRNO_OK); }
void pok_dispatch_space | ( | uint8_t | partition_id, |
uint32_t | user_pc, | ||
uint32_t | user_sp, | ||
uint32_t | kernel_sp, | ||
uint32_t | arg1, | ||
uint32_t | arg2 | ||
) |
Definition at line 114 of file space.c.
{ interrupt_frame ctx; uint32_t code_sel; uint32_t data_sel; uint32_t sp; code_sel = GDT_BUILD_SELECTOR (GDT_PARTITION_CODE_SEGMENT (partition_id), 0, 3); data_sel = GDT_BUILD_SELECTOR (GDT_PARTITION_DATA_SEGMENT (partition_id), 0, 3); sp = (uint32_t) &ctx; memset (&ctx, 0, sizeof (interrupt_frame)); pok_arch_preempt_disable (); ctx.es = ctx.ds = ctx.ss = data_sel; ctx.__esp = (uint32_t) (&ctx.error); /* for pusha */ ctx.eip = user_pc; ctx.eax = arg1; ctx.ebx = arg2; ctx.cs = code_sel; ctx.eflags = 1 << 9; ctx.esp = user_sp; tss_set_esp0 (kernel_sp); asm ("mov %0, %%esp \n" "pop %%es \n" "pop %%ds \n" "popa \n" "addl $4, %%esp \n" "iret \n" : : "m" (sp) ); }
uint32_t pok_space_base_vaddr | ( | uint32_t | addr | ) |
Definition at line 64 of file space.c.
{
(void) addr;
return (0);
}
uint32_t pok_space_context_create | ( | uint8_t | partition_id, |
uint32_t | entry_rel, | ||
uint32_t | stack_rel, | ||
uint32_t | arg1, | ||
uint32_t | arg2 | ||
) |
Create a new context in the given space
Initilize thread stack.
Definition at line 70 of file space.c.
{ char* stack_addr; space_context_t* sp; stack_addr = pok_bsp_mem_alloc (KERNEL_STACK_SIZE); sp = (space_context_t *) (stack_addr + KERNEL_STACK_SIZE - 4 - sizeof (space_context_t)); memset (sp, 0, sizeof (space_context_t)); sp->ctx.__esp = (uint32_t)(&sp->ctx.eip); /* for pusha */ sp->ctx.eip = (uint32_t)pok_dispatch_space; sp->ctx.cs = GDT_CORE_CODE_SEGMENT << 3; sp->ctx.eflags = 1 << 9; sp->arg1 = arg1; sp->arg2 = arg2; sp->kernel_sp = (uint32_t)sp; sp->user_sp = stack_rel; sp->user_pc = entry_rel; sp->partition_id = partition_id; return ((uint32_t) sp); }
pok_ret_t pok_space_switch | ( | uint8_t | old_partition_id, |
uint8_t | new_partition_id | ||
) |
Switch from one space to another
Switch adress space in MMU (context register).
Definition at line 53 of file space.c.
{ gdt_disable (GDT_PARTITION_CODE_SEGMENT(old_partition_id)); gdt_disable (GDT_PARTITION_DATA_SEGMENT(old_partition_id)); gdt_enable (GDT_PARTITION_CODE_SEGMENT(new_partition_id)); gdt_enable (GDT_PARTITION_DATA_SEGMENT(new_partition_id)); return (POK_ERRNO_OK); }