From 0c50357b7dfc5f549bcabe0615dec8ad8ddc576f Mon Sep 17 00:00:00 2001 From: Yann MAGNIN Date: Tue, 14 Jun 2022 10:51:23 +0200 Subject: [PATCH] VxKernel 0.6.0-6 : Add exception/kernel panic screen + add assets @add <> assets | add default font assets (project) | add default font assets (image) | add default fotn assets (vxsdk conv information) <> board/fxcg50/fxcg50 | add kernel relocation start symbols for the kernel panic screen @update <> kernel/exch | reactivate the kernel panic screen | add relocation information | isolate the PC address properly @fix <> drivers/mpu/sh/sh7305/tmu | fix interrupt handler configuration crash | enable the TMU/ETMU driver --- assets/font8x9.png | Bin 0 -> 28710 bytes assets/font8x9.xcf | Bin 0 -> 27045 bytes assets/vxconv.toml | 9 +++++++++ board/fxcg50/fxcg50.ld | 2 ++ src/drivers/mpu/sh/sh7305/tmu/tmu.c | 14 ++++++-------- src/kernel/exch.c | 18 +++++++++--------- 6 files changed, 26 insertions(+), 17 deletions(-) create mode 100644 assets/font8x9.png create mode 100644 assets/font8x9.xcf create mode 100644 assets/vxconv.toml diff --git a/assets/font8x9.png b/assets/font8x9.png new file mode 100644 index 0000000000000000000000000000000000000000..7eb2dbb276511fa6cf6483a2ae195fa37f3e9084 GIT binary patch literal 28710 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 OxmgLpH4;gc|Nj6F!AQga literal 0 HcmV?d00001 diff --git a/assets/vxconv.toml b/assets/vxconv.toml new file mode 100644 index 0000000..b132db8 --- /dev/null +++ b/assets/vxconv.toml @@ -0,0 +1,9 @@ +[font8x9] +path = 'font8x9.png' +type = 'font' +charset = 'print' +grid.size = '8x12' +grid.padding = 1 +grid.border = 1 +proportional = 1 +line_height = 9 diff --git a/board/fxcg50/fxcg50.ld b/board/fxcg50/fxcg50.ld index 4801d82..682f57a 100644 --- a/board/fxcg50/fxcg50.ld +++ b/board/fxcg50/fxcg50.ld @@ -20,6 +20,8 @@ SECTIONS /* Code */ .text : { + PROVIDE(___kernel_reloc_start = .); + *(.text); *(.text.*); diff --git a/src/drivers/mpu/sh/sh7305/tmu/tmu.c b/src/drivers/mpu/sh/sh7305/tmu/tmu.c index 245f157..29d60d6 100644 --- a/src/drivers/mpu/sh/sh7305/tmu/tmu.c +++ b/src/drivers/mpu/sh/sh7305/tmu/tmu.c @@ -277,7 +277,7 @@ static void __tmu_configure(struct tmu_ctx *s) } /* install the TMUs interupt handler */ - extern void *sh7305_inth_tmu; + extern uint32_t sh7305_inth_tmu; sh7305_intc_install_inth(0x400, &sh7305_inth_tmu, 96); /* install all ETMUx interrupt handler @@ -291,13 +291,13 @@ static void __tmu_configure(struct tmu_ctx *s) We know that the ETMU4 (which have the interrupt vector 0xd00) is followed by excatly 3 free gates (where not interrupt exist). We will use this place to store all the ETMUx interrupt logic. */ - extern void *sh7305_inth_etmu4; - extern void *sh7305_inth_etmux; + extern uint32_t sh7305_inth_etmu4; + extern uint32_t sh7305_inth_etmux; void *h4; void *h; - uint16_t etmu_event[6] = { 0x9e0, 0xc20, 0xc40, 0x900, 0xd00, 0xfa0 }; - h4 = sh7305_intc_install_inth(etmu_event[4], sh7305_inth_etmu4, 96); + uint16_t etmu_evt[6] = { 0x9e0, 0xc20, 0xc40, 0x900, 0xd00, 0xfa0 }; + h4 = sh7305_intc_install_inth(etmu_evt[4], &sh7305_inth_etmu4, 96); for (int i = 0; i < 6; ++i) { /* skip the core ETMUx core handler */ @@ -305,7 +305,7 @@ static void __tmu_configure(struct tmu_ctx *s) continue; /* install the default interrupt handler */ - h = sh7305_intc_install_inth(etmu_event[i], sh7305_inth_etmux, 32); + h = sh7305_intc_install_inth(etmu_evt[i], &sh7305_inth_etmux, 32); /* Distance from VBR handler to ETMU4, used to jump */ *(uint32_t *)(h + 20) += (uintptr_t)h4 - (uintptr_t)cpu_get_vbr(); @@ -376,7 +376,6 @@ static void __tmu_hrestore(struct tmu_ctx *s) /* declare the TMU driver */ -#if 0 struct vhex_driver drv_tmu = { .name = "TMU", .hsave = (void*)&__tmu_hsave, @@ -399,4 +398,3 @@ struct vhex_driver drv_tmu = { } }; VHEX_DECLARE_DRIVER(03, drv_tmu); -#endif diff --git a/src/kernel/exch.c b/src/kernel/exch.c index 43c0337..7818626 100644 --- a/src/kernel/exch.c +++ b/src/kernel/exch.c @@ -4,8 +4,7 @@ //TODO: add relocation information void vhex_kernel_exch_panic(void) { -#if 0 - extern uint16_t vhex_vram[]; + extern uint32_t __kernel_reloc_start; uint32_t PC; uint32_t TEA; uint32_t TRA; @@ -21,8 +20,8 @@ void vhex_kernel_exch_panic(void) dclear(C_WHITE); dtext(6, 3, C_BLACK, "An exception occured! (System ERROR)"); - uint32_t *long_vram = (void *)vhex_vram; - for(int i = 0; i < 198 * 16; i++) long_vram[i] = ~long_vram[i]; +// uint32_t *long_vram = (void *)vhex_vram; +// for(int i = 0; i < 198 * 16; i++) long_vram[i] = ~long_vram[i]; char const *name = ""; if(code == 0x040) name = "TLB miss (nonexisting address) on read"; @@ -36,7 +35,7 @@ void vhex_kernel_exch_panic(void) dprint(6, 25, C_BLACK, "%03x %s", code, name); dtext( 6, 45, C_BLACK, "PC"); - dprint(38, 45, C_BLACK, "= %08x", PC); + dprint(38, 45, C_BLACK, "= %08x", PC - (uintptr_t)&__kernel_reloc_start); dtext(261, 45, C_BLACK, "(Error location)"); dtext( 6, 60, C_BLACK, "TEA"); @@ -47,10 +46,11 @@ void vhex_kernel_exch_panic(void) dprint(38, 75, C_BLACK, "= %#x", TRA); dtext(281, 75, C_BLACK, "(Trap number)"); - dtext(6, 95, C_BLACK, "An unrecoverable error occurred in the add-in."); - dtext(6, 108, C_BLACK, "Please press the RESET button to restart the"); - dtext(6, 121, C_BLACK, "calculator."); + dprint( 6, 90, C_BLACK, "reloc base = %p", &__kernel_reloc_start); + + dtext(6, 120, C_BLACK, "An unrecoverable error occurred in the add-in."); + dtext(6, 135, C_BLACK, "Please press the RESET button to restart the"); + dtext(6, 150, C_BLACK, "calculator."); dupdate(); -#endif while (1) { __asm__ volatile ("sleep"); } }