Initial commit

This commit is contained in:
Bahadir Balban
2008-01-13 13:53:52 +00:00
commit e2b791a3d8
789 changed files with 95825 additions and 0 deletions

View File

@@ -0,0 +1,157 @@
/*
* Userspace system call interface.
*
* Copyright (C) 2007 Bahadir Balban
*/
#include <l4lib/arch/asm.h>
#include <l4lib/arch/vregs.h>
#include <l4/generic/space.h>
.macro utcb_address rx
mov \rx, #L4_KIP_ADDRESS
add \rx, \rx, #UTCB_KIP_OFFSET
ldr \rx, [\rx]
.endm
BEGIN_PROC(l4_thread_switch)
ldr r12, =__l4_thread_switch
ldr pc, [r12] @ Jump into the SWI. Kernel returns to LR_USR, which is the caller.
END_PROC(l4_thread_switch)
/*
* The syscall returns process ids. This function saves the returned values in the
* arguments passed by reference. @r0 = struct task_ids *
*/
BEGIN_PROC(l4_getid)
ldr r12, =__l4_getid @ See l4_kdata_read for why its so simple.
ldr pc, [r12] @ Return.
END_PROC(l4_getid)
/*
* Reads data from the kernel into given buffer. Data is defined by request descriptor.
* @r0 = request descriptor, @r1 = buffer address.
*/
BEGIN_PROC(l4_kread)
ldr r12, =__l4_kread
ldr pc, [r12] @ Jump into the SWI
/*
* The LR_USR points at the return address of this function. The system
* call return path directly jumps to LR_USR so we don't even need a
* return instruction here.
*/
END_PROC(l4_kread)
/*
* Inter-process communication. Loads message registers as arguments before the call,
* and stores them as results after the call. @r0 = to, @r1 = from, @r2 = tag.
*/
BEGIN_PROC(l4_ipc)
stmfd sp!, {r4-r8,lr} @ Save context.
utcb_address r12 @ Get utcb address.
ldmib r12!, {r3-r8} @ Load 5 Message registers from utcb. MR1-MR5
ldr r12, =__l4_ipc
mov lr, pc
ldr pc, [r12]
utcb_address r12 @ Get utcb address.
stmia r12, {r3-r8} @ Store 6 Message registers to utcb. MR0-MR5
ldmfd sp!, {r4-r8,pc} @ Return restoring pc, and context.
END_PROC(l4_ipc)
/*
* System call that maps an area of memory into the given address space.
* @r0 = physical address, @r1 = virtual address, @r2 = map size in pages,
* @r3 = map flags, @r4 = The tgid of the address space to map.
*/
BEGIN_PROC(l4_map)
stmfd sp!, {r4, lr}
ldr r4, [sp, #8] @ FIXME: Is this right?
ldr r12, =__l4_map
mov lr, pc @ We must return here to restore r4.
ldr pc, [r12]
ldmfd sp!, {r4, pc}
END_PROC(l4_map)
/*
* System call that unmaps an area of memory into the given address space.
* @r0 = virtual, @r1 = pages, @r2 = tid of address space to unmap
*/
BEGIN_PROC(l4_unmap)
stmfd sp!, {lr}
ldr r12, =__l4_unmap
mov lr, pc
ldr pc, [r12]
ldmfd sp!, {pc} @ Restore original lr and return.
END_PROC(l4_unmap)
/*
* System call that grants a set of pages to the kernel.
* @r0 = physical pfn, @r1 = number of pages
*/
BEGIN_PROC(l4_kmem_grant)
stmfd sp!, {lr}
ldr r12, =__l4_kmem_grant
mov lr, pc
ldr pc, [r12]
ldmfd sp!, {pc} @ Restore original lr and return.
END_PROC(l4_kmem_grant)
/*
* System call that reclaims a set of pages from the kernel.
* @r0 = ptr to physical pfn, @r1 = ptr to number of pages
*/
BEGIN_PROC(l4_kmem_reclaim)
stmfd sp!, {lr}
ldr r12, =__l4_kmem_reclaim
mov lr, pc
ldr pc, [r12]
ldmfd sp!, {pc} @ Restore original lr and return.
END_PROC(l4_kmem_reclaim)
/*
* System call that controls thread creation, destruction and modification.
* @r0 = thread action, @r1 = &ids
*/
BEGIN_PROC(l4_thread_control)
stmfd sp!, {lr}
ldr r12, =__l4_thread_control
mov lr, pc
ldr pc, [r12]
ldmfd sp!, {pc} @ Restore original lr and return.
END_PROC(l4_thread_control)
/*
* System call that modifies ipc blocked sender lists of receivers.
* @r0 = Action (e.g. block/unblock), @r1 = sender id, @r2 = sender tag
*/
BEGIN_PROC(l4_ipc_control)
stmfd sp!, {lr}
ldr r12, =__l4_ipc_control
mov lr, pc
ldr pc, [r12]
ldmfd sp!, {pc} @ Restore original lr and return.
END_PROC(l4_ipc_control)
/*
* Manipulates address spaces, e.g. sets up shared memory areas between threads
* @r0 = operation code, @r1 = struct shm_kdata *kdata
*/
BEGIN_PROC(l4_space_control)
stmfd sp!, {lr}
ldr r12, =__l4_space_control
mov lr, pc
ldr pc, [r12]
ldmfd sp!, {pc} @ Restore original lr and return.
END_PROC(l4_space_control)
/*
* Sets registers of a thread and its pager.
* @r0 = pc to set, @r1 = sp to set @r2 = pager id, @r3 = tid of thread.
*/
BEGIN_PROC(l4_exchange_registers)
stmfd sp!, {lr}
ldr r12, =__l4_exchange_registers
mov lr, pc
ldr pc, [r12]
ldmfd sp!, {pc} @ Restore original lr and return.
END_PROC(l4_exchange_registers)

40
tasks/libl4/src/init.c Normal file
View File

@@ -0,0 +1,40 @@
/*
* Initialise system call offsets.
*
* Copyright (C) 2007 Bahadir Balban
*/
#include <l4lib/kip.h>
__l4_ipc_t __l4_ipc = 0;
__l4_map_t __l4_map = 0;
__l4_unmap_t __l4_unmap = 0;
__l4_kread_t __l4_kread = 0;
__l4_getid_t __l4_getid = 0;
__l4_thread_switch_t __l4_thread_switch = 0;
__l4_thread_control_t __l4_thread_control = 0;
__l4_ipc_control_t __l4_ipc_control = 0;
__l4_space_control_t __l4_space_control = 0;
__l4_exchange_registers_t __l4_exchange_registers = 0;
__l4_kmem_grant_t __l4_kmem_grant = 0;
__l4_kmem_reclaim_t __l4_kmem_reclaim = 0;
struct kip *kip;
void __l4_init(void)
{
kip = l4_kernel_interface(0, 0, 0);
__l4_ipc = (__l4_ipc_t)kip->ipc;
__l4_map = (__l4_map_t)kip->map;
__l4_unmap = (__l4_unmap_t)kip->unmap;
__l4_kread = (__l4_kread_t)kip->kread;
__l4_getid = (__l4_getid_t)kip->getid;
__l4_thread_switch =(__l4_thread_switch_t)kip->thread_switch;
__l4_thread_control=(__l4_thread_control_t)kip->thread_control;
__l4_ipc_control= (__l4_ipc_control_t)kip->ipc_control;
__l4_space_control=(__l4_space_control_t)kip->space_control;
__l4_exchange_registers =(__l4_exchange_registers_t)kip->exchange_registers;
__l4_kmem_grant =(__l4_kmem_grant_t)kip->kmem_grant;
__l4_kmem_reclaim =(__l4_kmem_reclaim_t)kip->kmem_reclaim;
}