1*10465441SEvalZero /*
2*10465441SEvalZero * File : cpuport.c
3*10465441SEvalZero * This file is part of RT-Thread RTOS
4*10465441SEvalZero * COPYRIGHT (C) 2012, RT-Thread Development Team
5*10465441SEvalZero *
6*10465441SEvalZero * The license and distribution terms for this file may be
7*10465441SEvalZero * found in the file LICENSE in this distribution or at
8*10465441SEvalZero * http://www.rt-thread.org/license/LICENSE
9*10465441SEvalZero *
10*10465441SEvalZero * Change Logs:
11*10465441SEvalZero * Date Author Notes
12*10465441SEvalZero * 2012-02-13 mojingxian first version
13*10465441SEvalZero */
14*10465441SEvalZero
15*10465441SEvalZero #include <rtthread.h>
16*10465441SEvalZero
17*10465441SEvalZero /* flag in interrupt handling */
18*10465441SEvalZero rt_uint32_t rt_interrupt_from_thread;
19*10465441SEvalZero rt_uint32_t rt_interrupt_to_thread;
20*10465441SEvalZero rt_uint32_t rt_thread_switch_interrupt_flag;
21*10465441SEvalZero
22*10465441SEvalZero /**
23*10465441SEvalZero * initializes stack of thread
24*10465441SEvalZero */
rt_hw_stack_init(void * tentry,void * parameter,rt_uint8_t * stack_addr,void * texit)25*10465441SEvalZero rt_uint8_t *rt_hw_stack_init(void *tentry, void *parameter,
26*10465441SEvalZero rt_uint8_t *stack_addr, void *texit)
27*10465441SEvalZero {
28*10465441SEvalZero unsigned char i;
29*10465441SEvalZero unsigned long *stk;
30*10465441SEvalZero
31*10465441SEvalZero stk = (unsigned long *)stack_addr; /* Load stack pointer */
32*10465441SEvalZero
33*10465441SEvalZero /* Simulate a function call to the task with an argument */
34*10465441SEvalZero stk -= 3; /* 3 words assigned for incoming args (R0, R1, R2) */
35*10465441SEvalZero
36*10465441SEvalZero /* Now simulating vectoring to an ISR */
37*10465441SEvalZero *--stk = (unsigned long)parameter; /* R0 value - caller's incoming argument #1 */
38*10465441SEvalZero *--stk = (unsigned long)0; /* P1 value - value irrelevant */
39*10465441SEvalZero
40*10465441SEvalZero *--stk = (unsigned long)texit; /* RETS value - NO task should return with RTS. */
41*10465441SEvalZero /* however OS_CPU_Invalid_Task_Return is a safety */
42*10465441SEvalZero /* catch-allfor tasks that return with an RTS */
43*10465441SEvalZero
44*10465441SEvalZero *--stk = (unsigned long)parameter; /* R1 value - caller's incoming argument #2 */
45*10465441SEvalZero /* (not relevant in current test example) */
46*10465441SEvalZero *--stk = (unsigned long)parameter; /* R2 value - caller's incoming argument #3 */
47*10465441SEvalZero /* (not relevant in current test example) */
48*10465441SEvalZero *--stk = (unsigned long)0; /* P0 value - value irrelevant */
49*10465441SEvalZero *--stk = (unsigned long)0; /* P2 value - value irrelevant */
50*10465441SEvalZero *--stk = (unsigned long)0; /* ASTAT value - caller's ASTAT value - value */
51*10465441SEvalZero /* irrelevant */
52*10465441SEvalZero
53*10465441SEvalZero *--stk = (unsigned long)tentry; /* RETI value- pushing the start address of the task */
54*10465441SEvalZero
55*10465441SEvalZero for (i = 0; i < 35; i++) /* remaining reg values - R7:3, P5:3, */
56*10465441SEvalZero { /* 4 words of A1:0(.W,.X), LT0, LT1, */
57*10465441SEvalZero *--stk = (unsigned long)0; /* LC0, LC1, LB0, LB1,I3:0, M3:0, L3:0, B3:0, */
58*10465441SEvalZero } /* All values irrelevant */
59*10465441SEvalZero
60*10465441SEvalZero return (rt_uint8_t *)stk; /* Return top-of-stack */
61*10465441SEvalZero }
62*10465441SEvalZero
rt_hw_context_switch(rt_uint32_t from,rt_uint32_t to)63*10465441SEvalZero void rt_hw_context_switch(rt_uint32_t from, rt_uint32_t to)
64*10465441SEvalZero {
65*10465441SEvalZero if (rt_thread_switch_interrupt_flag != 1)
66*10465441SEvalZero {
67*10465441SEvalZero rt_thread_switch_interrupt_flag = 1;
68*10465441SEvalZero rt_interrupt_from_thread = from;
69*10465441SEvalZero }
70*10465441SEvalZero
71*10465441SEvalZero rt_interrupt_to_thread = to;
72*10465441SEvalZero asm("raise 14;"); // Raise Interrupt 14 (trap)
73*10465441SEvalZero }
74*10465441SEvalZero
rt_hw_context_switch_interrupt(rt_uint32_t from,rt_uint32_t to)75*10465441SEvalZero void rt_hw_context_switch_interrupt(rt_uint32_t from, rt_uint32_t to)
76*10465441SEvalZero {
77*10465441SEvalZero if (rt_thread_switch_interrupt_flag != 1)
78*10465441SEvalZero {
79*10465441SEvalZero rt_thread_switch_interrupt_flag = 1;
80*10465441SEvalZero rt_interrupt_from_thread = from;
81*10465441SEvalZero }
82*10465441SEvalZero
83*10465441SEvalZero rt_interrupt_to_thread = to;
84*10465441SEvalZero asm("raise 14;"); // Raise Interrupt 14 (trap)
85*10465441SEvalZero }
86*10465441SEvalZero
rt_hw_context_switch_to(rt_uint32_t to)87*10465441SEvalZero void rt_hw_context_switch_to(rt_uint32_t to)
88*10465441SEvalZero {
89*10465441SEvalZero rt_thread_switch_interrupt_flag = 1;
90*10465441SEvalZero rt_interrupt_from_thread = 0;
91*10465441SEvalZero rt_interrupt_to_thread = to;
92*10465441SEvalZero asm("raise 14;"); // Raise Interrupt 14 (trap)
93*10465441SEvalZero }
94