Skip to content

Commit ca220b5

Browse files
agattidpgeorge
authored andcommitted
py/nlrrv64: Add RISC-V RV64I NLR implementation.
Add custom NLR support for 64 bits RISC-V RV64I targets. Signed-off-by: Alessandro Gatti <[email protected]>
1 parent e39bd3a commit ca220b5

File tree

4 files changed

+94
-3
lines changed

4 files changed

+94
-3
lines changed

py/nlr.h

+11-3
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
#define MICROPY_NLR_NUM_REGS_XTENSA (10)
4646
#define MICROPY_NLR_NUM_REGS_XTENSAWIN (17)
4747
#define MICROPY_NLR_NUM_REGS_RV32I (14)
48+
#define MICROPY_NLR_NUM_REGS_RV64I (14)
4849

4950
// *FORMAT-OFF*
5051

@@ -89,9 +90,16 @@
8990
#elif defined(__mips__)
9091
#define MICROPY_NLR_MIPS (1)
9192
#define MICROPY_NLR_NUM_REGS (MICROPY_NLR_NUM_REGS_MIPS)
92-
#elif defined(__riscv) && defined(__riscv_xlen) && (__riscv_xlen == 32)
93-
#define MICROPY_NLR_RV32I (1)
94-
#define MICROPY_NLR_NUM_REGS (MICROPY_NLR_NUM_REGS_RV32I)
93+
#elif defined(__riscv)
94+
#if __riscv_xlen == 32
95+
#define MICROPY_NLR_NUM_REGS (MICROPY_NLR_NUM_REGS_RV32I)
96+
#define MICROPY_NLR_RV32I (1)
97+
#elif __riscv_xlen == 64
98+
#define MICROPY_NLR_NUM_REGS (MICROPY_NLR_NUM_REGS_RV64I)
99+
#define MICROPY_NLR_RV64I (1)
100+
#else
101+
#error Unsupported RISC-V variant.
102+
#endif
95103
#else
96104
#define MICROPY_NLR_SETJMP (1)
97105
//#warning "No native NLR support for this arch, using setjmp implementation"

py/nlrrv64.c

+81
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
/*
2+
* This file is part of the MicroPython project, http://micropython.org/
3+
*
4+
* The MIT License (MIT)
5+
*
6+
* Copyright (c) 2024 Alessandro Gatti
7+
*
8+
* Permission is hereby granted, free of charge, to any person obtaining a copy
9+
* of this software and associated documentation files (the "Software"), to deal
10+
* in the Software without restriction, including without limitation the rights
11+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12+
* copies of the Software, and to permit persons to whom the Software is
13+
* furnished to do so, subject to the following conditions:
14+
*
15+
* The above copyright notice and this permission notice shall be included in
16+
* all copies or substantial portions of the Software.
17+
*
18+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24+
* THE SOFTWARE.
25+
*/
26+
27+
#include "py/mpstate.h"
28+
29+
#if MICROPY_NLR_RV64I
30+
31+
#undef nlr_push
32+
33+
__attribute__((naked)) unsigned int nlr_push(nlr_buf_t *nlr) {
34+
__asm volatile (
35+
"sd x1, 16(x10) \n" // Store RA.
36+
"sd x8, 24(x10) \n" // Store S0.
37+
"sd x9, 32(x10) \n" // Store S1.
38+
"sd x18, 40(x10) \n" // Store S2.
39+
"sd x19, 48(x10) \n" // Store S3.
40+
"sd x20, 56(x10) \n" // Store S4.
41+
"sd x21, 64(x10) \n" // Store S5.
42+
"sd x22, 72(x10) \n" // Store S6.
43+
"sd x23, 80(x10) \n" // Store S7.
44+
"sd x24, 88(x10) \n" // Store S8.
45+
"sd x25, 96(x10) \n" // Store S9.
46+
"sd x26, 104(x10) \n" // Store S10.
47+
"sd x27, 112(x10) \n" // Store S11.
48+
"sd x2, 120(x10) \n" // Store SP.
49+
"jal x0, nlr_push_tail \n" // Jump to the C part.
50+
);
51+
}
52+
53+
NORETURN void nlr_jump(void *val) {
54+
MP_NLR_JUMP_HEAD(val, top)
55+
__asm volatile (
56+
"add x10, x0, %0 \n" // Load nlr_buf address.
57+
"ld x1, 16(x10) \n" // Retrieve RA.
58+
"ld x8, 24(x10) \n" // Retrieve S0.
59+
"ld x9, 32(x10) \n" // Retrieve S1.
60+
"ld x18, 40(x10) \n" // Retrieve S2.
61+
"ld x19, 48(x10) \n" // Retrieve S3.
62+
"ld x20, 56(x10) \n" // Retrieve S4.
63+
"ld x21, 64(x10) \n" // Retrieve S5.
64+
"ld x22, 72(x10) \n" // Retrieve S6.
65+
"ld x23, 80(x10) \n" // Retrieve S7.
66+
"ld x24, 88(x10) \n" // Retrieve S8.
67+
"ld x25, 96(x10) \n" // Retrieve S9.
68+
"ld x26, 104(x10) \n" // Retrieve S10.
69+
"ld x27, 112(x10) \n" // Retrieve S11.
70+
"ld x2, 120(x10) \n" // Retrieve SP.
71+
"addi x10, x0, 1 \n" // Return 1 for a non-local return.
72+
"jalr x0, x1, 0 \n" // Return.
73+
: // Outputs.
74+
: "r" (top) // Inputs.
75+
: "memory" // Clobbered.
76+
);
77+
78+
MP_UNREACHABLE
79+
}
80+
81+
#endif // MICROPY_NLR_RV64I

py/py.cmake

+1
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ set(MICROPY_SOURCE_PY
6060
${MICROPY_PY_DIR}/nlrmips.c
6161
${MICROPY_PY_DIR}/nlrpowerpc.c
6262
${MICROPY_PY_DIR}/nlrrv32.c
63+
${MICROPY_PY_DIR}/nlrrv64.c
6364
${MICROPY_PY_DIR}/nlrsetjmp.c
6465
${MICROPY_PY_DIR}/nlrthumb.c
6566
${MICROPY_PY_DIR}/nlrx64.c

py/py.mk

+1
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ PY_CORE_O_BASENAME = $(addprefix py/,\
8787
nlrpowerpc.o \
8888
nlrxtensa.o \
8989
nlrrv32.o \
90+
nlrrv64.o \
9091
nlrsetjmp.o \
9192
malloc.o \
9293
gc.o \

0 commit comments

Comments
 (0)