diff options
Diffstat (limited to 'nuttx/arch/rgmp/src/rgmp.c')
-rw-r--r-- | nuttx/arch/rgmp/src/rgmp.c | 95 |
1 files changed, 47 insertions, 48 deletions
diff --git a/nuttx/arch/rgmp/src/rgmp.c b/nuttx/arch/rgmp/src/rgmp.c index 40fad1f87..479696fb5 100644 --- a/nuttx/arch/rgmp/src/rgmp.c +++ b/nuttx/arch/rgmp/src/rgmp.c @@ -38,7 +38,7 @@ ****************************************************************************/ #include <rgmp/trap.h> -#include <rgmp/mmu.h> +#include <rgmp/rtos.h> #include <rgmp/arch/arch.h> #include <nuttx/config.h> @@ -56,9 +56,9 @@ int nest_irq = 0; // the default time is 10ms #ifdef CONFIG_MSEC_PER_TICK -unsigned int rtos_tick_time = CONFIG_MSEC_PER_TICK; +const unsigned int rtos_tick_time = CONFIG_MSEC_PER_TICK; #else -unsigned int rtos_tick_time = 10; +const unsigned int rtos_tick_time = 10; #endif void rtos_entry(void) @@ -76,80 +76,71 @@ void rtos_free_page(void *page) free(page); } +void *rtos_kmalloc(int size) +{ + return kmalloc(size); +} + +void rtos_kfree(void *addr) +{ + kfree(addr); +} + /** * The interrupt can be nested. The pair of rtos_enter_interrupt() * and rtos_exit_interrupt() make sure the context switch is * performed only in the last IRQ exit. */ -void rtos_enter_interrupt(struct Trapframe *tf) +void rtos_enter_interrupt(void) { nest_irq++; } -void rtos_exit_interrupt(struct Trapframe *tf) +void rtos_exit_interrupt(void) { local_irq_disable(); nest_irq--; if (!nest_irq) { - _TCB *rtcb = current_task; - _TCB *ntcb; - - if (rtcb->xcp.sigdeliver) { - rtcb->xcp.tf = tf; - push_xcptcontext(&rtcb->xcp); - } - ntcb = (_TCB*)g_readytorun.head; - // switch needed - if (rtcb != ntcb) { - rtcb->xcp.tf = tf; - current_task = ntcb; - rgmp_pop_tf(ntcb->xcp.tf); - } + _TCB *rtcb = current_task; + _TCB *ntcb; + + if (rtcb->xcp.sigdeliver) { + rtcb->xcp.ctx.tf = current_regs; + push_xcptcontext(&rtcb->xcp); + } + ntcb = (_TCB*)g_readytorun.head; + // switch needed + if (rtcb != ntcb) { + rtcb->xcp.ctx.tf = current_regs; + current_task = ntcb; + rgmp_switch_to(&ntcb->xcp.ctx); + } } } -void rtos_timer_isr(struct Trapframe *tf) +void rtos_timer_isr(void *data) { sched_process_timer(); } /** - * RTOS mutex operation - */ -const int rtos_mutex_size = sizeof(sem_t); -void rtos_mutex_init(void *lock) -{ - sem_init(lock, 0, 1); -} - -int rtos_mutex_lock(void *lock) -{ - return sem_wait(lock); -} - -int rtos_mutex_unlock(void *lock) -{ - return sem_post(lock); -} - -/** * RTOS semaphore operation */ -const int rtos_semaphore_size = sizeof(sem_t); - -void rtos_sem_init(void *sem, int val) +int rtos_sem_init(struct semaphore *sem, int val) { - sem_init(sem, 0, val); + if ((sem->sem = kmalloc(sizeof(sem_t))) == NULL) + return -1; + return sem_init(sem->sem, 0, val); } -int rtos_sem_up(void *sem) +int rtos_sem_up(struct semaphore *sem) { - return sem_post(sem); + return sem_post(sem->sem); } -int rtos_sem_down(void *sem) +int rtos_sem_down(struct semaphore *sem) { - return sem_wait(sem); + return sem_wait(sem->sem); } void rtos_stop_running(void) @@ -161,8 +152,16 @@ void rtos_stop_running(void) nuttx_arch_exit(); while(1) { - arch_hlt(); + arch_hlt(); } } +int rtos_vnet_init(struct rgmp_vnet *vnet) +{ + extern int vnet_init(struct rgmp_vnet *vnet); + + return vnet_init(vnet); +} + + |