原始版本
This commit is contained in:
15
RT_Thread/libcpu/nios/SConscript
Normal file
15
RT_Thread/libcpu/nios/SConscript
Normal file
@ -0,0 +1,15 @@
|
||||
# RT-Thread building script for bridge
|
||||
|
||||
import os
|
||||
from building import *
|
||||
|
||||
Import('rtconfig')
|
||||
|
||||
cwd = GetCurrentDir()
|
||||
group = []
|
||||
list = os.listdir(cwd)
|
||||
|
||||
# cpu porting code files
|
||||
group = group + SConscript(os.path.join(rtconfig.CPU, 'SConscript'))
|
||||
|
||||
Return('group')
|
||||
13
RT_Thread/libcpu/nios/nios_ii/SConscript
Normal file
13
RT_Thread/libcpu/nios/nios_ii/SConscript
Normal file
@ -0,0 +1,13 @@
|
||||
# RT-Thread building script for component
|
||||
|
||||
from building import *
|
||||
|
||||
Import('rtconfig')
|
||||
|
||||
cwd = GetCurrentDir()
|
||||
src = Glob('*.c') + Glob('*.cpp') + Glob('*_gcc.S')
|
||||
CPPPATH = [cwd]
|
||||
|
||||
group = DefineGroup('libcpu', src, depend = [''], CPPPATH = CPPPATH)
|
||||
|
||||
Return('group')
|
||||
276
RT_Thread/libcpu/nios/nios_ii/context_gcc.S
Normal file
276
RT_Thread/libcpu/nios/nios_ii/context_gcc.S
Normal file
@ -0,0 +1,276 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2022, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2011-02-14 aozima first implementation for Nios II
|
||||
* 2011-02-20 aozima fix context&switch bug
|
||||
*/
|
||||
|
||||
/**
|
||||
* @addtogroup NIOS_II
|
||||
*/
|
||||
/*@{*/
|
||||
|
||||
.text
|
||||
|
||||
.set noat
|
||||
|
||||
/*
|
||||
* rt_base_t rt_hw_interrupt_disable();
|
||||
*/
|
||||
.global rt_hw_interrupt_disable
|
||||
.type rt_hw_interrupt_disable, %function
|
||||
rt_hw_interrupt_disable:
|
||||
rdctl r2, status /* return status */
|
||||
wrctl status, zero /* disable interrupt */
|
||||
ret
|
||||
|
||||
/*
|
||||
* void rt_hw_interrupt_enable(rt_base_t level);
|
||||
*/
|
||||
.global rt_hw_interrupt_enable
|
||||
.type rt_hw_interrupt_enable, %function
|
||||
rt_hw_interrupt_enable:
|
||||
wrctl status, r4 /* enable interrupt by argument */
|
||||
ret
|
||||
|
||||
/* void rt_hw_context_switch_interrupt_do(void) */
|
||||
.global rt_hw_context_switch_interrupt_do
|
||||
.type rt_hw_context_switch_interrupt_do, %function
|
||||
rt_hw_context_switch_interrupt_do:
|
||||
/* save from thread */
|
||||
addi sp,sp,-72
|
||||
|
||||
/* frist save r2,so that save status */
|
||||
stw r2, 4(sp)
|
||||
|
||||
/* save status */
|
||||
/* when the interrupt happen,the interrupt is enable */
|
||||
movi r2, 1
|
||||
stw r2, 68(sp) /* status */
|
||||
|
||||
stw r3, 8(sp)
|
||||
stw r4, 12(sp)
|
||||
|
||||
/* get & save from thread pc */
|
||||
ldw r4,%gprel(rt_current_thread_entry)(gp)
|
||||
stw r4, 0(sp) /* thread pc */
|
||||
|
||||
stw r5, 16(sp)
|
||||
stw r6, 20(sp)
|
||||
stw r7, 24(sp)
|
||||
|
||||
stw r16, 28(sp)
|
||||
stw r17, 32(sp)
|
||||
stw r18, 36(sp)
|
||||
stw r19, 40(sp)
|
||||
stw r20, 44(sp)
|
||||
stw r21, 48(sp)
|
||||
stw r22, 52(sp)
|
||||
stw r23, 56(sp)
|
||||
|
||||
stw fp, 60(sp)
|
||||
stw ra, 64(sp)
|
||||
|
||||
/* save from thread sp */
|
||||
/* rt_interrupt_from_thread = &from_thread->sp */
|
||||
ldw r4, %gprel(rt_interrupt_from_thread)(gp)
|
||||
/* *r4(from_thread->sp) = sp */
|
||||
stw sp, (r4)
|
||||
|
||||
/* clear rt_thread_switch_interrupt_flag */
|
||||
/* rt_thread_switch_interrupt_flag = 0 */
|
||||
stw zero,%gprel(rt_thread_switch_interrupt_flag)(gp)
|
||||
|
||||
/* load to thread sp */
|
||||
/* r4 = rt_interrupt_to_thread(&to_thread->sp) */
|
||||
ldw r4, %gprel(rt_interrupt_to_thread)(gp)
|
||||
/* sp = to_thread->sp */
|
||||
ldw sp, (r4)
|
||||
|
||||
ldw r2, 68(sp) /* status */
|
||||
wrctl estatus, r2
|
||||
|
||||
ldw ea, 0(sp) /* thread pc */
|
||||
ldw r2, 4(sp)
|
||||
ldw r3, 8(sp)
|
||||
ldw r4, 12(sp)
|
||||
ldw r5, 16(sp)
|
||||
ldw r6, 20(sp)
|
||||
ldw r7, 24(sp)
|
||||
|
||||
ldw r16, 28(sp)
|
||||
ldw r17, 32(sp)
|
||||
ldw r18, 36(sp)
|
||||
ldw r19, 40(sp)
|
||||
ldw r20, 44(sp)
|
||||
ldw r21, 48(sp)
|
||||
ldw r22, 52(sp)
|
||||
ldw r23, 56(sp)
|
||||
|
||||
ldw fp, 60(sp)
|
||||
ldw ra, 64(sp)
|
||||
|
||||
addi sp, sp, 72
|
||||
|
||||
/* estatus --> status,ea --> pc */
|
||||
eret
|
||||
|
||||
/*
|
||||
* void rt_hw_context_switch(rt_uint32 from, rt_uint32 to);
|
||||
* r4: from
|
||||
* r5: to
|
||||
*/
|
||||
.global rt_hw_context_switch
|
||||
.type rt_hw_context_switch, %function
|
||||
rt_hw_context_switch:
|
||||
/* save from thread */
|
||||
addi sp,sp,-72
|
||||
|
||||
/* frist save r2,so that save status */
|
||||
stw r2, 4(sp)
|
||||
|
||||
/* save status */
|
||||
rdctl r2, status
|
||||
stw r2, 68(sp) /* status */
|
||||
|
||||
stw ra, 0(sp) /* return from rt_hw_context_switch */
|
||||
stw r3, 8(sp)
|
||||
stw r4, 12(sp)
|
||||
stw r5, 16(sp)
|
||||
stw r6, 20(sp)
|
||||
stw r7, 24(sp)
|
||||
|
||||
stw r16, 28(sp)
|
||||
stw r17, 32(sp)
|
||||
stw r18, 36(sp)
|
||||
stw r19, 40(sp)
|
||||
stw r20, 44(sp)
|
||||
stw r21, 48(sp)
|
||||
stw r22, 52(sp)
|
||||
stw r23, 56(sp)
|
||||
|
||||
stw fp, 60(sp)
|
||||
stw ra, 64(sp)
|
||||
|
||||
/* save form thread sp */
|
||||
/* from_thread->sp(r4) = sp */
|
||||
stw sp, (r4)
|
||||
|
||||
/* update rt_interrupt_from_thread */
|
||||
/* rt_interrupt_from_thread = r4(from_thread->sp) */
|
||||
stw r4,%gprel(rt_interrupt_from_thread)(gp)
|
||||
|
||||
/* update rt_interrupt_to_thread */
|
||||
/* rt_interrupt_to_thread = r5 */
|
||||
stw r5,%gprel(rt_interrupt_to_thread)(gp)
|
||||
|
||||
/* get to thread sp */
|
||||
/* sp = rt_interrupt_to_thread(r5:to_thread->sp) */
|
||||
ldw sp, (r5)
|
||||
|
||||
ldw r2, 68(sp) /* status */
|
||||
wrctl estatus, r2
|
||||
|
||||
ldw ea, 0(sp) /* thread pc */
|
||||
|
||||
ldw r2, 4(sp)
|
||||
ldw r3, 8(sp)
|
||||
ldw r4, 12(sp)
|
||||
ldw r5, 16(sp)
|
||||
ldw r6, 20(sp)
|
||||
ldw r7, 24(sp)
|
||||
|
||||
ldw r16, 28(sp)
|
||||
ldw r17, 32(sp)
|
||||
ldw r18, 36(sp)
|
||||
ldw r19, 40(sp)
|
||||
ldw r20, 44(sp)
|
||||
ldw r21, 48(sp)
|
||||
ldw r22, 52(sp)
|
||||
ldw r23, 56(sp)
|
||||
|
||||
ldw fp, 60(sp)
|
||||
ldw ra, 64(sp)
|
||||
|
||||
addi sp, sp, 72
|
||||
|
||||
/* estatus --> status,ea --> pc */
|
||||
eret
|
||||
|
||||
/*
|
||||
* void rt_hw_context_switch_interrupt(rt_uint32 from, rt_uint32 to);
|
||||
* r4: from
|
||||
* r5: to
|
||||
*/
|
||||
.global rt_hw_context_switch_interrupt
|
||||
.type rt_hw_context_switch_interrupt, %function
|
||||
rt_hw_context_switch_interrupt:
|
||||
/* if( rt_thread_switch_interrupt_flag != 0 ) _from_thread_not_change */
|
||||
ldw r2,%gprel(rt_thread_switch_interrupt_flag)(gp)
|
||||
bne r2,zero,_from_thread_not_change
|
||||
|
||||
_from_thread_change:
|
||||
/* save ea -> rt_current_thread_entry */
|
||||
addi ea,ea,-4
|
||||
stw ea,%gprel(rt_current_thread_entry)(gp)
|
||||
|
||||
/* set rt_thread_switch_interrupt_flag to 1 */
|
||||
movi r2, 1
|
||||
stw r2,%gprel(rt_thread_switch_interrupt_flag)(gp)
|
||||
|
||||
/* update rt_interrupt_from_thread */
|
||||
stw r4,%gprel(rt_interrupt_from_thread)(gp)
|
||||
|
||||
_from_thread_not_change:
|
||||
/* update rt_interrupt_to_thread */
|
||||
stw r5,%gprel(rt_interrupt_to_thread)(gp)
|
||||
|
||||
ret
|
||||
|
||||
/*
|
||||
* void rt_hw_context_switch_to(rt_uint32 to);
|
||||
* r4: to
|
||||
*/
|
||||
.global rt_hw_context_switch_to
|
||||
.type rt_hw_context_switch_to, %function
|
||||
rt_hw_context_switch_to:
|
||||
/* save to thread */
|
||||
stw r4,%gprel(rt_interrupt_to_thread)(gp)
|
||||
|
||||
/* get sp */
|
||||
ldw sp, (r4) // sp = *r4
|
||||
|
||||
ldw r2, 68(sp) /* status */
|
||||
wrctl estatus, r2
|
||||
|
||||
ldw ea, 0(sp) /* thread entry */
|
||||
|
||||
ldw r2, 4(sp)
|
||||
ldw r3, 8(sp)
|
||||
ldw r4, 12(sp)
|
||||
ldw r5, 16(sp)
|
||||
ldw r6, 20(sp)
|
||||
ldw r7, 24(sp)
|
||||
|
||||
ldw r16, 28(sp)
|
||||
ldw r17, 32(sp)
|
||||
ldw r18, 36(sp)
|
||||
ldw r19, 40(sp)
|
||||
ldw r20, 44(sp)
|
||||
ldw r21, 48(sp)
|
||||
ldw r22, 52(sp)
|
||||
ldw r23, 56(sp)
|
||||
|
||||
ldw fp, 60(sp)
|
||||
ldw ra, 64(sp)
|
||||
|
||||
addi sp, sp, 72
|
||||
|
||||
/* estatus --> status,ea --> pc */
|
||||
eret
|
||||
|
||||
/*@}*/
|
||||
16
RT_Thread/libcpu/nios/nios_ii/interrupt.c
Normal file
16
RT_Thread/libcpu/nios/nios_ii/interrupt.c
Normal file
@ -0,0 +1,16 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2022, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2009-01-05 Bernard first version
|
||||
*/
|
||||
|
||||
#include <rtthread.h>
|
||||
|
||||
/* exception and interrupt handler table */
|
||||
rt_uint32_t rt_interrupt_from_thread, rt_interrupt_to_thread;
|
||||
rt_uint32_t rt_thread_switch_interrupt_flag;
|
||||
rt_uint32_t rt_current_thread_entry;
|
||||
68
RT_Thread/libcpu/nios/nios_ii/stack.c
Normal file
68
RT_Thread/libcpu/nios/nios_ii/stack.c
Normal file
@ -0,0 +1,68 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2022, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2011-02-14 aozima first implementation for Nios II.
|
||||
*/
|
||||
|
||||
#include <rtthread.h>
|
||||
|
||||
/**
|
||||
* @addtogroup NIOS_II
|
||||
*/
|
||||
/*@{*/
|
||||
|
||||
/**
|
||||
* This function will initialize thread stack
|
||||
*
|
||||
* @param tentry the entry of thread
|
||||
* @param parameter the parameter of entry
|
||||
* @param stack_addr the beginning stack address
|
||||
* @param texit the function will be called when thread exit
|
||||
*
|
||||
* @return stack address
|
||||
*/
|
||||
rt_uint8_t *rt_hw_stack_init(void *tentry, void *parameter,
|
||||
rt_uint8_t *stack_addr, void *texit)
|
||||
{
|
||||
unsigned long *stk;
|
||||
|
||||
stk = (unsigned long *)stack_addr;
|
||||
*(stk) = 0x01; /* status */
|
||||
*(--stk) = (unsigned long)texit; /* ra */
|
||||
*(--stk) = 0xdeadbeef; /* fp */
|
||||
*(--stk) = 0xdeadbeef; /* r23 */
|
||||
*(--stk) = 0xdeadbeef; /* r22 */
|
||||
*(--stk) = 0xdeadbeef; /* r21 */
|
||||
*(--stk) = 0xdeadbeef; /* r20 */
|
||||
*(--stk) = 0xdeadbeef; /* r19 */
|
||||
*(--stk) = 0xdeadbeef; /* r18 */
|
||||
*(--stk) = 0xdeadbeef; /* r17 */
|
||||
*(--stk) = 0xdeadbeef; /* r16 */
|
||||
// *(--stk) = 0xdeadbeef; /* r15 */
|
||||
// *(--stk) = 0xdeadbeef; /* r14 */
|
||||
// *(--stk) = 0xdeadbeef; /* r13 */
|
||||
// *(--stk) = 0xdeadbeef; /* r12 */
|
||||
// *(--stk) = 0xdeadbeef; /* r11 */
|
||||
// *(--stk) = 0xdeadbeef; /* r10 */
|
||||
// *(--stk) = 0xdeadbeef; /* r9 */
|
||||
// *(--stk) = 0xdeadbeef; /* r8 */
|
||||
*(--stk) = 0xdeadbeef; /* r7 */
|
||||
*(--stk) = 0xdeadbeef; /* r6 */
|
||||
*(--stk) = 0xdeadbeef; /* r5 */
|
||||
*(--stk) = (unsigned long)parameter; /* r4 argument */
|
||||
*(--stk) = 0xdeadbeef; /* r3 */
|
||||
*(--stk) = 0xdeadbeef; /* r2 */
|
||||
*(--stk) = (unsigned long)tentry; /* pc */
|
||||
|
||||
// *(stk) = (unsigned long)tentry; /* thread entry (ra) */
|
||||
// *(--stk) = (unsigned long)parameter; /* thread argument, r4 */
|
||||
|
||||
/* return task's current stack address */
|
||||
return (rt_uint8_t *)stk;
|
||||
}
|
||||
|
||||
/*@}*/
|
||||
51
RT_Thread/libcpu/nios/nios_ii/vector.S
Normal file
51
RT_Thread/libcpu/nios/nios_ii/vector.S
Normal file
@ -0,0 +1,51 @@
|
||||
.set noat
|
||||
|
||||
.globl .Lexception_exit
|
||||
|
||||
.section .exceptions.exit.label
|
||||
.Lexception_exit:
|
||||
.section .exceptions.exit, "xa"
|
||||
ldw r5, 68(sp)
|
||||
|
||||
/* get exception back */
|
||||
ldw ea, 72(sp)
|
||||
|
||||
/* if(rt_thread_switch_interrupt_flag == 0) goto no_need_context */
|
||||
ldw r4,%gprel(rt_thread_switch_interrupt_flag)(gp)
|
||||
beq r4,zero,no_need_context
|
||||
|
||||
need_context:
|
||||
movia ea, rt_hw_context_switch_interrupt_do
|
||||
/* disable interrupt */
|
||||
mov r5, zero
|
||||
|
||||
no_need_context:
|
||||
ldw ra, 0(sp)
|
||||
|
||||
wrctl estatus, r5
|
||||
|
||||
/*
|
||||
* Leave a gap in the stack frame at 4(sp) for the muldiv handler to
|
||||
* store zero into.
|
||||
*/
|
||||
|
||||
ldw r1, 8(sp)
|
||||
ldw r2, 12(sp)
|
||||
ldw r3, 16(sp)
|
||||
ldw r4, 20(sp)
|
||||
ldw r5, 24(sp)
|
||||
ldw r6, 28(sp)
|
||||
ldw r7, 32(sp)
|
||||
ldw r8, 36(sp)
|
||||
ldw r9, 40(sp)
|
||||
ldw r10, 44(sp)
|
||||
ldw r11, 48(sp)
|
||||
ldw r12, 52(sp)
|
||||
ldw r13, 56(sp)
|
||||
ldw r14, 60(sp)
|
||||
ldw r15, 64(sp)
|
||||
|
||||
addi sp, sp, 76
|
||||
|
||||
eret
|
||||
|
||||
Reference in New Issue
Block a user