Compare commits

...

4 Commits

Author SHA1 Message Date
alex 1903fb0c9c updates build system to support selection of Target memory, includes trace buffer 2026-05-28 12:44:29 +02:00
alex d45a8f9231 formats files 2026-05-28 12:36:29 +02:00
alex b27cf7d852 adds cxx flags to toolchain files 2026-05-28 12:35:30 +02:00
alex 3955789298 corrects typo 2026-05-28 12:35:01 +02:00
11 changed files with 93 additions and 55 deletions
+14 -1
View File
@@ -1,11 +1,11 @@
cmake_minimum_required(VERSION 3.21) cmake_minimum_required(VERSION 3.21)
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/cmake)
############################################################################### ###############################################################################
# we are building embedded, so no shared libs # we are building embedded, so no shared libs
set(BUILD_SHARED_LIBS OFF) set(BUILD_SHARED_LIBS OFF)
include(${CMAKE_TOOLCHAIN_FILE}) include(${CMAKE_TOOLCHAIN_FILE})
############################################################################### ###############################################################################
add_subdirectory(port/moonlight) add_subdirectory(port/moonlight)
set(TARGET_MEM "ram" CACHE STRING "memory map to use")
############################################################################### ###############################################################################
# Adds picolibc # Adds picolibc
#set(CMAKE_SYSTEM_PROCESSOR riscv) #set(CMAKE_SYSTEM_PROCESSOR riscv)
@@ -27,6 +27,9 @@ set(NETXDUO_CUSTOM_PORT ${CMAKE_CURRENT_LIST_DIR}/port/netxduo)
set(NXD_ENABLE_FILE_SERVERS OFF) set(NXD_ENABLE_FILE_SERVERS OFF)
add_subdirectory(third-party/netxduo) add_subdirectory(third-party/netxduo)
if(NX_DEBUG) if(NX_DEBUG)
target_compile_definitions(netxduo PRIVATE NX_DEBUG)
endif()
if(NX_DEBUG_PACKET)
target_compile_definitions(netxduo PRIVATE NX_DEBUG NX_DEBUG_PACKET NX_ENABLE_PACKET_DEBUG_INFO) target_compile_definitions(netxduo PRIVATE NX_DEBUG NX_DEBUG_PACKET NX_ENABLE_PACKET_DEBUG_INFO)
endif() endif()
if(TX_TRACE) if(TX_TRACE)
@@ -34,14 +37,19 @@ if(TX_TRACE)
target_compile_definitions(threadx_smp PUBLIC TX_ENABLE_EVENT_TRACE) target_compile_definitions(threadx_smp PUBLIC TX_ENABLE_EVENT_TRACE)
target_compile_definitions(netxduo PUBLIC TX_ENABLE_EVENT_TRACE) target_compile_definitions(netxduo PUBLIC TX_ENABLE_EVENT_TRACE)
endif() endif()
target_include_directories(netxduo PRIVATE ${CMAKE_CURRENT_LIST_DIR}/port/moonlight)
target_link_libraries(netxduo PUBLIC threadx c)
############################################################################### ###############################################################################
project(threadx_demo C ASM) project(threadx_demo C ASM)
set(TARGET_MEM "ram" CACHE STRING "memory map to use")
option(NX_DEBUG "compile netxduo debug output in" OFF) option(NX_DEBUG "compile netxduo debug output in" OFF)
option(NX_DEBUG_PACKET "compile netxduo debug output for ethernet packets in" OFF)
option(TX_TRACE "Enable dump of traces to be read by TraceX" OFF) option(TX_TRACE "Enable dump of traces to be read by TraceX" OFF)
set(CMAKE_EXECUTABLE_SUFFIX_C ".elf") set(CMAKE_EXECUTABLE_SUFFIX_C ".elf")
function(setup_target TARGET) function(setup_target TARGET)
set(options) set(options)
set(oneValueArgs TARGET_MEM)
set(multiValueArgs LIBRARIES SOURCES) set(multiValueArgs LIBRARIES SOURCES)
cmake_parse_arguments(ST "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) cmake_parse_arguments(ST "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
if(ST_UNPARSED_ARGUMENTS) if(ST_UNPARSED_ARGUMENTS)
@@ -60,6 +68,11 @@ function(setup_target TARGET)
target_link_libraries(${TARGET} PRIVATE ${ST_LIBRARIES}) target_link_libraries(${TARGET} PRIVATE ${ST_LIBRARIES})
endif() endif()
if(ST_TARGET_MEM)
set(TARGET_MEM "${ST_TARGET_MEM}")
endif()
target_link_options(${TARGET} PUBLIC -T ${TARGET_MEM}.lds)
target_link_options(${TARGET} PRIVATE target_link_options(${TARGET} PRIVATE
-Wl,-Map=${CMAKE_BINARY_DIR}/${TARGET}.map) -Wl,-Map=${CMAKE_BINARY_DIR}/${TARGET}.map)
+1
View File
@@ -6,6 +6,7 @@ set(THREADX_ARCH "risc-v32")
set(THREADX_TOOLCHAIN "gnu") set(THREADX_TOOLCHAIN "gnu")
set(ARCH_FLAGS "-march=rv32gc_zicsr_zifencei -mabi=ilp32d -mcmodel=medany") set(ARCH_FLAGS "-march=rv32gc_zicsr_zifencei -mabi=ilp32d -mcmodel=medany")
set(CFLAGS "${ARCH_FLAGS}") set(CFLAGS "${ARCH_FLAGS}")
set(CXXFLAGS "${ARCH_FLAGS}")
set(ASFLAGS "${ARCH_FLAGS}") set(ASFLAGS "${ARCH_FLAGS}")
set(LDFLAGS "${ARCH_FLAGS}") set(LDFLAGS "${ARCH_FLAGS}")
+1
View File
@@ -6,6 +6,7 @@ set(THREADX_ARCH "risc-v32")
set(THREADX_TOOLCHAIN "gnu") set(THREADX_TOOLCHAIN "gnu")
set(ARCH_FLAGS "-march=rv32imac_zicsr_zifencei -mabi=ilp32 -mcmodel=medany") set(ARCH_FLAGS "-march=rv32imac_zicsr_zifencei -mabi=ilp32 -mcmodel=medany")
set(CFLAGS "${ARCH_FLAGS}") set(CFLAGS "${ARCH_FLAGS}")
set(CXXFLAGS "${ARCH_FLAGS}")
set(ASFLAGS "${ARCH_FLAGS}") set(ASFLAGS "${ARCH_FLAGS}")
set(LDFLAGS "${ARCH_FLAGS}") set(LDFLAGS "${ARCH_FLAGS}")
+1
View File
@@ -6,6 +6,7 @@ set(THREADX_ARCH "risc-v64")
set(THREADX_TOOLCHAIN "gnu") set(THREADX_TOOLCHAIN "gnu")
set(ARCH_FLAGS "-march=rv64gc_zicsr_zifencei -mabi=lp64d -mcmodel=medany") set(ARCH_FLAGS "-march=rv64gc_zicsr_zifencei -mabi=lp64d -mcmodel=medany")
set(CFLAGS "${ARCH_FLAGS}") set(CFLAGS "${ARCH_FLAGS}")
set(CXXFLAGS "${ARCH_FLAGS}")
set(ASFLAGS "${ARCH_FLAGS}") set(ASFLAGS "${ARCH_FLAGS}")
set(LDFLAGS "${ARCH_FLAGS}") set(LDFLAGS "${ARCH_FLAGS}")
+1
View File
@@ -6,6 +6,7 @@ set(THREADX_ARCH "risc-v64")
set(THREADX_TOOLCHAIN "gnu") set(THREADX_TOOLCHAIN "gnu")
set(ARCH_FLAGS "-march=rv64imac_zicsr_zifencei -mabi=lp64 -mcmodel=medany") set(ARCH_FLAGS "-march=rv64imac_zicsr_zifencei -mabi=lp64 -mcmodel=medany")
set(CFLAGS "${ARCH_FLAGS}") set(CFLAGS "${ARCH_FLAGS}")
set(CXXFLAGS "${ARCH_FLAGS}")
set(ASFLAGS "${ARCH_FLAGS}") set(ASFLAGS "${ARCH_FLAGS}")
set(LDFLAGS "${ARCH_FLAGS}") set(LDFLAGS "${ARCH_FLAGS}")
-5
View File
@@ -7,10 +7,6 @@ set(MOONLIGHT_INC_DIR ${MOONLIGHT_ROOT}/inc)
set(MOONLIGHT_SRC_DIR ${MOONLIGHT_ROOT}/src) set(MOONLIGHT_SRC_DIR ${MOONLIGHT_ROOT}/src)
set(MOONLIGHT_LDS_DIR ${MOONLIGHT_ROOT}/lds) set(MOONLIGHT_LDS_DIR ${MOONLIGHT_ROOT}/lds)
if(NOT DEFINED TARGET_MEM)
set(TARGET_MEM "ram" CACHE STRING "memory map to use")
endif()
if(NOT DEFINED MOONLIGHT_TRAP_SOURCE) if(NOT DEFINED MOONLIGHT_TRAP_SOURCE)
set(MOONLIGHT_TRAP_SOURCE ${MOONLIGHT_SRC_DIR}/trap_non_vectored.c) set(MOONLIGHT_TRAP_SOURCE ${MOONLIGHT_SRC_DIR}/trap_non_vectored.c)
endif() endif()
@@ -36,6 +32,5 @@ target_compile_options(moonlight
target_link_options(moonlight target_link_options(moonlight
INTERFACE INTERFACE
-nostartfiles -nostartfiles
-T ${MOONLIGHT_LDS_DIR}/${TARGET_MEM}.lds
-Wl,--gc-sections -Wl,--gc-sections
) )
+21 -21
View File
@@ -60,7 +60,7 @@ static inline uint64_t riscv_get_mstatus()
return x; return x;
} }
static inline void riscv_writ_mstatus(uint64_t x) static inline void riscv_write_mstatus(uint64_t x)
{ {
asm volatile("csrw mstatus, %0" : : "r"(x)); asm volatile("csrw mstatus, %0" : : "r"(x));
} }
@@ -68,7 +68,7 @@ static inline void riscv_writ_mstatus(uint64_t x)
// machine exception program counter, holds the // machine exception program counter, holds the
// instruction address to which a return from // instruction address to which a return from
// exception will go. // exception will go.
static inline void riscv_writ_mepc(uint64_t x) static inline void riscv_write_mepc(uint64_t x)
{ {
asm volatile("csrw mepc, %0" : : "r"(x)); asm volatile("csrw mepc, %0" : : "r"(x));
} }
@@ -80,7 +80,7 @@ static inline uint64_t riscv_get_sstatus()
return x; return x;
} }
static inline void riscv_writ_sstatus(uint64_t x) static inline void riscv_write_sstatus(uint64_t x)
{ {
asm volatile("csrw sstatus, %0" : : "r"(x)); asm volatile("csrw sstatus, %0" : : "r"(x));
} }
@@ -93,7 +93,7 @@ static inline uint64_t riscv_get_sip()
return x; return x;
} }
static inline void riscv_writ_sip(uint64_t x) static inline void riscv_write_sip(uint64_t x)
{ {
asm volatile("csrw sip, %0" : : "r"(x)); asm volatile("csrw sip, %0" : : "r"(x));
} }
@@ -105,7 +105,7 @@ static inline uint64_t riscv_get_sie()
return x; return x;
} }
static inline void riscv_writ_sie(uint64_t x) static inline void riscv_write_sie(uint64_t x)
{ {
asm volatile("csrw sie, %0" : : "r"(x)); asm volatile("csrw sie, %0" : : "r"(x));
} }
@@ -117,7 +117,7 @@ static inline uint64_t riscv_get_mie()
return x; return x;
} }
static inline void riscv_writ_mie(uint64_t x) static inline void riscv_write_mie(uint64_t x)
{ {
asm volatile("csrw mie, %0" : : "r"(x)); asm volatile("csrw mie, %0" : : "r"(x));
} }
@@ -125,7 +125,7 @@ static inline void riscv_writ_mie(uint64_t x)
// supervisor exception program counter, holds the // supervisor exception program counter, holds the
// instruction address to which a return from // instruction address to which a return from
// exception will go. // exception will go.
static inline void riscv_writ_sepc(uint64_t x) static inline void riscv_write_sepc(uint64_t x)
{ {
asm volatile("csrw sepc, %0" : : "r"(x)); asm volatile("csrw sepc, %0" : : "r"(x));
} }
@@ -145,7 +145,7 @@ static inline uint64_t riscv_get_medeleg()
return x; return x;
} }
static inline void riscv_writ_medeleg(uint64_t x) static inline void riscv_write_medeleg(uint64_t x)
{ {
asm volatile("csrw medeleg, %0" : : "r"(x)); asm volatile("csrw medeleg, %0" : : "r"(x));
} }
@@ -158,14 +158,14 @@ static inline uint64_t riscv_get_mideleg()
return x; return x;
} }
static inline void riscv_writ_mideleg(uint64_t x) static inline void riscv_write_mideleg(uint64_t x)
{ {
asm volatile("csrw mideleg, %0" : : "r"(x)); asm volatile("csrw mideleg, %0" : : "r"(x));
} }
// Supervisor Trap-Vector Base Address // Supervisor Trap-Vector Base Address
// low two bits are mode. // low two bits are mode.
static inline void riscv_writ_stvec(uint64_t x) static inline void riscv_write_stvec(uint64_t x)
{ {
asm volatile("csrw stvec, %0" : : "r"(x)); asm volatile("csrw stvec, %0" : : "r"(x));
} }
@@ -186,7 +186,7 @@ static inline uint64_t riscv_get_stimecmp()
return x; return x;
} }
static inline void riscv_writ_stimecmp(uint64_t x) static inline void riscv_write_stimecmp(uint64_t x)
{ {
// asm volatile("csrw stimecmp, %0" : : "r" (x)); // asm volatile("csrw stimecmp, %0" : : "r" (x));
asm volatile("csrw 0x14d, %0" : : "r"(x)); asm volatile("csrw 0x14d, %0" : : "r"(x));
@@ -201,26 +201,26 @@ static inline uint64_t riscv_get_menvcfg()
return x; return x;
} }
static inline void riscv_writ_menvcfg(uint64_t x) static inline void riscv_write_menvcfg(uint64_t x)
{ {
// asm volatile("csrw menvcfg, %0" : : "r" (x)); // asm volatile("csrw menvcfg, %0" : : "r" (x));
asm volatile("csrw 0x30a, %0" : : "r"(x)); asm volatile("csrw 0x30a, %0" : : "r"(x));
} }
// Physical Memory Protection // Physical Memory Protection
static inline void riscv_writ_pmpcfg0(uint64_t x) static inline void riscv_write_pmpcfg0(uint64_t x)
{ {
asm volatile("csrw pmpcfg0, %0" : : "r"(x)); asm volatile("csrw pmpcfg0, %0" : : "r"(x));
} }
static inline void riscv_writ_pmpaddr0(uint64_t x) static inline void riscv_write_pmpaddr0(uint64_t x)
{ {
asm volatile("csrw pmpaddr0, %0" : : "r"(x)); asm volatile("csrw pmpaddr0, %0" : : "r"(x));
} }
// supervisor address translation and protection; // supervisor address translation and protection;
// holds the address of the page table. // holds the address of the page table.
static inline void riscv_writ_satp(uint64_t x) static inline void riscv_write_satp(uint64_t x)
{ {
asm volatile("csrw satp, %0" : : "r"(x)); asm volatile("csrw satp, %0" : : "r"(x));
} }
@@ -249,7 +249,7 @@ static inline uint64_t riscv_get_stval()
} }
// Machine-mode Counter-Enable // Machine-mode Counter-Enable
static inline void riscv_writ_mcounteren(uint64_t x) static inline void riscv_write_mcounteren(uint64_t x)
{ {
asm volatile("csrw mcounteren, %0" : : "r"(x)); asm volatile("csrw mcounteren, %0" : : "r"(x));
} }
@@ -274,7 +274,7 @@ static inline void riscv_sintr_on()
{ {
uint64_t sstatus = riscv_get_sstatus(); uint64_t sstatus = riscv_get_sstatus();
sstatus |= SSTATUS_SIE; sstatus |= SSTATUS_SIE;
riscv_writ_sstatus(sstatus); riscv_write_sstatus(sstatus);
} }
// disable device interrupts // disable device interrupts
@@ -282,7 +282,7 @@ static inline void riscv_sintr_off()
{ {
uint64_t sstatus = riscv_get_sstatus(); uint64_t sstatus = riscv_get_sstatus();
sstatus &= (~SSTATUS_SIE); sstatus &= (~SSTATUS_SIE);
riscv_writ_sstatus(sstatus); riscv_write_sstatus(sstatus);
} }
// are device interrupts enabled? // are device interrupts enabled?
@@ -305,7 +305,7 @@ static inline void riscv_mintr_on()
{ {
uint64_t mstatus = riscv_get_mstatus(); uint64_t mstatus = riscv_get_mstatus();
mstatus |= MSTATUS_MIE; mstatus |= MSTATUS_MIE;
riscv_writ_mstatus(mstatus); riscv_write_mstatus(mstatus);
} }
// disable device interrupts // disable device interrupts
@@ -313,7 +313,7 @@ static inline void riscv_mintr_off()
{ {
uint64_t mstatus = riscv_get_mstatus(); uint64_t mstatus = riscv_get_mstatus();
mstatus &= (~MSTATUS_MIE); mstatus &= (~MSTATUS_MIE);
riscv_writ_mstatus(mstatus); riscv_write_mstatus(mstatus);
} }
// are device interrupts enabled? // are device interrupts enabled?
@@ -347,7 +347,7 @@ static inline uint64_t riscv_get_tp()
return x; return x;
} }
static inline void riscv_writ_tp(uint64_t x) static inline void riscv_write_tp(uint64_t x)
{ {
asm volatile("mv tp, %0" : : "r"(x)); asm volatile("mv tp, %0" : : "r"(x));
} }
+2 -1
View File
@@ -2,6 +2,7 @@ MEMORY
{ {
rom (rxai!w) : ORIGIN = 0x10080000, LENGTH = 8k rom (rxai!w) : ORIGIN = 0x10080000, LENGTH = 8k
flash (rxai!w) : ORIGIN = 0x20000000, LENGTH = 16M flash (rxai!w) : ORIGIN = 0x20000000, LENGTH = 16M
ram (wxa!ri) : ORIGIN = 0x30000000, LENGTH = 128K ram (wxa!ri) : ORIGIN = 0x30000000, LENGTH = 256K
trace (wxa!ri) : ORIGIN = 0x31000000, LENGTH = 1M
dram (wxa!ri) : ORIGIN = 0x40000000, LENGTH = 1024M dram (wxa!ri) : ORIGIN = 0x40000000, LENGTH = 1024M
} }
+8
View File
@@ -105,5 +105,13 @@ SECTIONS
PROVIDE( tohost = . ); PROVIDE( tohost = . );
PROVIDE( fromhost = . + 8 ); PROVIDE( fromhost = . + 8 );
.trace_buffer (NOLOAD) :
{
. = ORIGIN(trace);
__trace_buffer_start = .;
. = ORIGIN(trace) + LENGTH(trace); /* pad until end of trace */
__trace_buffer_end = .;
} > trace
/DISCARD/ : { *(.eh_frame*) *(.comment) *(.note .note.*) } /DISCARD/ : { *(.eh_frame*) *(.comment) *(.note .note.*) }
} }
+39 -22
View File
@@ -1,83 +1,100 @@
#include "riscv-csr.h"
#include "riscv-traps.h"
#include <stdint.h> #include <stdint.h>
#include <stdio.h> #include <stdio.h>
#include "riscv-traps.h"
#include "riscv-csr.h"
// Expect this to increment one time per second - inside exception handler, after each return of MTI handler. // Expect this to increment one time per second - inside exception handler, after each return of MTI handler.
static volatile uint64_t ecall_count = 0; static volatile uint64_t ecall_count = 0;
#ifdef NX_DEBUG #ifdef NX_DEBUG
#define PUTS(STR) puts(STR) #define PUTS(STR) puts(STR)
#define PRINTF(...) printf(__VA_ARGS__) #define PRINTF(...) printf(__VA_ARGS__)
#else #else
#define PUTS(STR) #define PUTS(STR)
#define PRINTF(...) #define PRINTF(...)
#endif #endif
void exception(uintptr_t mcause, uintptr_t mepc, uintptr_t mtval) { void exception(uintptr_t mcause, uintptr_t mepc, uintptr_t mtval)
switch(mcause) { {
case RISCV_EXCP_INSTRUCTION_ADDRESS_MISALIGNED: { switch (mcause)
{
case RISCV_EXCP_INSTRUCTION_ADDRESS_MISALIGNED:
{
puts("[EXCEPTION] : Instruction address misaligned\n"); puts("[EXCEPTION] : Instruction address misaligned\n");
break; break;
} }
case RISCV_EXCP_INSTRUCTION_ACCESS_FAULT: { case RISCV_EXCP_INSTRUCTION_ACCESS_FAULT:
{
puts("[EXCEPTION] : Instruction access fault\n"); puts("[EXCEPTION] : Instruction access fault\n");
break; break;
} }
case RISCV_EXCP_ILLEGAL_INSTRUCTION: { case RISCV_EXCP_ILLEGAL_INSTRUCTION:
{
puts("[EXCEPTION] : Illegal Instruction\n"); puts("[EXCEPTION] : Illegal Instruction\n");
break; break;
} }
case RISCV_EXCP_BREAKPOINT: { case RISCV_EXCP_BREAKPOINT:
{
puts("[EXCEPTION] : Breakpoint\n"); puts("[EXCEPTION] : Breakpoint\n");
break; break;
} }
case RISCV_EXCP_LOAD_ADDRESS_MISALIGNED: { case RISCV_EXCP_LOAD_ADDRESS_MISALIGNED:
{
puts("[EXCEPTION] : Load address misaligned"); puts("[EXCEPTION] : Load address misaligned");
break; break;
} }
case RISCV_EXCP_LOAD_ACCESS_FAULT: { case RISCV_EXCP_LOAD_ACCESS_FAULT:
{
puts("[EXCEPTION] : Load access fault\n"); puts("[EXCEPTION] : Load access fault\n");
break; break;
} }
case RISCV_EXCP_STORE_AMO_ADDRESS_MISALIGNED: { case RISCV_EXCP_STORE_AMO_ADDRESS_MISALIGNED:
{
puts("[EXCEPTION] : Store/AMO address misaligned"); puts("[EXCEPTION] : Store/AMO address misaligned");
break; break;
} }
case RISCV_EXCP_STORE_AMO_ACCESS_FAULT: { case RISCV_EXCP_STORE_AMO_ACCESS_FAULT:
{
puts("[EXCEPTION] : Store/AMO access fault\n"); puts("[EXCEPTION] : Store/AMO access fault\n");
break; break;
} }
case RISCV_EXCP_ENVIRONMENT_CALL_FROM_U_MODE: { case RISCV_EXCP_ENVIRONMENT_CALL_FROM_U_MODE:
{
puts("[EXCEPTION] : Environment call from U-mode\n"); puts("[EXCEPTION] : Environment call from U-mode\n");
break; break;
} }
case RISCV_EXCP_ENVIRONMENT_CALL_FROM_S_MODE: { case RISCV_EXCP_ENVIRONMENT_CALL_FROM_S_MODE:
{
puts("[EXCEPTION] : Environment call from S-mode\n"); puts("[EXCEPTION] : Environment call from S-mode\n");
break; break;
} }
case RISCV_EXCP_ENVIRONMENT_CALL_FROM_M_MODE: { case RISCV_EXCP_ENVIRONMENT_CALL_FROM_M_MODE:
{
puts("[EXCEPTION] : Environment call from M-mode\n"); puts("[EXCEPTION] : Environment call from M-mode\n");
ecall_count++; ecall_count++;
csr_write_mepc(mepc+4); csr_write_mepc(mepc + 4);
break; break;
} }
case RISCV_EXCP_INSTRUCTION_PAGE_FAULT: { case RISCV_EXCP_INSTRUCTION_PAGE_FAULT:
{
puts("[EXCEPTION] : Instruction page fault\n"); puts("[EXCEPTION] : Instruction page fault\n");
break; break;
} }
case RISCV_EXCP_LOAD_PAGE_FAULT: { case RISCV_EXCP_LOAD_PAGE_FAULT:
{
puts("[EXCEPTION] : Load page fault\n"); puts("[EXCEPTION] : Load page fault\n");
break; break;
} }
case RISCV_EXCP_STORE_AMO_PAGE_FAULT: { case RISCV_EXCP_STORE_AMO_PAGE_FAULT:
{
puts("[EXCEPTION] : Store/AMO page fault\n"); puts("[EXCEPTION] : Store/AMO page fault\n");
break; break;
} }
default: { default:
{
printf("[EXCEPTION] : Unknown trap cause: %lu\n", mcause); printf("[EXCEPTION] : Unknown trap cause: %lu\n", mcause);
} }
} }
printf("[EXCEPTION] : PC: 0x%x\n", mepc); printf("[EXCEPTION] : PC: 0x%x\n", mepc);
printf("[EXCEPTION] : Addr: 0x%x\n", mtval); printf("[EXCEPTION] : Addr: 0x%x\n", mtval);
while(1) while (1)
; ;
} }
+5 -5
View File
@@ -70,16 +70,16 @@
STORE x1, 28*REGBYTES(sp) // Store RA, 28*REGBYTES(because call will override ra [ra is a calle register in riscv]) STORE x1, 28*REGBYTES(sp) // Store RA, 28*REGBYTES(because call will override ra [ra is a calle register in riscv])
call _tx_thread_context_save call _tx_thread_context_save
csrr a0, mcause csrr a0, mcause
csrr a1, mepc csrr a1, mepc
csrr a2, mtval csrr a2, mtval
addi sp, sp, -8 addi sp, sp, -8
STORE ra, 0(sp) STORE ra, 0(sp)
call trap_handler call trap_handler
LOAD ra, 0(sp) LOAD ra, 0(sp)
addi sp, sp, 8 addi sp, sp, 8
call _tx_thread_context_restore call _tx_thread_context_restore
// it will nerver return // it will nerver return
.weak trap_handler .weak trap_handler