http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/0ef64aa7/libs/os/src/arch/mips/os_fault.c ---------------------------------------------------------------------- diff --git a/libs/os/src/arch/mips/os_fault.c b/libs/os/src/arch/mips/os_fault.c deleted file mode 100644 index 8d89f54..0000000 --- a/libs/os/src/arch/mips/os_fault.c +++ /dev/null @@ -1,123 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -#include <console/console.h> -#include <hal/hal_system.h> -#ifdef COREDUMP_PRESENT -#include <coredump/coredump.h> -#endif -#include "os/os.h" - -#include <stdint.h> -#include <unistd.h> - -struct exception_frame { - uint32_t r0; - uint32_t r1; - uint32_t r2; - uint32_t r3; - uint32_t r12; - uint32_t lr; - uint32_t pc; - uint32_t psr; -}; - -struct trap_frame { - struct exception_frame *ef; - uint32_t r4; - uint32_t r5; - uint32_t r6; - uint32_t r7; - uint32_t r8; - uint32_t r9; - uint32_t r10; - uint32_t r11; - uint32_t lr; /* this LR holds EXC_RETURN */ -}; - -struct coredump_regs { - uint32_t r0; - uint32_t r1; - uint32_t r2; - uint32_t r3; - uint32_t r4; - uint32_t r5; - uint32_t r6; - uint32_t r7; - uint32_t r8; - uint32_t r9; - uint32_t r10; - uint32_t r11; - uint32_t r12; - uint32_t sp; - uint32_t lr; - uint32_t pc; - uint32_t psr; -}; - -void __assert_func(const char *file, int line, const char *func, const char *e); - -#ifdef COREDUMP_PRESENT -static void -trap_to_coredump(struct trap_frame *tf, struct coredump_regs *regs) -{ -} -#endif - -void -__assert_func(const char *file, int line, const char *func, const char *e) -{ - int sr; - - OS_ENTER_CRITICAL(sr); - (void)sr; - console_blocking_mode(); - console_printf("Assert %s; failed in %s:%d\n", e ? e : "", file, line); - if (system_debugger_connected()) { - /* - * If debugger is attached, breakpoint before the trap. - */ - } - system_reset(); -} - -void -os_default_irq(struct trap_frame *tf) -{ -#ifdef COREDUMP_PRESENT - struct coredump_regs regs; -#endif - - console_blocking_mode(); - console_printf("Unhandled interrupt, exception sp 0x%08lx\n", - (uint32_t)tf->ef); - console_printf(" r0:0x%08lx r1:0x%08lx r2:0x%08lx r3:0x%08lx\n", - tf->ef->r0, tf->ef->r1, tf->ef->r2, tf->ef->r3); - console_printf(" r4:0x%08lx r5:0x%08lx r6:0x%08lx r7:0x%08lx\n", - tf->r4, tf->r5, tf->r6, tf->r7); - console_printf(" r8:0x%08lx r9:0x%08lx r10:0x%08lx r11:0x%08lx\n", - tf->r8, tf->r9, tf->r10, tf->r11); - console_printf("r12:0x%08lx lr:0x%08lx pc:0x%08lx psr:0x%08lx\n", - tf->ef->r12, tf->ef->lr, tf->ef->pc, tf->ef->psr); -#ifdef COREDUMP_PRESENT - trap_to_coredump(tf, ®s); - coredump_dump(®s, sizeof(regs)); -#endif - system_reset(); -}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/0ef64aa7/libs/os/src/arch/sim-mips/os_arch_sim.c ---------------------------------------------------------------------- diff --git a/libs/os/src/arch/sim-mips/os_arch_sim.c b/libs/os/src/arch/sim-mips/os_arch_sim.c deleted file mode 100644 index 9a96737..0000000 --- a/libs/os/src/arch/sim-mips/os_arch_sim.c +++ /dev/null @@ -1,463 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -#include "os/os.h" -#include "os_priv.h" - -#ifdef __APPLE__ -#define _XOPEN_SOURCE -#endif - -#include <string.h> -#include <stdio.h> -#include <unistd.h> -#include <setjmp.h> -#include <signal.h> -#include <sys/time.h> -#include <assert.h> -#include <util/util.h> - -struct stack_frame { - int sf_mainsp; /* stack on which main() is executing */ - sigjmp_buf sf_jb; - struct os_task *sf_task; -}; - -/* - * Assert that 'sf_mainsp' and 'sf_jb' are at the specific offsets where - * os_arch_frame_init() expects them to be. - */ -CTASSERT(offsetof(struct stack_frame, sf_mainsp) == 0); -CTASSERT(offsetof(struct stack_frame, sf_jb) == 8); - -extern void os_arch_frame_init(struct stack_frame *sf); - -#define sim_setjmp(__jb) sigsetjmp(__jb, 0) -#define sim_longjmp(__jb, __ret) siglongjmp(__jb, __ret) - -#define OS_USEC_PER_TICK (1000000 / OS_TICKS_PER_SEC) - -static pid_t mypid; -static sigset_t allsigs, nosigs; -static void timer_handler(int sig); - -static bool suspended; /* process is blocked in sigsuspend() */ -static sigset_t suspsigs; /* signals delivered in sigsuspend() */ - -/* - * Called from 'os_arch_frame_init()' when setjmp returns indirectly via - * longjmp. The return value of setjmp is passed to this function as 'rc'. - */ -void -os_arch_task_start(struct stack_frame *sf, int rc) -{ - struct os_task *task; - - /* - * Interrupts are disabled when a task starts executing. This happens in - * two different ways: - * - via os_arch_os_start() for the first task. - * - via os_sched() for all other tasks. - * - * Enable interrupts before starting the task. - */ - OS_EXIT_CRITICAL(0); - - task = sf->sf_task; - task->t_func(task->t_arg); - - /* This should never return */ - assert(0); -} - -os_stack_t * -os_arch_task_stack_init(struct os_task *t, os_stack_t *stack_top, int size) -{ - struct stack_frame *sf; - - sf = (struct stack_frame *) ((uint8_t *) stack_top - sizeof(*sf)); - sf->sf_task = t; - - os_arch_frame_init(sf); - - return ((os_stack_t *)sf); -} - -void -os_arch_ctx_sw(struct os_task *next_t) -{ - /* - * gdb will stop execution of the program on most signals (e.g. SIGUSR1) - * whereas it passes SIGURG to the process without any special settings. - */ - kill(mypid, SIGURG); -} - -static void -ctxsw_handler(int sig) -{ - struct os_task *t, *next_t; - struct stack_frame *sf; - int rc; - - OS_ASSERT_CRITICAL(); - - /* - * Just record that this handler was called when the process was blocked. - * The handler will be called after sigsuspend() returns in the correct - * order. - */ - if (suspended) { - sigaddset(&suspsigs, sig); - return; - } - - t = os_sched_get_current_task(); - next_t = os_sched_next_task(); - if (t == next_t) { - /* - * Context switch not needed - just return. - */ - return; - } - - if (t) { - sf = (struct stack_frame *) t->t_stackptr; - - rc = sim_setjmp(sf->sf_jb); - if (rc != 0) { - OS_ASSERT_CRITICAL(); - return; - } - } - - os_sched_ctx_sw_hook(next_t); - - os_sched_set_current_task(next_t); - - sf = (struct stack_frame *) next_t->t_stackptr; - sim_longjmp(sf->sf_jb, 1); -} - -/* - * Disable signals and enter a critical section. - * - * Returns 1 if signals were already blocked and 0 otherwise. - */ -os_sr_t -os_arch_save_sr(void) -{ - int error; - sigset_t omask; - - error = sigprocmask(SIG_BLOCK, &allsigs, &omask); - assert(error == 0); - - /* - * If any one of the signals in 'allsigs' is present in 'omask' then - * we are already inside a critical section. - */ - return (sigismember(&omask, SIGALRM)); -} - -void -os_arch_restore_sr(os_sr_t osr) -{ - int error; - - OS_ASSERT_CRITICAL(); - assert(osr == 0 || osr == 1); - - if (osr == 1) { - /* Exiting a nested critical section */ - return; - } - - error = sigprocmask(SIG_UNBLOCK, &allsigs, NULL); - assert(error == 0); -} - -int -os_arch_in_critical(void) -{ - int error; - sigset_t omask; - - error = sigprocmask(SIG_SETMASK, NULL, &omask); - assert(error == 0); - - /* - * If any one of the signals in 'allsigs' is present in 'omask' then - * we are already inside a critical section. - */ - return (sigismember(&omask, SIGALRM)); -} - -static struct { - int num; - void (*handler)(int sig); -} signals[] = { - { SIGALRM, timer_handler }, - { SIGURG, ctxsw_handler }, -}; - -#define NUMSIGS (sizeof(signals)/sizeof(signals[0])) - -void -os_tick_idle(os_time_t ticks) -{ - int i, rc, sig; - struct itimerval it; - void (*handler)(int sig); - - OS_ASSERT_CRITICAL(); - - if (ticks > 0) { - /* - * Enter tickless regime and set the timer to fire after 'ticks' - * worth of time has elapsed. - */ - it.it_value.tv_sec = ticks / OS_TICKS_PER_SEC; - it.it_value.tv_usec = (ticks % OS_TICKS_PER_SEC) * OS_USEC_PER_TICK; - it.it_interval.tv_sec = 0; - it.it_interval.tv_usec = OS_USEC_PER_TICK; - rc = setitimer(ITIMER_REAL, &it, NULL); - assert(rc == 0); - } - - suspended = true; - sigemptyset(&suspsigs); - sigsuspend(&nosigs); /* Wait for a signal to wake us up */ - suspended = false; - - /* - * Call handlers for signals delivered to the process during sigsuspend(). - * The SIGALRM handler is called before any other handlers to ensure that - * OS time is always correct. - */ - if (sigismember(&suspsigs, SIGALRM)) { - timer_handler(SIGALRM); - } - for (i = 0; i < NUMSIGS; i++) { - sig = signals[i].num; - handler = signals[i].handler; - if (sig != SIGALRM && sigismember(&suspsigs, sig)) { - handler(sig); - } - } - - if (ticks > 0) { - /* - * Enable the periodic timer interrupt. - */ - it.it_value.tv_sec = 0; - it.it_value.tv_usec = OS_USEC_PER_TICK; - it.it_interval.tv_sec = 0; - it.it_interval.tv_usec = OS_USEC_PER_TICK; - rc = setitimer(ITIMER_REAL, &it, NULL); - assert(rc == 0); - } -} - -static void -signals_init(void) -{ - int i, error; - struct sigaction sa; - - sigemptyset(&nosigs); - sigemptyset(&allsigs); - for (i = 0; i < NUMSIGS; i++) { - sigaddset(&allsigs, signals[i].num); - } - - for (i = 0; i < NUMSIGS; i++) { - memset(&sa, 0, sizeof sa); - sa.sa_handler = signals[i].handler; - sa.sa_mask = allsigs; - sa.sa_flags = SA_RESTART; - error = sigaction(signals[i].num, &sa, NULL); - assert(error == 0); - } - - /* - * We use SIGALRM as a proxy for 'allsigs' to check if we are inside - * a critical section (for e.g. see os_arch_in_critical()). Make sure - * that SIGALRM is indeed present in 'allsigs'. - */ - assert(sigismember(&allsigs, SIGALRM)); -} - -static void -signals_cleanup(void) -{ - int i, error; - struct sigaction sa; - - for (i = 0; i < NUMSIGS; i++) { - memset(&sa, 0, sizeof sa); - sa.sa_handler = SIG_DFL; - error = sigaction(signals[i].num, &sa, NULL); - assert(error == 0); - } -} - -static void -timer_handler(int sig) -{ - struct timeval time_now, time_diff; - int ticks; - - static struct timeval time_last; - static int time_inited; - - OS_ASSERT_CRITICAL(); - - /* - * Just record that this handler was called when the process was blocked. - * The handler will be called after sigsuspend() returns in the proper - * order. - */ - if (suspended) { - sigaddset(&suspsigs, sig); - return; - } - - if (!time_inited) { - gettimeofday(&time_last, NULL); - time_inited = 1; - } - - gettimeofday(&time_now, NULL); - if (timercmp(&time_now, &time_last, <)) { - /* - * System time going backwards. - */ - time_last = time_now; - } else { - timersub(&time_now, &time_last, &time_diff); - - ticks = time_diff.tv_sec * OS_TICKS_PER_SEC; - ticks += time_diff.tv_usec / OS_USEC_PER_TICK; - - /* - * Update 'time_last' but account for the remainder usecs that did not - * contribute towards whole 'ticks'. - */ - time_diff.tv_sec = 0; - time_diff.tv_usec %= OS_USEC_PER_TICK; - timersub(&time_now, &time_diff, &time_last); - - os_time_advance(ticks); - } -} - -static void -start_timer(void) -{ - struct itimerval it; - int rc; - - memset(&it, 0, sizeof(it)); - it.it_value.tv_sec = 0; - it.it_value.tv_usec = OS_USEC_PER_TICK; - it.it_interval.tv_sec = 0; - it.it_interval.tv_usec = OS_USEC_PER_TICK; - - rc = setitimer(ITIMER_REAL, &it, NULL); - assert(rc == 0); -} - -static void -stop_timer(void) -{ - struct itimerval it; - int rc; - - memset(&it, 0, sizeof(it)); - - rc = setitimer(ITIMER_REAL, &it, NULL); - assert(rc == 0); -} - -os_error_t -os_arch_os_init(void) -{ - mypid = getpid(); - g_current_task = NULL; - - TAILQ_INIT(&g_os_task_list); - TAILQ_INIT(&g_os_run_list); - TAILQ_INIT(&g_os_sleep_list); - - /* - * Setup all interrupt handlers. - * - * This must be done early because task initialization uses critical - * sections which function correctly only when 'allsigs' is initialized. - */ - signals_init(); - - os_init_idle_task(); - os_sanity_task_init(1); - - os_bsp_init(); - - return OS_OK; -} - -os_error_t -os_arch_os_start(void) -{ - struct stack_frame *sf; - struct os_task *t; - os_sr_t sr; - - /* - * Disable interrupts before enabling any interrupt sources. Pending - * interrupts will be recognized when the first task starts executing. - */ - OS_ENTER_CRITICAL(sr); - assert(sr == 0); - - /* Enable the interrupt sources */ - start_timer(); - - t = os_sched_next_task(); - os_sched_set_current_task(t); - - g_os_started = 1; - - sf = (struct stack_frame *) t->t_stackptr; - sim_longjmp(sf->sf_jb, 1); - - return 0; -} - -/** - * Stops the tick timer and clears the "started" flag. This function is only - * implemented for sim. - */ -void -os_arch_os_stop(void) -{ - stop_timer(); - signals_cleanup(); - g_os_started = 0; -} http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/0ef64aa7/libs/os/src/arch/sim-mips/os_arch_stack_frame.s ---------------------------------------------------------------------- diff --git a/libs/os/src/arch/sim-mips/os_arch_stack_frame.s b/libs/os/src/arch/sim-mips/os_arch_stack_frame.s deleted file mode 100644 index e4ef39c..0000000 --- a/libs/os/src/arch/sim-mips/os_arch_stack_frame.s +++ /dev/null @@ -1,65 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -#define sigsetjmp __sigsetjmp - - .text - .p2align 4, 0x90 /* align on 16-byte boundary and fill with NOPs */ - - .globl os_arch_frame_init - .globl _os_arch_frame_init - /* - * void os_arch_frame_init(struct stack_frame *sf) - */ - -os_arch_frame_init: - /* ABI stack frame */ - addi $sp, $sp, -24 /* 8 bytes for register save, 16 for args */ - sw $ra, 0x20($sp) /* push ra to stack */ - sw $s0, 0x16($sp) /* push s0 to the stack */ - - /* save and update sp to sf */ - move $s0, $a0 /* move sf to s0 */ - sw $sp, 0x0($s0) /* sf->mainsp = stack pointer */ - /* fairly sure sf will be 8 byte alligned anyway, but no harm in and vs move */ - and $sp, $s0, 0xfffffff1 /* stack pointer = sf 8 byte aligned */ - - /* call setjmp */ - addi $a0, $s0, 0x08 /* populate the arguments for sigsetjmp */ - move $a1, $zero - jal sigsetjmp /* sigsetjmp(sf->sf_jb, 0) */ - nop - - /* branch if starting task */ - bne $v0, $zero, os_arch_frame_init_start - nop - - /* back to main stack and return */ - lw $sp, 0x0($s0) /* back to main stack */ - lw $ra, 0x20($sp) /* pop ra from stack */ - lw $s0, 0x16($sp) /* pop s0 from the stack */ - addi $sp, $sp, 24 - jr $ra /* return */ - nop - -os_arch_frame_init_start: - move $a0, $s0 /* populate arguments for task */ - move $a1, $v0 - j os_arch_task_start /* jump to task, never to return */ - nop http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/0ef64aa7/libs/os/src/arch/sim-mips/os_fault.c ---------------------------------------------------------------------- diff --git a/libs/os/src/arch/sim-mips/os_fault.c b/libs/os/src/arch/sim-mips/os_fault.c deleted file mode 100644 index 15c40fe..0000000 --- a/libs/os/src/arch/sim-mips/os_fault.c +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -#include "os/os.h" -#include "os_priv.h" - -void -__assert_func(const char *file, int line, const char *func, const char *e) -{ - char msg[256]; - - snprintf(msg, sizeof(msg), "assert at %s:%d\n", file, line); - write(1, msg, strlen(msg)); - _exit(1); -}