summaryrefslogtreecommitdiff
path: root/nuttx/arch/rgmp/src/rgmp.c
diff options
context:
space:
mode:
Diffstat (limited to 'nuttx/arch/rgmp/src/rgmp.c')
-rw-r--r--nuttx/arch/rgmp/src/rgmp.c95
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);
+}
+
+