Added a new irq_control system call

This is currently an empty call. It will be used for registering,
receiving and releasing irqs.
This commit is contained in:
Bahadir Balban
2009-11-23 16:46:51 +02:00
parent b994083e27
commit e0c40ece5d
12 changed files with 26 additions and 30 deletions

View File

@@ -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);

View File

@@ -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__ */

View File

@@ -1,7 +1,7 @@
/*
* Userspace system call interface.
*
* Copyright (C) 2007 Bahadir Balban
* Copyright (C) 2007 - 2009 Bahadir Balban
*/
#include <l4lib/arch/asm.h>
#include <l4lib/arch/utcb.h>
@@ -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.

View File

@@ -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 =

View File

@@ -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) {

View File

@@ -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

View File

@@ -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;

View File

@@ -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);

View File

@@ -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)

View File

@@ -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;

View File

@@ -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);

View File

@@ -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;