From e0c40ece5d3bf2eac2b03a8258013c278003165f Mon Sep 17 00:00:00 2001 From: Bahadir Balban Date: Mon, 23 Nov 2009 16:46:51 +0200 Subject: [PATCH] Added a new irq_control system call This is currently an empty call. It will be used for registering, receiving and releasing irqs. --- conts/libl4/include/l4lib/arch-arm/syscalls.h | 6 +++--- conts/libl4/include/l4lib/tcb.h | 2 +- conts/libl4/src/arm/syscalls.S | 10 +++++----- conts/libl4/src/init.c | 4 ++-- conts/libl4/src/thread.c | 2 +- conts/posix/mm0/include/container.h.in | 2 ++ include/l4/api/kip.h | 7 ++----- include/l4/api/syscall.h | 4 ++-- src/api/SConscript | 2 +- src/api/syscall.c | 5 ----- src/generic/resource.c | 2 +- src/glue/arm/systable.c | 10 ++++++---- 12 files changed, 26 insertions(+), 30 deletions(-) diff --git a/conts/libl4/include/l4lib/arch-arm/syscalls.h b/conts/libl4/include/l4lib/arch-arm/syscalls.h index 2023471..c24c86c 100644 --- a/conts/libl4/include/l4lib/arch-arm/syscalls.h +++ b/conts/libl4/include/l4lib/arch-arm/syscalls.h @@ -58,9 +58,9 @@ typedef int (*__l4_thread_control_t)(unsigned int action, struct task_ids *ids); extern __l4_thread_control_t __l4_thread_control; int l4_thread_control(unsigned int action, struct task_ids *ids); -typedef int (*__l4_space_control_t)(unsigned int action, void *kdata); -extern __l4_space_control_t __l4_space_control; -int l4_space_control(unsigned int action, void *kdata); +typedef int (*__l4_irq_control_t)(unsigned int req, unsigned int flags, l4id_t id); +extern __l4_irq_control_t __l4_irq_control; +int l4_irq_control(unsigned int req, unsigned int flags, l4id_t id); typedef int (*__l4_ipc_control_t)(unsigned int action, l4id_t blocked_sender, u32 blocked_tag); diff --git a/conts/libl4/include/l4lib/tcb.h b/conts/libl4/include/l4lib/tcb.h index 859c992..174b11f 100644 --- a/conts/libl4/include/l4lib/tcb.h +++ b/conts/libl4/include/l4lib/tcb.h @@ -37,7 +37,7 @@ struct l4lib_global_list { struct l4lib_tcb *l4lib_find_task(int tid); struct l4lib_tcb *l4_tcb_alloc_init(struct l4lib_tcb *parent, unsigned int flags); -void l4lib_l4lib_global_add_task(struct l4lib_tcb *task); +void l4lib_global_add_task(struct l4lib_tcb *task); void l4lib_global_remove_task(struct l4lib_tcb *task); #endif /* __LIB_TCB_H__ */ diff --git a/conts/libl4/src/arm/syscalls.S b/conts/libl4/src/arm/syscalls.S index 863e93d..0a4f6e6 100644 --- a/conts/libl4/src/arm/syscalls.S +++ b/conts/libl4/src/arm/syscalls.S @@ -1,7 +1,7 @@ /* * Userspace system call interface. * - * Copyright (C) 2007 Bahadir Balban + * Copyright (C) 2007 - 2009 Bahadir Balban */ #include #include @@ -186,15 +186,15 @@ 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 + * @r0 = operation code, @r1 = operation flags, @r2 = An id (irqnum, or capid) */ -BEGIN_PROC(l4_space_control) +BEGIN_PROC(l4_irq_control) stmfd sp!, {lr} - ldr r12, =__l4_space_control + ldr r12, =__l4_irq_control mov lr, pc ldr pc, [r12] ldmfd sp!, {pc} @ Restore original lr and return. -END_PROC(l4_space_control) +END_PROC(l4_irq_control) /* * Locks/unlocks a userspace mutex. diff --git a/conts/libl4/src/init.c b/conts/libl4/src/init.c index 508c682..0959696 100644 --- a/conts/libl4/src/init.c +++ b/conts/libl4/src/init.c @@ -18,7 +18,7 @@ __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_irq_control_t __l4_irq_control = 0; __l4_exchange_registers_t __l4_exchange_registers = 0; __l4_container_control_t __l4_container_control = 0; __l4_capability_control_t __l4_capability_control = 0; @@ -51,7 +51,7 @@ void __l4_init(void) __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_irq_control= (__l4_irq_control_t)kip->irq_control; __l4_exchange_registers = (__l4_exchange_registers_t)kip->exchange_registers; __l4_capability_control = diff --git a/conts/libl4/src/thread.c b/conts/libl4/src/thread.c index 3c9f5f6..78ee0ba 100644 --- a/conts/libl4/src/thread.c +++ b/conts/libl4/src/thread.c @@ -102,7 +102,7 @@ int l4_thread_create(struct task_ids *ids, unsigned int flags, /* Add child to the global task list */ child->tid = ids->tid; - global_add_task(child); + l4lib_global_add_task(child); /* Start the new thread */ if ((err = l4_thread_control(THREAD_RUN, ids)) < 0) { diff --git a/conts/posix/mm0/include/container.h.in b/conts/posix/mm0/include/container.h.in index 3882b3f..aa5a86f 100644 --- a/conts/posix/mm0/include/container.h.in +++ b/conts/posix/mm0/include/container.h.in @@ -1,6 +1,8 @@ #ifndef __MM0_CONTAINER_H__ #define __MM0_CONTAINER_H__ +#define __PAGERNAME__ "mm0" + #define SHMEM_REGION_START %(shmem_start)s #define SHMEM_REGION_END %(shmem_end)s diff --git a/include/l4/api/kip.h b/include/l4/api/kip.h index 9ff8708..9e0dd0a 100644 --- a/include/l4/api/kip.h +++ b/include/l4/api/kip.h @@ -25,7 +25,7 @@ #define CODEZERO_VERSION 0 -#define CODEZERO_SUBVERSION 1 +#define CODEZERO_SUBVERSION 2 #define KDESC_DATE_SIZE 12 #define KDESC_TIME_SIZE 9 @@ -49,7 +49,7 @@ struct kip { u32 container_control; u32 time; - u32 space_control; + u32 irq_control; u32 thread_control; u32 ipc_control; u32 map; @@ -71,9 +71,6 @@ struct kip { struct kernel_descriptor kdesc; } __attribute__((__packed__)); -#define __PAGERNAME__ "mm0" -#define __VFSNAME__ "fs0" -#define __BLKDEVNAME__ "blkdev0" #if defined (__KERNEL__) extern struct kip kip; diff --git a/include/l4/api/syscall.h b/include/l4/api/syscall.h index 249532a..e3ef53b 100644 --- a/include/l4/api/syscall.h +++ b/include/l4/api/syscall.h @@ -18,7 +18,7 @@ #define sys_exchange_registers_offset 0xC #define sys_schedule_offset 0x10 #define sys_unmap_offset 0x14 -#define sys_space_control_offset 0x18 +#define sys_irq_control_offset 0x18 #define sys_ipc_control_offset 0x1C #define sys_map_offset 0x20 #define sys_getid_offset 0x24 @@ -37,7 +37,7 @@ int sys_thread_control(unsigned int flags, struct task_ids *ids); int sys_exchange_registers(struct exregs_data *exregs, l4id_t tid); int sys_schedule(void); int sys_unmap(unsigned long virtual, unsigned long npages, unsigned int tid); -int sys_space_control(void); +int sys_irq_control(unsigned int req, unsigned int flags, l4id_t id); int sys_ipc_control(void); int sys_map(unsigned long phys, unsigned long virt, unsigned long npages, unsigned int flags, l4id_t tid); diff --git a/src/api/SConscript b/src/api/SConscript index d1426fe..51c0dd8 100644 --- a/src/api/SConscript +++ b/src/api/SConscript @@ -3,7 +3,7 @@ Import('env') Import('symbols') # The set of source files associated with this SConscript file. -src_local = ['kip.c', 'syscall.c', 'thread.c', 'ipc.c', 'map.c', 'mutex.c', 'cap.c', 'exregs.c'] +src_local = ['kip.c', 'syscall.c', 'thread.c', 'ipc.c', 'map.c', 'mutex.c', 'cap.c', 'exregs.c', 'irq.c'] obj = env.Object(src_local) diff --git a/src/api/syscall.c b/src/api/syscall.c index 1ff2769..4d5cb10 100644 --- a/src/api/syscall.c +++ b/src/api/syscall.c @@ -36,11 +36,6 @@ int sys_schedule(void) return 0; } -int sys_space_control(void) -{ - return -ENOSYS; -} - int sys_getid(struct task_ids *ids) { struct ktcb *this = current; diff --git a/src/generic/resource.c b/src/generic/resource.c index d65114d..3d3b5eb 100644 --- a/src/generic/resource.c +++ b/src/generic/resource.c @@ -849,7 +849,7 @@ int process_cap_info(struct cap_info *cap, &kres->virtmem_free, cap->start, cap->end); } else if (cap_type(cap) == CAP_TYPE_MAP_PHYSMEM) { - if (cap_is_devmem(cap)) + if (!cap_is_devmem(cap)) memcap_unmap(&kres->physmem_used, &kres->physmem_free, cap->start, cap->end); diff --git a/src/glue/arm/systable.c b/src/glue/arm/systable.c index 64a17a5..20ce209 100644 --- a/src/glue/arm/systable.c +++ b/src/glue/arm/systable.c @@ -17,7 +17,7 @@ void kip_init_syscalls(void) { - kip.space_control = ARM_SYSCALL_PAGE + sys_space_control_offset; + kip.irq_control = ARM_SYSCALL_PAGE + sys_irq_control_offset; kip.thread_control = ARM_SYSCALL_PAGE + sys_thread_control_offset; kip.ipc_control = ARM_SYSCALL_PAGE + sys_ipc_control_offset; kip.map = ARM_SYSCALL_PAGE + sys_map_offset; @@ -76,9 +76,11 @@ int arch_sys_unmap(syscall_context_t *regs) (unsigned int)regs->r2); } -int arch_sys_space_control(syscall_context_t *regs) +int arch_sys_irq_control(syscall_context_t *regs) { - return sys_space_control(); + return sys_irq_control((unsigned int)regs->r0, + (unsigned int)regs->r1, + (l4id_t)regs->r2); } int arch_sys_ipc_control(syscall_context_t *regs) @@ -133,7 +135,7 @@ void syscall_init() syscall_table[sys_schedule_offset >> 2] = (syscall_fn_t)arch_sys_schedule; syscall_table[sys_getid_offset >> 2] = (syscall_fn_t)arch_sys_getid; syscall_table[sys_unmap_offset >> 2] = (syscall_fn_t)arch_sys_unmap; - syscall_table[sys_space_control_offset >> 2] = (syscall_fn_t)arch_sys_space_control; + syscall_table[sys_irq_control_offset >> 2] = (syscall_fn_t)arch_sys_irq_control; syscall_table[sys_ipc_control_offset >> 2] = (syscall_fn_t)arch_sys_ipc_control; syscall_table[sys_map_offset >> 2] = (syscall_fn_t)arch_sys_map; syscall_table[sys_capability_control_offset >> 2] = (syscall_fn_t)arch_sys_capability_control;