6.1 minor release
This commit is contained in:
240
ports/risc-v32/iar/src/tx_thread_stack_build.s
Normal file
240
ports/risc-v32/iar/src/tx_thread_stack_build.s
Normal file
@@ -0,0 +1,240 @@
|
||||
/**************************************************************************/
|
||||
/* */
|
||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
||||
/* */
|
||||
/* This software is licensed under the Microsoft Software License */
|
||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
||||
/* and in the root directory of this software. */
|
||||
/* */
|
||||
/**************************************************************************/
|
||||
|
||||
|
||||
/**************************************************************************/
|
||||
/**************************************************************************/
|
||||
/** */
|
||||
/** ThreadX Component */
|
||||
/** */
|
||||
/** Thread */
|
||||
/** */
|
||||
/**************************************************************************/
|
||||
/**************************************************************************/
|
||||
|
||||
|
||||
/* #define TX_SOURCE_CODE */
|
||||
|
||||
|
||||
/* Include necessary system files. */
|
||||
|
||||
/* #include "tx_api.h"
|
||||
#include "tx_thread.h" */
|
||||
|
||||
SECTION `.text`:CODE:REORDER:NOROOT(2)
|
||||
CODE
|
||||
/**************************************************************************/
|
||||
/* */
|
||||
/* FUNCTION RELEASE */
|
||||
/* */
|
||||
/* _tx_thread_stack_build RISC-V32/IAR */
|
||||
/* 6.1 */
|
||||
/* AUTHOR */
|
||||
/* */
|
||||
/* William E. Lamie, Microsoft Corporation */
|
||||
/* Tom van Leeuwen, Technolution B.V. */
|
||||
/* */
|
||||
/* DESCRIPTION */
|
||||
/* */
|
||||
/* This function builds a stack frame on the supplied thread's stack. */
|
||||
/* The stack frame results in a fake interrupt return to the supplied */
|
||||
/* function pointer. */
|
||||
/* */
|
||||
/* INPUT */
|
||||
/* */
|
||||
/* thread_ptr Pointer to thread control blk */
|
||||
/* function_ptr Pointer to return function */
|
||||
/* */
|
||||
/* OUTPUT */
|
||||
/* */
|
||||
/* None */
|
||||
/* */
|
||||
/* CALLS */
|
||||
/* */
|
||||
/* None */
|
||||
/* */
|
||||
/* CALLED BY */
|
||||
/* */
|
||||
/* _tx_thread_create Create thread service */
|
||||
/* */
|
||||
/* RELEASE HISTORY */
|
||||
/* */
|
||||
/* DATE NAME DESCRIPTION */
|
||||
/* */
|
||||
/* 09-30-2020 William E. Lamie Initial Version 6.1 */
|
||||
/* */
|
||||
/**************************************************************************/
|
||||
/* VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID))
|
||||
{ */
|
||||
PUBLIC _tx_thread_stack_build
|
||||
_tx_thread_stack_build:
|
||||
|
||||
|
||||
/* Build a fake interrupt frame. The form of the fake interrupt stack
|
||||
on the RISC-V RV32 should look like the following after it is built:
|
||||
|
||||
Stack Top: 1 (00) Interrupt stack frame type
|
||||
x27 (04) Initial s11
|
||||
x26 (08) Initial s10
|
||||
x25 (12) Initial s9
|
||||
x24 (16) Initial s8
|
||||
x23 (20) Initial s7
|
||||
x22 (24) Initial s6
|
||||
x21 (28) Initial s5
|
||||
x20 (32) Initial s4
|
||||
x19 (36) Initial s3
|
||||
x18 (40) Initial s2
|
||||
x9 (44) Initial s1
|
||||
x8 (48) Initial s0
|
||||
x31 (52) Initial t6
|
||||
x30 (56) Initial t5
|
||||
x29 (60) Initial t4
|
||||
x28 (64) Initial t3
|
||||
x7 (68) Initial t2
|
||||
x6 (72) Initial t1
|
||||
x5 (76) Initial t0
|
||||
x17 (80) Initial a7
|
||||
x16 (84) Initial a6
|
||||
x15 (88) Initial a5
|
||||
x14 (92) Initial a4
|
||||
x13 (96) Initial a3
|
||||
x12 (100) Initial a2
|
||||
x11 (104) Initial a1
|
||||
x10 (108) Initial a0
|
||||
x1 (112) Initial ra
|
||||
mepc (120) Initial mepc
|
||||
If floating point support:
|
||||
f0 (124) Inital ft0
|
||||
f1 (128) Inital ft1
|
||||
f2 (132) Inital ft2
|
||||
f3 (136) Inital ft3
|
||||
f4 (140) Inital ft4
|
||||
f5 (144) Inital ft5
|
||||
f6 (148) Inital ft6
|
||||
f7 (152) Inital ft7
|
||||
f8 (156) Inital fs0
|
||||
f9 (160) Inital fs1
|
||||
f10 (164) Inital fa0
|
||||
f11 (168) Inital fa1
|
||||
f12 (172) Inital fa2
|
||||
f13 (176) Inital fa3
|
||||
f14 (180) Inital fa4
|
||||
f15 (184) Inital fa5
|
||||
f16 (188) Inital fa6
|
||||
f17 (192) Inital fa7
|
||||
f18 (196) Inital fs2
|
||||
f19 (200) Inital fs3
|
||||
f20 (204) Inital fs4
|
||||
f21 (208) Inital fs5
|
||||
f22 (212) Inital fs6
|
||||
f23 (216) Inital fs7
|
||||
f24 (220) Inital fs8
|
||||
f25 (224) Inital fs9
|
||||
f26 (228) Inital fs10
|
||||
f27 (232) Inital fs11
|
||||
f28 (236) Inital ft8
|
||||
f29 (240) Inital ft9
|
||||
f30 (244) Inital ft10
|
||||
f31 (248) Inital ft11
|
||||
fscr (252) Inital fscr
|
||||
|
||||
Stack Bottom: (higher memory address) */
|
||||
|
||||
lw t0, 16(a0) ; Pickup end of stack area
|
||||
li t1, ~15 ; Build 16-byte alignment mask
|
||||
and t0, t0, t1 ; Make sure 16-byte alignment
|
||||
|
||||
/* Actually build the stack frame. */
|
||||
|
||||
#if __iar_riscv_base_isa == rv32e
|
||||
addi t0, t0, -260
|
||||
#else
|
||||
addi t0, t0, -128 ; Allocate space for the stack frame
|
||||
#endif
|
||||
li t1, 1 ; Build stack type
|
||||
sw t1, 0(t0) ; Place stack type on the top
|
||||
sw x0, 4(t0) ; Initial s11
|
||||
sw x0, 8(t0) ; Initial s10
|
||||
sw x0, 12(t0) ; Initial s9
|
||||
sw x0, 16(t0) ; Initial s8
|
||||
sw x0, 20(t0) ; Initial s7
|
||||
sw x0, 24(t0) ; Initial s6
|
||||
sw x0, 28(t0) ; Initial s5
|
||||
sw x0, 32(t0) ; Initial s4
|
||||
sw x0, 36(t0) ; Initial s3
|
||||
sw x0, 40(t0) ; Initial s2
|
||||
sw x0, 44(t0) ; Initial s1
|
||||
sw x0, 48(t0) ; Initial s0
|
||||
sw x0, 52(t0) ; Initial t6
|
||||
sw x0, 56(t0) ; Initial t5
|
||||
sw x0, 60(t0) ; Initial t4
|
||||
sw x0, 64(t0) ; Initial t3
|
||||
sw x0, 68(t0) ; Initial t2
|
||||
sw x0, 72(t0) ; Initial t1
|
||||
sw x0, 76(t0) ; Initial t0
|
||||
sw x0, 80(t0) ; Initial a7
|
||||
sw x0, 84(t0) ; Initial a6
|
||||
sw x0, 88(t0) ; Initial a5
|
||||
sw x0, 92(t0) ; Initial a4
|
||||
sw x0, 96(t0) ; Initial a3
|
||||
sw x0, 100(t0) ; Initial a2
|
||||
sw x0, 104(t0) ; Initial a1
|
||||
sw x0, 108(t0) ; Initial a0
|
||||
sw x0, 112(t0) ; Initial ra
|
||||
sw a1, 120(t0) ; Initial mepc
|
||||
#if __iar_riscv_base_isa == rv32e
|
||||
sw x0, 124(t0) ; Inital ft0
|
||||
sw x0, 128(t0) ; Inital ft1
|
||||
sw x0, 132(t0) ; Inital ft2
|
||||
sw x0, 136(t0) ; Inital ft3
|
||||
sw x0, 140(t0) ; Inital ft4
|
||||
sw x0, 144(t0) ; Inital ft5
|
||||
sw x0, 148(t0) ; Inital ft6
|
||||
sw x0, 152(t0) ; Inital ft7
|
||||
sw x0, 156(t0) ; Inital fs0
|
||||
sw x0, 160(t0) ; Inital fs1
|
||||
sw x0, 164(t0) ; Inital fa0
|
||||
sw x0, 168(t0) ; Inital fa1
|
||||
sw x0, 172(t0) ; Inital fa2
|
||||
sw x0, 176(t0) ; Inital fa3
|
||||
sw x0, 180(t0) ; Inital fa4
|
||||
sw x0, 184(t0) ; Inital fa5
|
||||
sw x0, 188(t0) ; Inital fa6
|
||||
sw x0, 192(t0) ; Inital fa7
|
||||
sw x0, 196(t0) ; Inital fs2
|
||||
sw x0, 200(t0) ; Inital fs3
|
||||
sw x0, 204(t0) ; Inital fs4
|
||||
sw x0, 208(t0) ; Inital fs5
|
||||
sw x0, 212(t0) ; Inital fs6
|
||||
sw x0, 216(t0) ; Inital fs7
|
||||
sw x0, 220(t0) ; Inital fs8
|
||||
sw x0, 224(t0) ; Inital fs9
|
||||
sw x0, 228(t0) ; Inital fs10
|
||||
sw x0, 232(t0) ; Inital fs11
|
||||
sw x0, 236(t0) ; Inital ft8
|
||||
sw x0, 240(t0) ; Inital ft9
|
||||
sw x0, 244(t0) ; Inital ft10
|
||||
sw x0, 248(t0) ; Inital ft11
|
||||
csrr a1, fcsr ; Read fcsr and use it for initial value for each thread
|
||||
sw a1, 252(t0) ; Initial fscr
|
||||
sw x0, 256(t0) ; Reserved word (0)
|
||||
#else
|
||||
sw x0, 124(t0) ; Reserved word (0)
|
||||
#endif
|
||||
|
||||
/* Setup stack pointer. */
|
||||
/* thread_ptr -> tx_thread_stack_ptr = t0; */
|
||||
|
||||
sw t0, 8(a0) ; Save stack pointer in thread's
|
||||
ret ; control block and return
|
||||
/* } */
|
||||
END
|
||||
|
||||
Reference in New Issue
Block a user