From f80b7fe4479f1bce9590c4bad6b6a1c188171ddf Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Thu, 29 Jun 2023 20:41:27 +0800 Subject: [PATCH 001/108] Print to UART OK yay! --- arch/risc-v/src/qemu-rv/qemu_rv_head.S | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_head.S b/arch/risc-v/src/qemu-rv/qemu_rv_head.S index 4cce5e1ed25e0..7e89b3b96f7e4 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_head.S +++ b/arch/risc-v/src/qemu-rv/qemu_rv_head.S @@ -41,6 +41,28 @@ __start: + /* Begin Test */ + + /* Load UART Base Address to Register t0 */ + li t0, 0x10000000 + + /* Load `1` to Register t1 */ + li t1, 0x31 + /* Store Register t1 to UART Base Address, Offset 0 */ + sb t1, 0(t0) + + /* Load `2` to Register t1 */ + li t1, 0x32 + /* Store Register t1 to UART Base Address, Offset 0 */ + sb t1, 0(t0) + + /* Load `3` to Register t1 */ + li t1, 0x33 + /* Store Register t1 to UART Base Address, Offset 0 */ + sb t1, 0(t0) + + /* End Test */ + /* Load mhartid (cpuid) */ csrr a0, mhartid From 5de250a23efb70b876b6b2b64ba92633c20f9a20 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Thu, 29 Jun 2023 20:44:37 +0800 Subject: [PATCH 002/108] Print to UART OK yay! --- arch/risc-v/src/qemu-rv/qemu_rv_head.S | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_head.S b/arch/risc-v/src/qemu-rv/qemu_rv_head.S index 7e89b3b96f7e4..a1c4f0c4b25e1 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_head.S +++ b/arch/risc-v/src/qemu-rv/qemu_rv_head.S @@ -48,17 +48,17 @@ __start: /* Load `1` to Register t1 */ li t1, 0x31 - /* Store Register t1 to UART Base Address, Offset 0 */ + /* Store byte from Register t1 to UART Base Address, Offset 0 */ sb t1, 0(t0) /* Load `2` to Register t1 */ li t1, 0x32 - /* Store Register t1 to UART Base Address, Offset 0 */ + /* Store byte from Register t1 to UART Base Address, Offset 0 */ sb t1, 0(t0) /* Load `3` to Register t1 */ li t1, 0x33 - /* Store Register t1 to UART Base Address, Offset 0 */ + /* Store byte from Register t1 to UART Base Address, Offset 0 */ sb t1, 0(t0) /* End Test */ From b873dc06410f80e3296721bfbe0028e30e3d68e3 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Thu, 29 Jun 2023 21:12:38 +0800 Subject: [PATCH 003/108] Adding Linux Header --- arch/risc-v/src/qemu-rv/qemu_rv_head.S | 27 +++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_head.S b/arch/risc-v/src/qemu-rv/qemu_rv_head.S index a1c4f0c4b25e1..3da81f46bd62e 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_head.S +++ b/arch/risc-v/src/qemu-rv/qemu_rv_head.S @@ -40,9 +40,34 @@ .global __start __start: - /* Begin Test */ + /* DO NOT MODIFY. Image header expected by Linux boot-loaders. + * + * This add instruction has no meaningful effect except that + * its opcode forms the magic "MZ" signature of a PE/COFF file + * that is required for UEFI applications. + * + * Some bootloaders check the magic "MZ" to see if the image is a valid + * Linux image. but modifying the bootLoader is unnecessary unless we + * need to do a customize secure boot. So we just put "MZ" in the + * header to make the bootloader happy. + */ + + li s4, -0xd /* Magic "MZ" signature */ + j real_start /* Jump to kernel start */ + /* TODO: Is this used? */ + .quad 0x0 /* Image load offset from start of RAM */ + /* TODO: .quad _e_initstack - __start */ /* Effective size of kernel image, little-endian */ + /* TODO: .quad __HEAD_FLAGS */ /* Informative flags, little-endian */ + .quad 0 /* reserved */ + .quad 0 /* reserved */ + .quad 0 /* reserved */ + .ascii "ARM\x64" /* Magic number, "ARM\x64" */ + .long 0 /* reserved */ + +real_start: + /* Load UART Base Address to Register t0 */ li t0, 0x10000000 From 7ff868f1331a87ffca99580eedc80258cbd47f9d Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Thu, 29 Jun 2023 21:24:04 +0800 Subject: [PATCH 004/108] Adding Linux Header --- arch/risc-v/src/qemu-rv/qemu_rv_head.S | 52 ++++++++++++++------------ 1 file changed, 29 insertions(+), 23 deletions(-) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_head.S b/arch/risc-v/src/qemu-rv/qemu_rv_head.S index 3da81f46bd62e..5bfd4c8253685 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_head.S +++ b/arch/risc-v/src/qemu-rv/qemu_rv_head.S @@ -42,29 +42,35 @@ __start: /* Begin Test */ - /* DO NOT MODIFY. Image header expected by Linux boot-loaders. - * - * This add instruction has no meaningful effect except that - * its opcode forms the magic "MZ" signature of a PE/COFF file - * that is required for UEFI applications. - * - * Some bootloaders check the magic "MZ" to see if the image is a valid - * Linux image. but modifying the bootLoader is unnecessary unless we - * need to do a customize secure boot. So we just put "MZ" in the - * header to make the bootloader happy. - */ - - li s4, -0xd /* Magic "MZ" signature */ - j real_start /* Jump to kernel start */ - /* TODO: Is this used? */ - .quad 0x0 /* Image load offset from start of RAM */ - /* TODO: .quad _e_initstack - __start */ /* Effective size of kernel image, little-endian */ - /* TODO: .quad __HEAD_FLAGS */ /* Informative flags, little-endian */ - .quad 0 /* reserved */ - .quad 0 /* reserved */ - .quad 0 /* reserved */ - .ascii "ARM\x64" /* Magic number, "ARM\x64" */ - .long 0 /* reserved */ + /* DO NOT MODIFY. Image header expected by Linux boot-loaders. + * + * This add instruction has no meaningful effect except that + * its opcode forms the magic "MZ" signature of a PE/COFF file + * that is required for UEFI applications. + * + * Some bootloaders check the magic "MZ" to see if the image is a valid + * Linux image. but modifying the bootLoader is unnecessary unless we + * need to do a customize secure boot. So we just put "MZ" in the + * header to make the bootloader happy. + */ + + li s4, -0xd /* Magic "MZ" signature */ + j real_start /* Jump to Kernel Start */ + + /* TODO: Is this used? */ + .quad 0x0 /* Image load offset from start of RAM */ + /* TODO: .quad _e_initstack - __start */ /* Effective size of kernel image, little-endian */ + /* TODO: .quad __HEAD_FLAGS */ /* Kernel flags, little-endian */ + + .long 0x2; /* Version of this header */ + + .long 0 /* Reserved */ + .quad 0 /* Reserved */ + + .ascii "RISCV" /* Magic number, "RISCV" */ + .ascii "RSC\x05" /* Magic number 2, "RSC\x05" */ + + .long 0 /* Reserved for PE COFF offset */ real_start: From 94348e7503c2f71b9a654cb63a96521f85346a42 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Thu, 29 Jun 2023 21:40:37 +0800 Subject: [PATCH 005/108] Adding Linux Header --- arch/risc-v/src/qemu-rv/qemu_rv_head.S | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_head.S b/arch/risc-v/src/qemu-rv/qemu_rv_head.S index 5bfd4c8253685..165251cb3c892 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_head.S +++ b/arch/risc-v/src/qemu-rv/qemu_rv_head.S @@ -59,16 +59,17 @@ __start: /* TODO: Is this used? */ .quad 0x0 /* Image load offset from start of RAM */ - /* TODO: .quad _e_initstack - __start */ /* Effective size of kernel image, little-endian */ - /* TODO: .quad __HEAD_FLAGS */ /* Kernel flags, little-endian */ + .quad 0x1111111111111111 /* TODO: _e_initstack - __start */ /* Effective size of kernel image, little-endian */ + .quad 0x2222222222222222 /* TODO: __HEAD_FLAGS */ /* Kernel flags, little-endian */ - .long 0x2; /* Version of this header */ + /* TODO */ + .long 0x2 /* Version of this header */ .long 0 /* Reserved */ .quad 0 /* Reserved */ - .ascii "RISCV" /* Magic number, "RISCV" */ - .ascii "RSC\x05" /* Magic number 2, "RSC\x05" */ + .ascii "RISCV\x00\x00\x00" /* Magic number, "RISCV" (8 bytes) */ + .ascii "RSC\x05" /* Magic number 2, "RSC\x05" (4 bytes) */ .long 0 /* Reserved for PE COFF offset */ From 0c5949677d7cff32e50d46109f288291952855e9 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Thu, 29 Jun 2023 22:15:57 +0800 Subject: [PATCH 006/108] Adding Linux Header --- arch/risc-v/src/qemu-rv/qemu_rv_head.S | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_head.S b/arch/risc-v/src/qemu-rv/qemu_rv_head.S index 165251cb3c892..721ff66c313b6 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_head.S +++ b/arch/risc-v/src/qemu-rv/qemu_rv_head.S @@ -58,9 +58,9 @@ __start: j real_start /* Jump to Kernel Start */ /* TODO: Is this used? */ - .quad 0x0 /* Image load offset from start of RAM */ - .quad 0x1111111111111111 /* TODO: _e_initstack - __start */ /* Effective size of kernel image, little-endian */ - .quad 0x2222222222222222 /* TODO: __HEAD_FLAGS */ /* Kernel flags, little-endian */ + .quad 0x1111111111111111 /* TODO: 0x0 */ /* Image load offset from start of RAM */ + .quad 0x2222222222222222 /* TODO: _e_initstack - __start */ /* Effective size of kernel image, little-endian */ + .quad 0x3333333333333333 /* TODO: __HEAD_FLAGS */ /* Kernel flags, little-endian */ /* TODO */ .long 0x2 /* Version of this header */ From a0787e736b4e7dda83ff452d392dcffed2f89edf Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Fri, 30 Jun 2023 13:37:41 +0800 Subject: [PATCH 007/108] Adding Linux Header --- arch/risc-v/src/qemu-rv/qemu_rv_head.S | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_head.S b/arch/risc-v/src/qemu-rv/qemu_rv_head.S index 721ff66c313b6..f3dfd103eaa3f 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_head.S +++ b/arch/risc-v/src/qemu-rv/qemu_rv_head.S @@ -54,13 +54,14 @@ __start: * header to make the bootloader happy. */ - li s4, -0xd /* Magic "MZ" signature */ + li s4, -0xd /* Magic Signature "MZ" */ j real_start /* Jump to Kernel Start */ + .long 0 /* Pad Executable Code to 8 bytes */ /* TODO: Is this used? */ .quad 0x1111111111111111 /* TODO: 0x0 */ /* Image load offset from start of RAM */ .quad 0x2222222222222222 /* TODO: _e_initstack - __start */ /* Effective size of kernel image, little-endian */ - .quad 0x3333333333333333 /* TODO: __HEAD_FLAGS */ /* Kernel flags, little-endian */ + .quad 0x3333333333333333 /* TODO: 0x0 */ /* Kernel flags, little-endian */ /* TODO */ .long 0x2 /* Version of this header */ From b4744c969dce4949ea0695cb5e375053451b8d9e Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Fri, 30 Jun 2023 14:03:23 +0800 Subject: [PATCH 008/108] Added Linux Header --- arch/risc-v/src/qemu-rv/qemu_rv_head.S | 49 ++++++++++++-------------- 1 file changed, 22 insertions(+), 27 deletions(-) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_head.S b/arch/risc-v/src/qemu-rv/qemu_rv_head.S index f3dfd103eaa3f..3c09b0ac1f27d 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_head.S +++ b/arch/risc-v/src/qemu-rv/qemu_rv_head.S @@ -42,37 +42,32 @@ __start: /* Begin Test */ - /* DO NOT MODIFY. Image header expected by Linux boot-loaders. + /* DO NOT MODIFY. Image Header expected by Linux bootloaders. * - * This add instruction has no meaningful effect except that + * This `li` instruction has no meaningful effect except that * its opcode forms the magic "MZ" signature of a PE/COFF file - * that is required for UEFI applications. - * - * Some bootloaders check the magic "MZ" to see if the image is a valid - * Linux image. but modifying the bootLoader is unnecessary unless we - * need to do a customize secure boot. So we just put "MZ" in the - * header to make the bootloader happy. - */ - - li s4, -0xd /* Magic Signature "MZ" */ - j real_start /* Jump to Kernel Start */ - .long 0 /* Pad Executable Code to 8 bytes */ + * that is required for UEFI applications. + * + * Some bootloaders check the magic "MZ" to see if the image is a valid + * Linux image. But modifying the bootLoader is unnecessary unless we + * need to do a customized secure boot. So we just put "MZ" in the + * header to make the bootloader happy. + */ + li s4, -0xd /* Magic Signature "MZ" (2 bytes) */ + j real_start /* Jump to Kernel Start (2 bytes) */ + .long 0 /* Executable Code padded to 8 bytes */ /* TODO: Is this used? */ - .quad 0x1111111111111111 /* TODO: 0x0 */ /* Image load offset from start of RAM */ - .quad 0x2222222222222222 /* TODO: _e_initstack - __start */ /* Effective size of kernel image, little-endian */ - .quad 0x3333333333333333 /* TODO: 0x0 */ /* Kernel flags, little-endian */ - - /* TODO */ - .long 0x2 /* Version of this header */ - - .long 0 /* Reserved */ - .quad 0 /* Reserved */ - - .ascii "RISCV\x00\x00\x00" /* Magic number, "RISCV" (8 bytes) */ - .ascii "RSC\x05" /* Magic number 2, "RSC\x05" (4 bytes) */ - - .long 0 /* Reserved for PE COFF offset */ + .quad 0x0 /* Image load offset from start of RAM */ + /* TODO: _e_initstack - __start */ + .quad 171644 /* Effective size of kernel image, little-endian */ + .quad 0x0 /* Kernel flags, little-endian */ + .long 0x2 /* Version of this header */ + .long 0 /* Reserved */ + .quad 0 /* Reserved */ + .ascii "RISCV\x00\x00\x00" /* Magic number, "RISCV" (8 bytes) */ + .ascii "RSC\x05" /* Magic number 2, "RSC\x05" (4 bytes) */ + .long 0 /* Reserved for PE COFF offset */ real_start: From b75df20658862302a746a1ae5e8ae58c74368cf8 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Fri, 30 Jun 2023 14:38:55 +0800 Subject: [PATCH 009/108] Start at 0x44000000 --- .../risc-v/qemu-rv/rv-virt/configs/nsh64/defconfig | 2 +- .../qemu-rv/rv-virt/scripts/ld-kernel64.script | 12 ++++++++---- boards/risc-v/qemu-rv/rv-virt/scripts/ld.script | 3 ++- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/boards/risc-v/qemu-rv/rv-virt/configs/nsh64/defconfig b/boards/risc-v/qemu-rv/rv-virt/configs/nsh64/defconfig index e7870d9c94bdb..d3b90d2ea7228 100644 --- a/boards/risc-v/qemu-rv/rv-virt/configs/nsh64/defconfig +++ b/boards/risc-v/qemu-rv/rv-virt/configs/nsh64/defconfig @@ -54,7 +54,7 @@ CONFIG_NSH_SYMTAB_ARRAYNAME="g_symtab" CONFIG_NSH_SYMTAB_COUNTNAME="g_nsymbols" CONFIG_PATH_INITIAL="/system/bin" CONFIG_RAM_SIZE=33554432 -CONFIG_RAM_START=0x80000000 +CONFIG_RAM_START=0x44000000 CONFIG_READLINE_CMD_HISTORY=y CONFIG_RISCV_SEMIHOSTING_HOSTFS=y CONFIG_RR_INTERVAL=200 diff --git a/boards/risc-v/qemu-rv/rv-virt/scripts/ld-kernel64.script b/boards/risc-v/qemu-rv/rv-virt/scripts/ld-kernel64.script index bfab060ee6845..4b2e4e1c892a9 100644 --- a/boards/risc-v/qemu-rv/rv-virt/scripts/ld-kernel64.script +++ b/boards/risc-v/qemu-rv/rv-virt/scripts/ld-kernel64.script @@ -20,9 +20,12 @@ MEMORY { - kflash (rx) : ORIGIN = 0x80000000, LENGTH = 2048K /* w/ cache */ - ksram (rwx) : ORIGIN = 0x80200000, LENGTH = 2048K /* w/ cache */ - pgram (rwx) : ORIGIN = 0x80400000, LENGTH = 4096K /* w/ cache */ + /* Previously 0x80000000 */ + kflash (rx) : ORIGIN = 0x44000000, LENGTH = 2048K /* w/ cache */ + /* Previously 0x80200000 */ + ksram (rwx) : ORIGIN = 0x44200000, LENGTH = 2048K /* w/ cache */ + /* Previously 0x80400000 */ + pgram (rwx) : ORIGIN = 0x44400000, LENGTH = 4096K /* w/ cache */ } OUTPUT_ARCH("riscv") @@ -42,7 +45,8 @@ __pgheap_size = LENGTH(pgram); SECTIONS { - . = 0x80000000; + /* Previously 0x80000000 */ + . = 0x44000000; .text : { diff --git a/boards/risc-v/qemu-rv/rv-virt/scripts/ld.script b/boards/risc-v/qemu-rv/rv-virt/scripts/ld.script index 664bbb178f1d7..45360153a2668 100644 --- a/boards/risc-v/qemu-rv/rv-virt/scripts/ld.script +++ b/boards/risc-v/qemu-rv/rv-virt/scripts/ld.script @@ -20,7 +20,8 @@ SECTIONS { - . = 0x80000000; + /* Previously 0x80000000 */ + . = 0x44000000; .text : { From 9e92bbc7e54aa55d5b426850f54855d607ab8e46 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Sat, 1 Jul 2023 16:57:01 +0800 Subject: [PATCH 010/108] Moved Start Address to 0x40200000. NuttX boots with `123` yay! --- arch/risc-v/src/qemu-rv/qemu_rv_head.S | 3 +-- boards/risc-v/qemu-rv/rv-virt/scripts/ld-kernel64.script | 8 ++++---- boards/risc-v/qemu-rv/rv-virt/scripts/ld.script | 2 +- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_head.S b/arch/risc-v/src/qemu-rv/qemu_rv_head.S index 3c09b0ac1f27d..218005b534d73 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_head.S +++ b/arch/risc-v/src/qemu-rv/qemu_rv_head.S @@ -57,8 +57,7 @@ __start: li s4, -0xd /* Magic Signature "MZ" (2 bytes) */ j real_start /* Jump to Kernel Start (2 bytes) */ .long 0 /* Executable Code padded to 8 bytes */ - /* TODO: Is this used? */ - .quad 0x0 /* Image load offset from start of RAM */ + .quad 0x200000 /* Image load offset from start of RAM */ /* TODO: _e_initstack - __start */ .quad 171644 /* Effective size of kernel image, little-endian */ .quad 0x0 /* Kernel flags, little-endian */ diff --git a/boards/risc-v/qemu-rv/rv-virt/scripts/ld-kernel64.script b/boards/risc-v/qemu-rv/rv-virt/scripts/ld-kernel64.script index 4b2e4e1c892a9..d4ec5ef1320db 100644 --- a/boards/risc-v/qemu-rv/rv-virt/scripts/ld-kernel64.script +++ b/boards/risc-v/qemu-rv/rv-virt/scripts/ld-kernel64.script @@ -21,11 +21,11 @@ MEMORY { /* Previously 0x80000000 */ - kflash (rx) : ORIGIN = 0x44000000, LENGTH = 2048K /* w/ cache */ + kflash (rx) : ORIGIN = 0x40200000, LENGTH = 2048K /* w/ cache */ /* Previously 0x80200000 */ - ksram (rwx) : ORIGIN = 0x44200000, LENGTH = 2048K /* w/ cache */ + ksram (rwx) : ORIGIN = 0x40400000, LENGTH = 2048K /* w/ cache */ /* Previously 0x80400000 */ - pgram (rwx) : ORIGIN = 0x44400000, LENGTH = 4096K /* w/ cache */ + pgram (rwx) : ORIGIN = 0x40600000, LENGTH = 4096K /* w/ cache */ } OUTPUT_ARCH("riscv") @@ -46,7 +46,7 @@ __pgheap_size = LENGTH(pgram); SECTIONS { /* Previously 0x80000000 */ - . = 0x44000000; + . = 0x40200000; .text : { diff --git a/boards/risc-v/qemu-rv/rv-virt/scripts/ld.script b/boards/risc-v/qemu-rv/rv-virt/scripts/ld.script index 45360153a2668..fb83dd0ad8e4f 100644 --- a/boards/risc-v/qemu-rv/rv-virt/scripts/ld.script +++ b/boards/risc-v/qemu-rv/rv-virt/scripts/ld.script @@ -21,7 +21,7 @@ SECTIONS { /* Previously 0x80000000 */ - . = 0x44000000; + . = 0x40200000; .text : { From 5c593667cf94099003b01f6ed5526dd4aae7f1a3 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Sat, 1 Jul 2023 17:15:54 +0800 Subject: [PATCH 011/108] Moved Start Address to 0x40200000. NuttX boots with `123` yay! --- boards/risc-v/qemu-rv/rv-virt/configs/nsh64/defconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boards/risc-v/qemu-rv/rv-virt/configs/nsh64/defconfig b/boards/risc-v/qemu-rv/rv-virt/configs/nsh64/defconfig index d3b90d2ea7228..a5260c5b20847 100644 --- a/boards/risc-v/qemu-rv/rv-virt/configs/nsh64/defconfig +++ b/boards/risc-v/qemu-rv/rv-virt/configs/nsh64/defconfig @@ -54,7 +54,7 @@ CONFIG_NSH_SYMTAB_ARRAYNAME="g_symtab" CONFIG_NSH_SYMTAB_COUNTNAME="g_nsymbols" CONFIG_PATH_INITIAL="/system/bin" CONFIG_RAM_SIZE=33554432 -CONFIG_RAM_START=0x44000000 +CONFIG_RAM_START=0x40200000 CONFIG_READLINE_CMD_HISTORY=y CONFIG_RISCV_SEMIHOSTING_HOSTFS=y CONFIG_RR_INTERVAL=200 From ed09c34532ee7c51ac2da816cd6cf0adcce336e6 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Sat, 1 Jul 2023 19:26:07 +0800 Subject: [PATCH 012/108] Sync MZ with Linux --- arch/risc-v/src/qemu-rv/qemu_rv_head.S | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_head.S b/arch/risc-v/src/qemu-rv/qemu_rv_head.S index 218005b534d73..6c369f9bc6b2f 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_head.S +++ b/arch/risc-v/src/qemu-rv/qemu_rv_head.S @@ -54,7 +54,7 @@ __start: * header to make the bootloader happy. */ - li s4, -0xd /* Magic Signature "MZ" (2 bytes) */ + c.li s4, -13 /* Magic Signature "MZ" (2 bytes) */ j real_start /* Jump to Kernel Start (2 bytes) */ .long 0 /* Executable Code padded to 8 bytes */ .quad 0x200000 /* Image load offset from start of RAM */ From ecee2d92eb60624243431e3c9f95e3958dff1818 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Tue, 4 Jul 2023 10:30:11 +0800 Subject: [PATCH 013/108] Change Machine Registers to Supervisor Registers --- arch/risc-v/src/qemu-rv/qemu_rv_head.S | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_head.S b/arch/risc-v/src/qemu-rv/qemu_rv_head.S index 6c369f9bc6b2f..fdb954e0efd25 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_head.S +++ b/arch/risc-v/src/qemu-rv/qemu_rv_head.S @@ -91,8 +91,8 @@ real_start: /* End Test */ /* Load mhartid (cpuid) */ - - csrr a0, mhartid + /* We assume that OpenSBI has passed Hart ID (value 1) in Register a0 */ + /* Previously: csrr a0, mhartid */ /* Set stack pointer to the idle thread stack */ @@ -112,7 +112,8 @@ real_start: /* If a0 (mhartid) >= t1 (the number of CPUs), stop here */ blt a0, t1, 3f - csrw mie, zero + csrw sie, zero + /* Previously: csrw mie, zero */ wfi 3: @@ -147,10 +148,12 @@ real_start: /* Disable all interrupts (i.e. timer, external) in mie */ - csrw mie, zero + csrw sie, zero + /* Previously: csrw mie, zero */ la t0, __trap_vec - csrw mtvec, t0 + csrw stvec, t0 + /* Previously: csrw mtvec, t0 */ /* Jump to qemu_rv_start */ From 06f8bc994f10ee1590cdc814da10568c02183a3d Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Tue, 4 Jul 2023 11:00:05 +0800 Subject: [PATCH 014/108] Fix Hart ID --- arch/risc-v/src/qemu-rv/qemu_rv_head.S | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_head.S b/arch/risc-v/src/qemu-rv/qemu_rv_head.S index fdb954e0efd25..6ecb11fcd7f3c 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_head.S +++ b/arch/risc-v/src/qemu-rv/qemu_rv_head.S @@ -91,9 +91,17 @@ real_start: /* End Test */ /* Load mhartid (cpuid) */ - /* We assume that OpenSBI has passed Hart ID (value 1) in Register a0 */ /* Previously: csrr a0, mhartid */ + /* We assume that OpenSBI has passed Hart ID (value 1) in Register a0. */ + /* But NuttX expects Hart ID to start at 0, so we subtract 1. */ + addi a0, a0, -1 + + /* Print the Hart ID */ + addi t1, a0, 0x30 + /* Store byte from Register t1 to UART Base Address, Offset 0 */ + sb t1, 0(t0) + /* Set stack pointer to the idle thread stack */ bnez a0, 1f From 43de842eb25eba5b483e8a86a378f98934b391c4 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Tue, 4 Jul 2023 14:53:53 +0800 Subject: [PATCH 015/108] Clean up --- arch/risc-v/src/qemu-rv/qemu_rv_head.S | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_head.S b/arch/risc-v/src/qemu-rv/qemu_rv_head.S index 6ecb11fcd7f3c..3edf0531548c4 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_head.S +++ b/arch/risc-v/src/qemu-rv/qemu_rv_head.S @@ -156,8 +156,8 @@ real_start: /* Disable all interrupts (i.e. timer, external) in mie */ - csrw sie, zero - /* Previously: csrw mie, zero */ + csrw sie, zero + /* Previously: csrw mie, zero */ la t0, __trap_vec csrw stvec, t0 From 55967a3876f0fc5f6ac478868dfce7bd5ec2f628 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Tue, 4 Jul 2023 15:45:38 +0800 Subject: [PATCH 016/108] Add log --- arch/risc-v/src/qemu-rv/qemu_rv_head.S | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_head.S b/arch/risc-v/src/qemu-rv/qemu_rv_head.S index 3edf0531548c4..d60e05d15fee0 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_head.S +++ b/arch/risc-v/src/qemu-rv/qemu_rv_head.S @@ -108,6 +108,10 @@ real_start: la sp, QEMU_RV_IDLESTACK_TOP j 2f 1: + /* Print `4` */ + li t0, 0x10000000 + li t1, 0x34 + sb t1, 0(t0) /* Load the number of CPUs that the kernel supports */ @@ -125,6 +129,11 @@ real_start: wfi 3: + /* Print `5` */ + li t0, 0x10000000 + li t1, 0x35 + sb t1, 0(t0) + /* To get g_cpu_basestack[mhartid], must get g_cpu_basestack first */ la t0, g_cpu_basestack @@ -153,6 +162,10 @@ real_start: add sp, sp, t0 2: + /* Print `6` */ + li t0, 0x10000000 + li t1, 0x36 + sb t1, 0(t0) /* Disable all interrupts (i.e. timer, external) in mie */ @@ -163,6 +176,11 @@ real_start: csrw stvec, t0 /* Previously: csrw mtvec, t0 */ + /* Print `7` */ + li t0, 0x10000000 + li t1, 0x37 + sb t1, 0(t0) + /* Jump to qemu_rv_start */ jal x1, qemu_rv_start From 8fdd0202eb73682e821222517645d95a37b8cc2a Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Tue, 4 Jul 2023 15:53:20 +0800 Subject: [PATCH 017/108] Hangs at qemu_rv_start --- arch/risc-v/src/qemu-rv/qemu_rv_start.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_start.c b/arch/risc-v/src/qemu-rv/qemu_rv_start.c index 303fe217213bc..4ec233236d090 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_start.c +++ b/arch/risc-v/src/qemu-rv/qemu_rv_start.c @@ -104,6 +104,7 @@ void qemu_rv_start(int mhartid) { /* Configure FPU */ + *(uint8_t *)0x10000000 = 'D';//// riscv_fpuconfig(); if (mhartid > 0) @@ -112,12 +113,15 @@ void qemu_rv_start(int mhartid) } #ifndef CONFIG_BUILD_KERNEL + *(uint8_t *)0x10000000 = 'E';//// qemu_rv_clear_bss(); #endif + *(uint8_t *)0x10000000 = 'F';//// showprogress('A'); #ifdef USE_EARLYSERIALINIT + *(uint8_t *)0x10000000 = 'G';//// riscv_earlyserialinit(); #endif @@ -135,14 +139,17 @@ void qemu_rv_start(int mhartid) /* Call nx_start() */ + *(uint8_t *)0x10000000 = 'H';//// nx_start(); cpux: #ifdef CONFIG_SMP + *(uint8_t *)0x10000000 = 'I';//// riscv_cpu_boot(mhartid); #endif + *(uint8_t *)0x10000000 = 'J';//// while (true) { asm("WFI"); From e99a2415099fe4b87f8c539df383b161a3808f99 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Tue, 4 Jul 2023 15:57:56 +0800 Subject: [PATCH 018/108] Hangs at qemu_rv_start --- arch/risc-v/src/qemu-rv/qemu_rv_start.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_start.c b/arch/risc-v/src/qemu-rv/qemu_rv_start.c index 4ec233236d090..06c98f07f844f 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_start.c +++ b/arch/risc-v/src/qemu-rv/qemu_rv_start.c @@ -104,7 +104,7 @@ void qemu_rv_start(int mhartid) { /* Configure FPU */ - *(uint8_t *)0x10000000 = 'D';//// + *(volatile uint8_t *)0x10000000 = 'D';//// riscv_fpuconfig(); if (mhartid > 0) @@ -113,15 +113,15 @@ void qemu_rv_start(int mhartid) } #ifndef CONFIG_BUILD_KERNEL - *(uint8_t *)0x10000000 = 'E';//// + *(volatile uint8_t *)0x10000000 = 'E';//// qemu_rv_clear_bss(); #endif - *(uint8_t *)0x10000000 = 'F';//// + *(volatile uint8_t *)0x10000000 = 'F';//// showprogress('A'); #ifdef USE_EARLYSERIALINIT - *(uint8_t *)0x10000000 = 'G';//// + *(volatile uint8_t *)0x10000000 = 'G';//// riscv_earlyserialinit(); #endif @@ -139,17 +139,17 @@ void qemu_rv_start(int mhartid) /* Call nx_start() */ - *(uint8_t *)0x10000000 = 'H';//// + *(volatile uint8_t *)0x10000000 = 'H';//// nx_start(); cpux: #ifdef CONFIG_SMP - *(uint8_t *)0x10000000 = 'I';//// + *(volatile uint8_t *)0x10000000 = 'I';//// riscv_cpu_boot(mhartid); #endif - *(uint8_t *)0x10000000 = 'J';//// + *(volatile uint8_t *)0x10000000 = 'J';//// while (true) { asm("WFI"); From dc59c26953e879d46dd353b8447cddce5d6a9787 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Tue, 4 Jul 2023 16:02:44 +0800 Subject: [PATCH 019/108] Hangs at qemu_rv_start --- drivers/serial/uart_16550.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/serial/uart_16550.c b/drivers/serial/uart_16550.c index 3d5175617c5d6..a1011321c7f5b 100644 --- a/drivers/serial/uart_16550.c +++ b/drivers/serial/uart_16550.c @@ -702,6 +702,7 @@ static inline uint32_t u16550_divisor(FAR struct u16550_s *priv) static int u16550_setup(FAR struct uart_dev_s *dev) { + *(volatile uint8_t *)0x10000000 = 'c';//// #ifndef CONFIG_16550_SUPRESS_CONFIG FAR struct u16550_s *priv = (FAR struct u16550_s *)dev->priv; uint16_t div; @@ -806,6 +807,7 @@ static int u16550_setup(FAR struct uart_dev_s *dev) #endif #endif + *(volatile uint8_t *)0x10000000 = 'd';//// return OK; } @@ -1655,6 +1657,7 @@ static void u16550_putc(FAR struct u16550_s *priv, int ch) void u16550_earlyserialinit(void) { + *(volatile uint8_t *)0x10000000 = 'a';//// /* Configuration whichever one is the console */ #ifdef CONSOLE_DEV @@ -1663,6 +1666,7 @@ void u16550_earlyserialinit(void) u16550_setup(&CONSOLE_DEV); #endif #endif + *(volatile uint8_t *)0x10000000 = 'b';//// } /**************************************************************************** From 005f0ea0624add1be2bb02afd2355947392bb019 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Tue, 4 Jul 2023 17:20:44 +0800 Subject: [PATCH 020/108] Revert to earlier `sed` --- tools/Unix.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/Unix.mk b/tools/Unix.mk index 62f74b8c6f870..879ec7b865e6b 100644 --- a/tools/Unix.mk +++ b/tools/Unix.mk @@ -250,7 +250,7 @@ tools/mkconfig$(HOSTEXEEXT): include/nuttx/config.h: $(TOPDIR)/.config tools/mkconfig$(HOSTEXEEXT) $(Q) grep -v "CONFIG_BASE_DEFCONFIG" "$(TOPDIR)/.config" > "$(TOPDIR)/.config.tmp" $(Q) if ! cmp -s "$(TOPDIR)/.config.tmp" "$(TOPDIR)/.config.orig" ; then \ - sed -i.bak "/CONFIG_BASE_DEFCONFIG/ { /-dirty/! s/\"$$/-dirty\"/ }" "$(TOPDIR)/.config"; \ + sed -i.bak "/CONFIG_BASE_DEFCONFIG/s/\"$$/-dirty\"/" "$(TOPDIR)/.config"; \ else \ sed -i.bak "s/-dirty//g" "$(TOPDIR)/.config"; \ fi From 2b8ef3d62dece550452816ebd7aae38a3da39ff1 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Tue, 4 Jul 2023 17:30:26 +0800 Subject: [PATCH 021/108] Hang in up_putc --- drivers/serial/uart_16550.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/drivers/serial/uart_16550.c b/drivers/serial/uart_16550.c index a1011321c7f5b..4f885dc9e4161 100644 --- a/drivers/serial/uart_16550.c +++ b/drivers/serial/uart_16550.c @@ -764,6 +764,7 @@ static int u16550_setup(FAR struct uart_dev_s *dev) /* Enter DLAB=1 */ + *(volatile uint8_t *)0x10000000 = 'e';//// u16550_serialout(priv, UART_LCR_OFFSET, (lcr | UART_LCR_DLAB)); /* Set the BAUD divisor */ @@ -778,6 +779,7 @@ static int u16550_setup(FAR struct uart_dev_s *dev) /* Configure the FIFOs */ + *(volatile uint8_t *)0x10000000 = 'f';//// u16550_serialout(priv, UART_FCR_OFFSET, (UART_FCR_RXTRIGGER_8 | UART_FCR_TXRST | UART_FCR_RXRST | UART_FCR_FIFOEN)); @@ -797,6 +799,7 @@ static int u16550_setup(FAR struct uart_dev_s *dev) mcr |= UART_MCR_RTS; + *(volatile uint8_t *)0x10000000 = 'g';//// u16550_serialout(priv, UART_MCR_OFFSET, mcr); #endif /* defined(CONFIG_SERIAL_IFLOWCONTROL) || defined(CONFIG_SERIAL_OFLOWCONTROL) */ @@ -1604,8 +1607,9 @@ static void u16550_txint(struct uart_dev_s *dev, bool enable) static bool u16550_txready(struct uart_dev_s *dev) { - FAR struct u16550_s *priv = (FAR struct u16550_s *)dev->priv; - return ((u16550_serialin(priv, UART_LSR_OFFSET) & UART_LSR_THRE) != 0); + return true; + ////FAR struct u16550_s *priv = (FAR struct u16550_s *)dev->priv; + ////return ((u16550_serialin(priv, UART_LSR_OFFSET) & UART_LSR_THRE) != 0); } /**************************************************************************** @@ -1633,7 +1637,7 @@ static bool u16550_txempty(struct uart_dev_s *dev) #ifdef HAVE_16550_CONSOLE static void u16550_putc(FAR struct u16550_s *priv, int ch) { - while ((u16550_serialin(priv, UART_LSR_OFFSET) & UART_LSR_THRE) == 0); + ////while ((u16550_serialin(priv, UART_LSR_OFFSET) & UART_LSR_THRE) == 0); u16550_serialout(priv, UART_THR_OFFSET, (uart_datawidth_t)ch); } #endif From 093a5313c1788c2c0da3bfecd6b757275cf3cac0 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Tue, 4 Jul 2023 17:45:56 +0800 Subject: [PATCH 022/108] Hang in riscv_earlyserialinit --- arch/risc-v/src/qemu-rv/qemu_rv_start.c | 13 +++++++------ drivers/serial/uart_16550.c | 14 ++++++++------ 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_start.c b/arch/risc-v/src/qemu-rv/qemu_rv_start.c index 06c98f07f844f..211b608270f9c 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_start.c +++ b/arch/risc-v/src/qemu-rv/qemu_rv_start.c @@ -118,18 +118,19 @@ void qemu_rv_start(int mhartid) #endif *(volatile uint8_t *)0x10000000 = 'F';//// - showprogress('A'); + ////showprogress('A'); #ifdef USE_EARLYSERIALINIT *(volatile uint8_t *)0x10000000 = 'G';//// - riscv_earlyserialinit(); + ////riscv_earlyserialinit(); #endif - showprogress('B'); + *(volatile uint8_t *)0x10000000 = 'H';//// + ////showprogress('B'); /* Do board initialization */ - showprogress('C'); + ////showprogress('C'); #ifdef CONFIG_BUILD_KERNEL /* Setup page tables for kernel and enable MMU */ @@ -139,13 +140,13 @@ void qemu_rv_start(int mhartid) /* Call nx_start() */ - *(volatile uint8_t *)0x10000000 = 'H';//// + *(volatile uint8_t *)0x10000000 = 'I';//// nx_start(); cpux: #ifdef CONFIG_SMP - *(volatile uint8_t *)0x10000000 = 'I';//// + *(volatile uint8_t *)0x10000000 = 'J';//// riscv_cpu_boot(mhartid); #endif diff --git a/drivers/serial/uart_16550.c b/drivers/serial/uart_16550.c index 4f885dc9e4161..49085392fbb4d 100644 --- a/drivers/serial/uart_16550.c +++ b/drivers/serial/uart_16550.c @@ -705,7 +705,7 @@ static int u16550_setup(FAR struct uart_dev_s *dev) *(volatile uint8_t *)0x10000000 = 'c';//// #ifndef CONFIG_16550_SUPRESS_CONFIG FAR struct u16550_s *priv = (FAR struct u16550_s *)dev->priv; - uint16_t div; + ////uint16_t div; uint32_t lcr; #if defined(CONFIG_SERIAL_IFLOWCONTROL) || defined(CONFIG_SERIAL_OFLOWCONTROL) uint32_t mcr; @@ -765,17 +765,17 @@ static int u16550_setup(FAR struct uart_dev_s *dev) /* Enter DLAB=1 */ *(volatile uint8_t *)0x10000000 = 'e';//// - u16550_serialout(priv, UART_LCR_OFFSET, (lcr | UART_LCR_DLAB)); + ////u16550_serialout(priv, UART_LCR_OFFSET, (lcr | UART_LCR_DLAB)); /* Set the BAUD divisor */ - div = u16550_divisor(priv); - u16550_serialout(priv, UART_DLM_OFFSET, div >> 8); - u16550_serialout(priv, UART_DLL_OFFSET, div & 0xff); + ////div = u16550_divisor(priv); + ////u16550_serialout(priv, UART_DLM_OFFSET, div >> 8); + ////u16550_serialout(priv, UART_DLL_OFFSET, div & 0xff); /* Clear DLAB */ - u16550_serialout(priv, UART_LCR_OFFSET, lcr); + ////u16550_serialout(priv, UART_LCR_OFFSET, lcr); /* Configure the FIFOs */ @@ -1637,8 +1637,10 @@ static bool u16550_txempty(struct uart_dev_s *dev) #ifdef HAVE_16550_CONSOLE static void u16550_putc(FAR struct u16550_s *priv, int ch) { + *(volatile uint8_t *)0x10000000 = 'h';//// ////while ((u16550_serialin(priv, UART_LSR_OFFSET) & UART_LSR_THRE) == 0); u16550_serialout(priv, UART_THR_OFFSET, (uart_datawidth_t)ch); + *(volatile uint8_t *)0x10000000 = 'i';//// } #endif From ef9618a819cb23c98d6933bf2196a8fe85847d82 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Tue, 4 Jul 2023 17:47:56 +0800 Subject: [PATCH 023/108] Hang in nx_start --- arch/risc-v/src/qemu-rv/qemu_rv_start.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_start.c b/arch/risc-v/src/qemu-rv/qemu_rv_start.c index 211b608270f9c..3502cfb1135fa 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_start.c +++ b/arch/risc-v/src/qemu-rv/qemu_rv_start.c @@ -150,7 +150,7 @@ void qemu_rv_start(int mhartid) riscv_cpu_boot(mhartid); #endif - *(volatile uint8_t *)0x10000000 = 'J';//// + *(volatile uint8_t *)0x10000000 = 'K';//// while (true) { asm("WFI"); From b82ffafbadaad7f2f3d0a3c75cd568f270c5c259 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Tue, 4 Jul 2023 17:54:22 +0800 Subject: [PATCH 024/108] Hangs in enter_critical_section --- arch/risc-v/src/qemu-rv/qemu_rv_start.c | 6 +++--- drivers/serial/uart_16550.c | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_start.c b/arch/risc-v/src/qemu-rv/qemu_rv_start.c index 3502cfb1135fa..10e19f0068e1d 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_start.c +++ b/arch/risc-v/src/qemu-rv/qemu_rv_start.c @@ -118,7 +118,7 @@ void qemu_rv_start(int mhartid) #endif *(volatile uint8_t *)0x10000000 = 'F';//// - ////showprogress('A'); + showprogress('A'); #ifdef USE_EARLYSERIALINIT *(volatile uint8_t *)0x10000000 = 'G';//// @@ -126,11 +126,11 @@ void qemu_rv_start(int mhartid) #endif *(volatile uint8_t *)0x10000000 = 'H';//// - ////showprogress('B'); + showprogress('B'); /* Do board initialization */ - ////showprogress('C'); + showprogress('C'); #ifdef CONFIG_BUILD_KERNEL /* Setup page tables for kernel and enable MMU */ diff --git a/drivers/serial/uart_16550.c b/drivers/serial/uart_16550.c index 49085392fbb4d..9294bba04eb52 100644 --- a/drivers/serial/uart_16550.c +++ b/drivers/serial/uart_16550.c @@ -1715,13 +1715,13 @@ void u16550_serialinit(void) int up_putc(int ch) { FAR struct u16550_s *priv = (FAR struct u16550_s *)CONSOLE_DEV.priv; - irqstate_t flags; + ////irqstate_t flags; /* All interrupts must be disabled to prevent re-entrancy and to prevent * interrupts from firing in the serial driver code. */ - flags = enter_critical_section(); + ////flags = enter_critical_section(); /* Check for LF */ @@ -1733,7 +1733,7 @@ int up_putc(int ch) } u16550_putc(priv, ch); - leave_critical_section(flags); + ////leave_critical_section(flags); return ch; } From e057296f1943e4678ce14ea474d287ea8b89e9c6 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Tue, 4 Jul 2023 17:57:34 +0800 Subject: [PATCH 025/108] Hangs in enter_critical_section --- drivers/serial/uart_16550.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/drivers/serial/uart_16550.c b/drivers/serial/uart_16550.c index 9294bba04eb52..0233d7a0d4bdc 100644 --- a/drivers/serial/uart_16550.c +++ b/drivers/serial/uart_16550.c @@ -1607,9 +1607,8 @@ static void u16550_txint(struct uart_dev_s *dev, bool enable) static bool u16550_txready(struct uart_dev_s *dev) { - return true; - ////FAR struct u16550_s *priv = (FAR struct u16550_s *)dev->priv; - ////return ((u16550_serialin(priv, UART_LSR_OFFSET) & UART_LSR_THRE) != 0); + FAR struct u16550_s *priv = (FAR struct u16550_s *)dev->priv; + return ((u16550_serialin(priv, UART_LSR_OFFSET) & UART_LSR_THRE) != 0); } /**************************************************************************** @@ -1637,10 +1636,8 @@ static bool u16550_txempty(struct uart_dev_s *dev) #ifdef HAVE_16550_CONSOLE static void u16550_putc(FAR struct u16550_s *priv, int ch) { - *(volatile uint8_t *)0x10000000 = 'h';//// - ////while ((u16550_serialin(priv, UART_LSR_OFFSET) & UART_LSR_THRE) == 0); + while ((u16550_serialin(priv, UART_LSR_OFFSET) & UART_LSR_THRE) == 0); u16550_serialout(priv, UART_THR_OFFSET, (uart_datawidth_t)ch); - *(volatile uint8_t *)0x10000000 = 'i';//// } #endif From 541b22ddd75072b951cd1bf3cc7b546fe5e77cee Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Tue, 4 Jul 2023 17:59:39 +0800 Subject: [PATCH 026/108] Hangs in THRE --- drivers/serial/uart_16550.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/drivers/serial/uart_16550.c b/drivers/serial/uart_16550.c index 0233d7a0d4bdc..7c31c82ee9b42 100644 --- a/drivers/serial/uart_16550.c +++ b/drivers/serial/uart_16550.c @@ -1607,8 +1607,9 @@ static void u16550_txint(struct uart_dev_s *dev, bool enable) static bool u16550_txready(struct uart_dev_s *dev) { - FAR struct u16550_s *priv = (FAR struct u16550_s *)dev->priv; - return ((u16550_serialin(priv, UART_LSR_OFFSET) & UART_LSR_THRE) != 0); + return true; + ////FAR struct u16550_s *priv = (FAR struct u16550_s *)dev->priv; + ////return ((u16550_serialin(priv, UART_LSR_OFFSET) & UART_LSR_THRE) != 0); } /**************************************************************************** @@ -1636,7 +1637,7 @@ static bool u16550_txempty(struct uart_dev_s *dev) #ifdef HAVE_16550_CONSOLE static void u16550_putc(FAR struct u16550_s *priv, int ch) { - while ((u16550_serialin(priv, UART_LSR_OFFSET) & UART_LSR_THRE) == 0); + ////while ((u16550_serialin(priv, UART_LSR_OFFSET) & UART_LSR_THRE) == 0); u16550_serialout(priv, UART_THR_OFFSET, (uart_datawidth_t)ch); } #endif From 13e6af4049d9f86bce019c9729f5ddd005f06740 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Tue, 4 Jul 2023 19:28:59 +0800 Subject: [PATCH 027/108] Change RAM Address --- boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig b/boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig index 5500f7d76415c..2e8017808a71f 100644 --- a/boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig +++ b/boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig @@ -31,9 +31,9 @@ CONFIG_ARCH_HEAP_VBASE=0xC0200000 CONFIG_ARCH_INTERRUPTSTACK=2048 CONFIG_ARCH_KERNEL_STACKSIZE=3072 CONFIG_ARCH_PGPOOL_MAPPING=y -CONFIG_ARCH_PGPOOL_PBASE=0x80400000 +CONFIG_ARCH_PGPOOL_PBASE=0x40500000 CONFIG_ARCH_PGPOOL_SIZE=4194304 -CONFIG_ARCH_PGPOOL_VBASE=0x80400000 +CONFIG_ARCH_PGPOOL_VBASE=0x40500000 CONFIG_ARCH_RISCV=y CONFIG_ARCH_STACKDUMP=y CONFIG_ARCH_TEXT_NPAGES=128 @@ -77,7 +77,7 @@ CONFIG_NSH_FILE_APPS=y CONFIG_NSH_READLINE=y CONFIG_PATH_INITIAL="/system/bin" CONFIG_RAM_SIZE=1048576 -CONFIG_RAM_START=0x80100000 +CONFIG_RAM_START=0x40200000 CONFIG_READLINE_CMD_HISTORY=y CONFIG_RISCV_SEMIHOSTING_HOSTFS=y CONFIG_RR_INTERVAL=200 From 4dcd007dd3e940f42eaf28a89880d96b004987f2 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Tue, 4 Jul 2023 19:46:13 +0800 Subject: [PATCH 028/108] Enable Critical Section with rv-virt:knsh64. Garbled output --- drivers/serial/uart_16550.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/serial/uart_16550.c b/drivers/serial/uart_16550.c index 7c31c82ee9b42..7b1fd4085237b 100644 --- a/drivers/serial/uart_16550.c +++ b/drivers/serial/uart_16550.c @@ -1713,13 +1713,13 @@ void u16550_serialinit(void) int up_putc(int ch) { FAR struct u16550_s *priv = (FAR struct u16550_s *)CONSOLE_DEV.priv; - ////irqstate_t flags; + irqstate_t flags; /* All interrupts must be disabled to prevent re-entrancy and to prevent * interrupts from firing in the serial driver code. */ - ////flags = enter_critical_section(); + flags = enter_critical_section(); /* Check for LF */ @@ -1731,7 +1731,7 @@ int up_putc(int ch) } u16550_putc(priv, ch); - ////leave_critical_section(flags); + leave_critical_section(flags); return ch; } From 4f5d9641519df47d82b2562700ba6324b5393aea Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Tue, 4 Jul 2023 19:56:23 +0800 Subject: [PATCH 029/108] Skip init m-mode. Hang in riscv_earlyserialinit --- arch/risc-v/src/qemu-rv/qemu_rv_start.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_start.c b/arch/risc-v/src/qemu-rv/qemu_rv_start.c index 10e19f0068e1d..d822351bc880b 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_start.c +++ b/arch/risc-v/src/qemu-rv/qemu_rv_start.c @@ -122,7 +122,7 @@ void qemu_rv_start(int mhartid) #ifdef USE_EARLYSERIALINIT *(volatile uint8_t *)0x10000000 = 'G';//// - ////riscv_earlyserialinit(); + riscv_earlyserialinit(); #endif *(volatile uint8_t *)0x10000000 = 'H';//// @@ -165,6 +165,8 @@ void qemu_rv_start(int mhartid) void qemu_rv_start(int mhartid) { + qemu_rv_start_s(mhartid); //// +#ifdef TODO //// /* NOTE: still in M-mode */ if (0 == mhartid) @@ -224,6 +226,7 @@ void qemu_rv_start(int mhartid) "mret \n" :: "r" (mhartid) ); +#endif //// TODO } #endif From 6285e1cf7bbbccd827e24532eab0efafd204e377 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Tue, 4 Jul 2023 20:00:09 +0800 Subject: [PATCH 030/108] Disable riscv_earlyserialinit. Critical section OK with rv-virt:knsh64 --- arch/risc-v/src/qemu-rv/qemu_rv_start.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_start.c b/arch/risc-v/src/qemu-rv/qemu_rv_start.c index d822351bc880b..ce22df7cbb7ad 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_start.c +++ b/arch/risc-v/src/qemu-rv/qemu_rv_start.c @@ -122,7 +122,7 @@ void qemu_rv_start(int mhartid) #ifdef USE_EARLYSERIALINIT *(volatile uint8_t *)0x10000000 = 'G';//// - riscv_earlyserialinit(); + ////riscv_earlyserialinit(); #endif *(volatile uint8_t *)0x10000000 = 'H';//// From 62764c1f916c39ddb22e5ff4b1a6bafd1d4412e4 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Wed, 5 Jul 2023 10:54:22 +0800 Subject: [PATCH 031/108] Fix knsh64 PBASE and VBASE --- boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig b/boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig index 2e8017808a71f..da03c971932cc 100644 --- a/boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig +++ b/boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig @@ -31,9 +31,9 @@ CONFIG_ARCH_HEAP_VBASE=0xC0200000 CONFIG_ARCH_INTERRUPTSTACK=2048 CONFIG_ARCH_KERNEL_STACKSIZE=3072 CONFIG_ARCH_PGPOOL_MAPPING=y -CONFIG_ARCH_PGPOOL_PBASE=0x40500000 +CONFIG_ARCH_PGPOOL_PBASE=0x40600000 CONFIG_ARCH_PGPOOL_SIZE=4194304 -CONFIG_ARCH_PGPOOL_VBASE=0x40500000 +CONFIG_ARCH_PGPOOL_VBASE=0x40600000 CONFIG_ARCH_RISCV=y CONFIG_ARCH_STACKDUMP=y CONFIG_ARCH_TEXT_NPAGES=128 From 751f24d21aa904bda63bb564c5a0f5e1dc3d28fe Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Wed, 5 Jul 2023 12:31:52 +0800 Subject: [PATCH 032/108] Don't load the Interrupt Vector Table, use OpenSBI for crash logging --- arch/risc-v/src/qemu-rv/qemu_rv_head.S | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_head.S b/arch/risc-v/src/qemu-rv/qemu_rv_head.S index d60e05d15fee0..896b5d9403a62 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_head.S +++ b/arch/risc-v/src/qemu-rv/qemu_rv_head.S @@ -172,8 +172,9 @@ real_start: csrw sie, zero /* Previously: csrw mie, zero */ - la t0, __trap_vec - csrw stvec, t0 + /* Don't load the Interrupt Vector Table, use OpenSBI for crash logging */ + /* la t0, __trap_vec */ + /* csrw stvec, t0 */ /* Previously: csrw mtvec, t0 */ /* Print `7` */ From 87b91e68045246c4f50d834de5657b432e0079a5 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Wed, 5 Jul 2023 12:47:34 +0800 Subject: [PATCH 033/108] u16550_setup OK --- arch/risc-v/src/qemu-rv/qemu_rv_start.c | 2 +- drivers/serial/uart_16550.c | 25 ++++++++++++++++--------- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_start.c b/arch/risc-v/src/qemu-rv/qemu_rv_start.c index ce22df7cbb7ad..d822351bc880b 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_start.c +++ b/arch/risc-v/src/qemu-rv/qemu_rv_start.c @@ -122,7 +122,7 @@ void qemu_rv_start(int mhartid) #ifdef USE_EARLYSERIALINIT *(volatile uint8_t *)0x10000000 = 'G';//// - ////riscv_earlyserialinit(); + riscv_earlyserialinit(); #endif *(volatile uint8_t *)0x10000000 = 'H';//// diff --git a/drivers/serial/uart_16550.c b/drivers/serial/uart_16550.c index 7b1fd4085237b..a928f0b2ae3da 100644 --- a/drivers/serial/uart_16550.c +++ b/drivers/serial/uart_16550.c @@ -713,17 +713,22 @@ static int u16550_setup(FAR struct uart_dev_s *dev) /* Clear fifos */ + *(volatile uint8_t *)0x10000000 = 'd';//// u16550_serialout(priv, UART_FCR_OFFSET, (UART_FCR_RXRST | UART_FCR_TXRST)); +#ifdef TODO //// /* Set trigger */ + *(volatile uint8_t *)0x10000000 = 'e';//// u16550_serialout(priv, UART_FCR_OFFSET, (UART_FCR_FIFOEN | UART_FCR_RXTRIGGER_8)); /* Set up the IER */ + *(volatile uint8_t *)0x10000000 = 'f';//// priv->ier = u16550_serialin(priv, UART_IER_OFFSET); +#endif //// TODO /* Set up the LCR */ @@ -762,27 +767,29 @@ static int u16550_setup(FAR struct uart_dev_s *dev) lcr |= (UART_LCR_PEN | UART_LCR_EPS); } +#ifdef TODO //// /* Enter DLAB=1 */ - *(volatile uint8_t *)0x10000000 = 'e';//// - ////u16550_serialout(priv, UART_LCR_OFFSET, (lcr | UART_LCR_DLAB)); + *(volatile uint8_t *)0x10000000 = 'g';//// + u16550_serialout(priv, UART_LCR_OFFSET, (lcr | UART_LCR_DLAB)); /* Set the BAUD divisor */ - ////div = u16550_divisor(priv); - ////u16550_serialout(priv, UART_DLM_OFFSET, div >> 8); - ////u16550_serialout(priv, UART_DLL_OFFSET, div & 0xff); + div = u16550_divisor(priv); + u16550_serialout(priv, UART_DLM_OFFSET, div >> 8); + u16550_serialout(priv, UART_DLL_OFFSET, div & 0xff); /* Clear DLAB */ - ////u16550_serialout(priv, UART_LCR_OFFSET, lcr); + u16550_serialout(priv, UART_LCR_OFFSET, lcr); /* Configure the FIFOs */ - *(volatile uint8_t *)0x10000000 = 'f';//// + *(volatile uint8_t *)0x10000000 = 'h';//// u16550_serialout(priv, UART_FCR_OFFSET, (UART_FCR_RXTRIGGER_8 | UART_FCR_TXRST | UART_FCR_RXRST | UART_FCR_FIFOEN)); +#endif //// TODO /* Set up the auto flow control */ @@ -799,7 +806,7 @@ static int u16550_setup(FAR struct uart_dev_s *dev) mcr |= UART_MCR_RTS; - *(volatile uint8_t *)0x10000000 = 'g';//// + *(volatile uint8_t *)0x10000000 = 'i';//// u16550_serialout(priv, UART_MCR_OFFSET, mcr); #endif /* defined(CONFIG_SERIAL_IFLOWCONTROL) || defined(CONFIG_SERIAL_OFLOWCONTROL) */ @@ -810,7 +817,7 @@ static int u16550_setup(FAR struct uart_dev_s *dev) #endif #endif - *(volatile uint8_t *)0x10000000 = 'd';//// + *(volatile uint8_t *)0x10000000 = 'j';//// return OK; } From a34d0360e709c6519f3436ce5bec7cb1ce082815 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Wed, 5 Jul 2023 12:56:38 +0800 Subject: [PATCH 034/108] Disable riscv_earlyserialinit --- arch/risc-v/src/qemu-rv/qemu_rv_start.c | 2 +- drivers/serial/uart_16550.c | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_start.c b/arch/risc-v/src/qemu-rv/qemu_rv_start.c index d822351bc880b..ce22df7cbb7ad 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_start.c +++ b/arch/risc-v/src/qemu-rv/qemu_rv_start.c @@ -122,7 +122,7 @@ void qemu_rv_start(int mhartid) #ifdef USE_EARLYSERIALINIT *(volatile uint8_t *)0x10000000 = 'G';//// - riscv_earlyserialinit(); + ////riscv_earlyserialinit(); #endif *(volatile uint8_t *)0x10000000 = 'H';//// diff --git a/drivers/serial/uart_16550.c b/drivers/serial/uart_16550.c index a928f0b2ae3da..98067123d5069 100644 --- a/drivers/serial/uart_16550.c +++ b/drivers/serial/uart_16550.c @@ -794,6 +794,7 @@ static int u16550_setup(FAR struct uart_dev_s *dev) /* Set up the auto flow control */ #if defined(CONFIG_SERIAL_IFLOWCONTROL) || defined(CONFIG_SERIAL_OFLOWCONTROL) + *(volatile uint8_t *)0x10000000 = 'i';//// mcr = u16550_serialin(priv, UART_MCR_OFFSET); if (priv->flow) { @@ -806,18 +807,19 @@ static int u16550_setup(FAR struct uart_dev_s *dev) mcr |= UART_MCR_RTS; - *(volatile uint8_t *)0x10000000 = 'i';//// + *(volatile uint8_t *)0x10000000 = 'j';//// u16550_serialout(priv, UART_MCR_OFFSET, mcr); #endif /* defined(CONFIG_SERIAL_IFLOWCONTROL) || defined(CONFIG_SERIAL_OFLOWCONTROL) */ /* Reconfigure DMA Rx timeout value */ #ifdef HAVE_16550_UART_DMA + *(volatile uint8_t *)0x10000000 = 'k';//// u16550_dmarxconfig(dev); #endif #endif - *(volatile uint8_t *)0x10000000 = 'j';//// + *(volatile uint8_t *)0x10000000 = 'l';//// return OK; } From 5f5df15e4f2e1105c1315344bbc73da3457a21fa Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Thu, 13 Jul 2023 18:13:53 +0800 Subject: [PATCH 035/108] Use NuttX trap vector. Something garbled is printed --- arch/risc-v/src/qemu-rv/qemu_rv_head.S | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_head.S b/arch/risc-v/src/qemu-rv/qemu_rv_head.S index 896b5d9403a62..d60e05d15fee0 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_head.S +++ b/arch/risc-v/src/qemu-rv/qemu_rv_head.S @@ -172,9 +172,8 @@ real_start: csrw sie, zero /* Previously: csrw mie, zero */ - /* Don't load the Interrupt Vector Table, use OpenSBI for crash logging */ - /* la t0, __trap_vec */ - /* csrw stvec, t0 */ + la t0, __trap_vec + csrw stvec, t0 /* Previously: csrw mtvec, t0 */ /* Print `7` */ From 04e3bfbded1c3da2de51db3941a9fe63815b9a0f Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Thu, 13 Jul 2023 19:02:45 +0800 Subject: [PATCH 036/108] Comment out UART Setup. 123067DFAGHBCIcl --- drivers/serial/uart_16550.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/serial/uart_16550.c b/drivers/serial/uart_16550.c index 98067123d5069..b7f88400540d3 100644 --- a/drivers/serial/uart_16550.c +++ b/drivers/serial/uart_16550.c @@ -703,6 +703,7 @@ static inline uint32_t u16550_divisor(FAR struct u16550_s *priv) static int u16550_setup(FAR struct uart_dev_s *dev) { *(volatile uint8_t *)0x10000000 = 'c';//// +#ifdef TODO //// #ifndef CONFIG_16550_SUPRESS_CONFIG FAR struct u16550_s *priv = (FAR struct u16550_s *)dev->priv; ////uint16_t div; @@ -819,6 +820,7 @@ static int u16550_setup(FAR struct uart_dev_s *dev) #endif #endif +#endif //// TODO *(volatile uint8_t *)0x10000000 = 'l';//// return OK; } From 4fd337e5a1b4a24dc81a10f856d8fe85bb8d4abf Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Thu, 13 Jul 2023 19:07:09 +0800 Subject: [PATCH 037/108] Restore riscv_earlyserialinit. 123067DFAGaclbH --- arch/risc-v/src/qemu-rv/qemu_rv_start.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_start.c b/arch/risc-v/src/qemu-rv/qemu_rv_start.c index ce22df7cbb7ad..d822351bc880b 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_start.c +++ b/arch/risc-v/src/qemu-rv/qemu_rv_start.c @@ -122,7 +122,7 @@ void qemu_rv_start(int mhartid) #ifdef USE_EARLYSERIALINIT *(volatile uint8_t *)0x10000000 = 'G';//// - ////riscv_earlyserialinit(); + riscv_earlyserialinit(); #endif *(volatile uint8_t *)0x10000000 = 'H';//// From a678f68e8c1af7c5547e18677ee3233335985ce8 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Thu, 13 Jul 2023 19:27:28 +0800 Subject: [PATCH 038/108] Restore UART wait. 123067DF --- drivers/serial/uart_16550.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/drivers/serial/uart_16550.c b/drivers/serial/uart_16550.c index b7f88400540d3..45fa335c51c9b 100644 --- a/drivers/serial/uart_16550.c +++ b/drivers/serial/uart_16550.c @@ -601,6 +601,7 @@ static uart_dev_t g_uart3port = static inline uart_datawidth_t u16550_serialin(FAR struct u16550_s *priv, int offset) { + DEBUGASSERT(priv != NULL); DEBUGASSERT(priv->uartbase == 0x10000000); //// #ifdef CONFIG_SERIAL_UART_ARCH_MMIO return *((FAR volatile uart_datawidth_t *)priv->uartbase + offset); #else @@ -615,6 +616,7 @@ static inline uart_datawidth_t u16550_serialin(FAR struct u16550_s *priv, static inline void u16550_serialout(FAR struct u16550_s *priv, int offset, uart_datawidth_t value) { + DEBUGASSERT(priv != NULL); DEBUGASSERT(priv->uartbase == 0x10000000); //// #ifdef CONFIG_SERIAL_UART_ARCH_MMIO *((FAR volatile uart_datawidth_t *)priv->uartbase + offset) = value; #else @@ -1619,8 +1621,8 @@ static void u16550_txint(struct uart_dev_s *dev, bool enable) static bool u16550_txready(struct uart_dev_s *dev) { return true; - ////FAR struct u16550_s *priv = (FAR struct u16550_s *)dev->priv; - ////return ((u16550_serialin(priv, UART_LSR_OFFSET) & UART_LSR_THRE) != 0); + FAR struct u16550_s *priv = (FAR struct u16550_s *)dev->priv; + return ((u16550_serialin(priv, UART_LSR_OFFSET) & UART_LSR_THRE) != 0); } /**************************************************************************** @@ -1648,7 +1650,7 @@ static bool u16550_txempty(struct uart_dev_s *dev) #ifdef HAVE_16550_CONSOLE static void u16550_putc(FAR struct u16550_s *priv, int ch) { - ////while ((u16550_serialin(priv, UART_LSR_OFFSET) & UART_LSR_THRE) == 0); + while ((u16550_serialin(priv, UART_LSR_OFFSET) & UART_LSR_THRE) == 0); u16550_serialout(priv, UART_THR_OFFSET, (uart_datawidth_t)ch); } #endif From 236a2b0d1d6d9f3b2daa09816e6b3af1246fa740 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Thu, 13 Jul 2023 19:30:00 +0800 Subject: [PATCH 039/108] Check UART Base. 123067DF --- drivers/serial/uart_16550.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/serial/uart_16550.c b/drivers/serial/uart_16550.c index 45fa335c51c9b..3dc8535a23fea 100644 --- a/drivers/serial/uart_16550.c +++ b/drivers/serial/uart_16550.c @@ -601,6 +601,7 @@ static uart_dev_t g_uart3port = static inline uart_datawidth_t u16550_serialin(FAR struct u16550_s *priv, int offset) { + if (priv == NULL || priv->uartbase != 0x10000000) { *(volatile uint8_t *)0x10000000 = '!'; } //// DEBUGASSERT(priv != NULL); DEBUGASSERT(priv->uartbase == 0x10000000); //// #ifdef CONFIG_SERIAL_UART_ARCH_MMIO return *((FAR volatile uart_datawidth_t *)priv->uartbase + offset); @@ -616,6 +617,7 @@ static inline uart_datawidth_t u16550_serialin(FAR struct u16550_s *priv, static inline void u16550_serialout(FAR struct u16550_s *priv, int offset, uart_datawidth_t value) { + if (priv == NULL || priv->uartbase != 0x10000000) { *(volatile uint8_t *)0x10000000 = '!'; } //// DEBUGASSERT(priv != NULL); DEBUGASSERT(priv->uartbase == 0x10000000); //// #ifdef CONFIG_SERIAL_UART_ARCH_MMIO *((FAR volatile uart_datawidth_t *)priv->uartbase + offset) = value; From 5e3b755135b02a90adf7198f7aa44b022bab2875 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Thu, 13 Jul 2023 19:35:12 +0800 Subject: [PATCH 040/108] Clear BSS. 123067DF --- arch/risc-v/src/qemu-rv/qemu_rv_start.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_start.c b/arch/risc-v/src/qemu-rv/qemu_rv_start.c index d822351bc880b..02c6fc61511ba 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_start.c +++ b/arch/risc-v/src/qemu-rv/qemu_rv_start.c @@ -165,6 +165,8 @@ void qemu_rv_start(int mhartid) void qemu_rv_start(int mhartid) { + DEBUGASSERT(mhartid == 0); //// + if (0 == mhartid) { qemu_rv_clear_bss(); } //// qemu_rv_start_s(mhartid); //// #ifdef TODO //// /* NOTE: still in M-mode */ From 71ce60fd77364656cf27d2a99516277cb9d92321 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Fri, 14 Jul 2023 09:39:39 +0800 Subject: [PATCH 041/108] Fixing u16550_putc. 123067DFm --- drivers/serial/uart_16550.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/serial/uart_16550.c b/drivers/serial/uart_16550.c index 3dc8535a23fea..f37e698616d6e 100644 --- a/drivers/serial/uart_16550.c +++ b/drivers/serial/uart_16550.c @@ -1652,8 +1652,11 @@ static bool u16550_txempty(struct uart_dev_s *dev) #ifdef HAVE_16550_CONSOLE static void u16550_putc(FAR struct u16550_s *priv, int ch) { + *(volatile uint8_t *)0x10000000 = 'm';//// while ((u16550_serialin(priv, UART_LSR_OFFSET) & UART_LSR_THRE) == 0); + *(volatile uint8_t *)0x10000000 = 'n';//// u16550_serialout(priv, UART_THR_OFFSET, (uart_datawidth_t)ch); + *(volatile uint8_t *)0x10000000 = 'o';//// } #endif From 6cd805f0274ecb7d85476196612e073026209215 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Fri, 14 Jul 2023 09:52:57 +0800 Subject: [PATCH 042/108] Fixing u16550_putc. 123067DFmoooooooo --- drivers/serial/uart_16550.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/drivers/serial/uart_16550.c b/drivers/serial/uart_16550.c index f37e698616d6e..e9b64f6bc66df 100644 --- a/drivers/serial/uart_16550.c +++ b/drivers/serial/uart_16550.c @@ -1653,10 +1653,13 @@ static bool u16550_txempty(struct uart_dev_s *dev) static void u16550_putc(FAR struct u16550_s *priv, int ch) { *(volatile uint8_t *)0x10000000 = 'm';//// + while ((*(volatile uint8_t *)(0x10000000 + UART_LSR_OFFSET) & UART_LSR_THRE) == 0) { + *(volatile uint8_t *)0x10000000 = 'o';//// + } + *(volatile uint8_t *)0x10000000 = 'p';//// while ((u16550_serialin(priv, UART_LSR_OFFSET) & UART_LSR_THRE) == 0); - *(volatile uint8_t *)0x10000000 = 'n';//// u16550_serialout(priv, UART_THR_OFFSET, (uart_datawidth_t)ch); - *(volatile uint8_t *)0x10000000 = 'o';//// + *(volatile uint8_t *)0x10000000 = 'q';//// } #endif From 55bfcde5f9b497ac4cd99915194840a1a580ec3c Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Fri, 14 Jul 2023 12:22:56 +0800 Subject: [PATCH 043/108] Debug UART Addr. 123067DFm155Eoo --- drivers/serial/uart_16550.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/drivers/serial/uart_16550.c b/drivers/serial/uart_16550.c index e9b64f6bc66df..abbc2708b010d 100644 --- a/drivers/serial/uart_16550.c +++ b/drivers/serial/uart_16550.c @@ -1653,9 +1653,20 @@ static bool u16550_txempty(struct uart_dev_s *dev) static void u16550_putc(FAR struct u16550_s *priv, int ch) { *(volatile uint8_t *)0x10000000 = 'm';//// +#define TEST_UART_ADDR //// +#ifdef TEST_UART_ADDR //// + uint64_t addr = (uint64_t)((FAR volatile uart_datawidth_t *)0x10000000 + UART_LSR_OFFSET); + *(volatile uint8_t *)0x10000000 = '0' + CONFIG_16550_REGINCR;//// + *(volatile uint8_t *)0x10000000 = '0' + UART_LSR_INCR;//// + *(volatile uint8_t *)0x10000000 = '0' + UART_LSR_OFFSET;//// + *(volatile uint8_t *)0x10000000 = '0' + (addr % 0xff);//// while ((*(volatile uint8_t *)(0x10000000 + UART_LSR_OFFSET) & UART_LSR_THRE) == 0) { + static int counter = 0; + if (counter++ == 10) { break; } *(volatile uint8_t *)0x10000000 = 'o';//// } +#endif //// TEST_UART_ADDR + *(volatile uint8_t *)0x10000000 = 'p';//// while ((u16550_serialin(priv, UART_LSR_OFFSET) & UART_LSR_THRE) == 0); u16550_serialout(priv, UART_THR_OFFSET, (uart_datawidth_t)ch); From 606d7a73b17a6d61d226e670b1f7f63c66dc9db5 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Fri, 14 Jul 2023 13:50:49 +0800 Subject: [PATCH 044/108] CONFIG_16550_REGINCR=4 yay! 123067DFm45DTpAqGaclbHm45DTpBqm45DTpCqI --- drivers/serial/uart_16550.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/drivers/serial/uart_16550.c b/drivers/serial/uart_16550.c index abbc2708b010d..c9f113584da19 100644 --- a/drivers/serial/uart_16550.c +++ b/drivers/serial/uart_16550.c @@ -1660,11 +1660,11 @@ static void u16550_putc(FAR struct u16550_s *priv, int ch) *(volatile uint8_t *)0x10000000 = '0' + UART_LSR_INCR;//// *(volatile uint8_t *)0x10000000 = '0' + UART_LSR_OFFSET;//// *(volatile uint8_t *)0x10000000 = '0' + (addr % 0xff);//// - while ((*(volatile uint8_t *)(0x10000000 + UART_LSR_OFFSET) & UART_LSR_THRE) == 0) { - static int counter = 0; - if (counter++ == 10) { break; } - *(volatile uint8_t *)0x10000000 = 'o';//// - } + // while ((*(volatile uint8_t *)(0x10000000 + UART_LSR_OFFSET) & UART_LSR_THRE) == 0) { + // static int counter = 0; + // if (counter++ == 10) { break; } + // *(volatile uint8_t *)0x10000000 = 'o';//// + // } #endif //// TEST_UART_ADDR *(volatile uint8_t *)0x10000000 = 'p';//// From ef8340496914373a2e11f43ef441332018c793c9 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Fri, 14 Jul 2023 14:00:06 +0800 Subject: [PATCH 045/108] CONFIG_16550_REGINCR=4 yay! 123067DFm45DTpAqGaclbHm45DTpBqm45DTpCqI --- boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig b/boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig index da03c971932cc..2e495710ed188 100644 --- a/boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig +++ b/boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig @@ -8,6 +8,7 @@ # CONFIG_DISABLE_OS_API is not set # CONFIG_NSH_DISABLE_LOSMART is not set CONFIG_16550_ADDRWIDTH=0 +CONFIG_16550_REGINCR=4 CONFIG_16550_UART0=y CONFIG_16550_UART0_BASE=0x10000000 CONFIG_16550_UART0_CLOCK=3686400 @@ -44,10 +45,13 @@ CONFIG_ARCH_USE_S_MODE=y CONFIG_BOARD_LOOPSPERMSEC=6366 CONFIG_BUILD_KERNEL=y CONFIG_DEBUG_ASSERTIONS=y +CONFIG_DEBUG_ASSERTIONS_EXPRESSION=y CONFIG_DEBUG_ERROR=y CONFIG_DEBUG_FEATURES=y CONFIG_DEBUG_FULLOPT=y +CONFIG_DEBUG_INFO=y CONFIG_DEBUG_SYMBOLS=y +CONFIG_DEBUG_WARN=y CONFIG_DEV_ZERO=y CONFIG_ELF=y CONFIG_EXAMPLES_HELLO=m From 12eb3d8ed934b7d699a718e5c1982df8b1eb74c7 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Fri, 14 Jul 2023 14:03:33 +0800 Subject: [PATCH 046/108] Clean up. 123067DFAGaclbHBCI --- drivers/serial/uart_16550.c | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/drivers/serial/uart_16550.c b/drivers/serial/uart_16550.c index c9f113584da19..3dc8535a23fea 100644 --- a/drivers/serial/uart_16550.c +++ b/drivers/serial/uart_16550.c @@ -1652,25 +1652,8 @@ static bool u16550_txempty(struct uart_dev_s *dev) #ifdef HAVE_16550_CONSOLE static void u16550_putc(FAR struct u16550_s *priv, int ch) { - *(volatile uint8_t *)0x10000000 = 'm';//// -#define TEST_UART_ADDR //// -#ifdef TEST_UART_ADDR //// - uint64_t addr = (uint64_t)((FAR volatile uart_datawidth_t *)0x10000000 + UART_LSR_OFFSET); - *(volatile uint8_t *)0x10000000 = '0' + CONFIG_16550_REGINCR;//// - *(volatile uint8_t *)0x10000000 = '0' + UART_LSR_INCR;//// - *(volatile uint8_t *)0x10000000 = '0' + UART_LSR_OFFSET;//// - *(volatile uint8_t *)0x10000000 = '0' + (addr % 0xff);//// - // while ((*(volatile uint8_t *)(0x10000000 + UART_LSR_OFFSET) & UART_LSR_THRE) == 0) { - // static int counter = 0; - // if (counter++ == 10) { break; } - // *(volatile uint8_t *)0x10000000 = 'o';//// - // } -#endif //// TEST_UART_ADDR - - *(volatile uint8_t *)0x10000000 = 'p';//// while ((u16550_serialin(priv, UART_LSR_OFFSET) & UART_LSR_THRE) == 0); u16550_serialout(priv, UART_THR_OFFSET, (uart_datawidth_t)ch); - *(volatile uint8_t *)0x10000000 = 'q';//// } #endif From 3551b48c3f33912e7e2daf264ad3b746d68be558 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Fri, 14 Jul 2023 14:06:18 +0800 Subject: [PATCH 047/108] Use OpenSBI for crash logging. 123067DFAGaclbHBCI --- arch/risc-v/src/qemu-rv/qemu_rv_head.S | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_head.S b/arch/risc-v/src/qemu-rv/qemu_rv_head.S index d60e05d15fee0..896b5d9403a62 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_head.S +++ b/arch/risc-v/src/qemu-rv/qemu_rv_head.S @@ -172,8 +172,9 @@ real_start: csrw sie, zero /* Previously: csrw mie, zero */ - la t0, __trap_vec - csrw stvec, t0 + /* Don't load the Interrupt Vector Table, use OpenSBI for crash logging */ + /* la t0, __trap_vec */ + /* csrw stvec, t0 */ /* Previously: csrw mtvec, t0 */ /* Print `7` */ From 7cf70975365e45f34cfdb4c39f89c829b77cd1d7 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Sat, 15 Jul 2023 15:19:22 +0800 Subject: [PATCH 048/108] Enable Scheduler Debug. nx_start_application: Starting init task: /system/bin/init --- boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig b/boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig index 2e495710ed188..abe02d39c740a 100644 --- a/boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig +++ b/boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig @@ -50,6 +50,10 @@ CONFIG_DEBUG_ERROR=y CONFIG_DEBUG_FEATURES=y CONFIG_DEBUG_FULLOPT=y CONFIG_DEBUG_INFO=y +CONFIG_DEBUG_SCHED=y +CONFIG_DEBUG_SCHED_ERROR=y +CONFIG_DEBUG_SCHED_INFO=y +CONFIG_DEBUG_SCHED_WARN=y CONFIG_DEBUG_SYMBOLS=y CONFIG_DEBUG_WARN=y CONFIG_DEV_ZERO=y @@ -92,7 +96,6 @@ CONFIG_STACK_COLORATION=y CONFIG_START_MONTH=12 CONFIG_START_YEAR=2021 CONFIG_SYMTAB_ORDEREDBYNAME=y -CONFIG_SYSLOG_TIMESTAMP=y CONFIG_SYSTEM_NSH=y CONFIG_SYSTEM_NSH_PROGNAME="init" CONFIG_TESTING_GETPRIME=y From 2891894dfff388298c8174ce1c9efe22e13bc3d5 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Sat, 15 Jul 2023 15:24:23 +0800 Subject: [PATCH 049/108] Switch to NuttX Trap Vector. nx_start_application: Starting init task: /system/bin/init --- arch/risc-v/src/qemu-rv/qemu_rv_head.S | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_head.S b/arch/risc-v/src/qemu-rv/qemu_rv_head.S index 896b5d9403a62..d60e05d15fee0 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_head.S +++ b/arch/risc-v/src/qemu-rv/qemu_rv_head.S @@ -172,9 +172,8 @@ real_start: csrw sie, zero /* Previously: csrw mie, zero */ - /* Don't load the Interrupt Vector Table, use OpenSBI for crash logging */ - /* la t0, __trap_vec */ - /* csrw stvec, t0 */ + la t0, __trap_vec + csrw stvec, t0 /* Previously: csrw mtvec, t0 */ /* Print `7` */ From cad0e95c39ffdb3e94662d3c9ded2f23acabcb8f Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Sat, 15 Jul 2023 15:44:42 +0800 Subject: [PATCH 050/108] exec_spawn never returns --- sched/init/nx_bringup.c | 1 + 1 file changed, 1 insertion(+) diff --git a/sched/init/nx_bringup.c b/sched/init/nx_bringup.c index 6bf2f732e1b32..d46ee727e67f9 100644 --- a/sched/init/nx_bringup.c +++ b/sched/init/nx_bringup.c @@ -296,6 +296,7 @@ static inline void nx_start_application(void) ret = exec_spawn(CONFIG_INIT_FILEPATH, argv, NULL, CONFIG_INIT_SYMTAB, CONFIG_INIT_NEXPORTS, NULL, &attr); + sinfo("ret=%d\n", ret); #endif posix_spawnattr_destroy(&attr); DEBUGASSERT(ret > 0); From dbe104832d7a3bd8681f86f25d18b76af1890a87 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Sat, 15 Jul 2023 15:45:04 +0800 Subject: [PATCH 051/108] exec_spawn never returns --- sched/init/nx_bringup.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sched/init/nx_bringup.c b/sched/init/nx_bringup.c index d46ee727e67f9..8bf1a9d0a7b90 100644 --- a/sched/init/nx_bringup.c +++ b/sched/init/nx_bringup.c @@ -296,7 +296,7 @@ static inline void nx_start_application(void) ret = exec_spawn(CONFIG_INIT_FILEPATH, argv, NULL, CONFIG_INIT_SYMTAB, CONFIG_INIT_NEXPORTS, NULL, &attr); - sinfo("ret=%d\n", ret); + sinfo("ret=%d\n", ret);//// #endif posix_spawnattr_destroy(&attr); DEBUGASSERT(ret > 0); From 2f52bbaaab025c81bd6991cd86384b25c0f6be00 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Sat, 15 Jul 2023 15:55:22 +0800 Subject: [PATCH 052/108] Enable Binary Loader Logging. elf_init: filename: /system/bin/init loadinfo: 0x404069e8 --- boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig b/boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig index abe02d39c740a..837793fb48bcf 100644 --- a/boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig +++ b/boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig @@ -46,6 +46,10 @@ CONFIG_BOARD_LOOPSPERMSEC=6366 CONFIG_BUILD_KERNEL=y CONFIG_DEBUG_ASSERTIONS=y CONFIG_DEBUG_ASSERTIONS_EXPRESSION=y +CONFIG_DEBUG_BINFMT=y +CONFIG_DEBUG_BINFMT_ERROR=y +CONFIG_DEBUG_BINFMT_INFO=y +CONFIG_DEBUG_BINFMT_WARN=y CONFIG_DEBUG_ERROR=y CONFIG_DEBUG_FEATURES=y CONFIG_DEBUG_FULLOPT=y From b79c90ee7394b936b34df72ad1cb8e3a403578ae Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Sat, 15 Jul 2023 20:17:24 +0800 Subject: [PATCH 053/108] Restore UART --- drivers/serial/uart_16550.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/drivers/serial/uart_16550.c b/drivers/serial/uart_16550.c index 3dc8535a23fea..0d09eb7dc1ef3 100644 --- a/drivers/serial/uart_16550.c +++ b/drivers/serial/uart_16550.c @@ -601,8 +601,6 @@ static uart_dev_t g_uart3port = static inline uart_datawidth_t u16550_serialin(FAR struct u16550_s *priv, int offset) { - if (priv == NULL || priv->uartbase != 0x10000000) { *(volatile uint8_t *)0x10000000 = '!'; } //// - DEBUGASSERT(priv != NULL); DEBUGASSERT(priv->uartbase == 0x10000000); //// #ifdef CONFIG_SERIAL_UART_ARCH_MMIO return *((FAR volatile uart_datawidth_t *)priv->uartbase + offset); #else @@ -617,8 +615,6 @@ static inline uart_datawidth_t u16550_serialin(FAR struct u16550_s *priv, static inline void u16550_serialout(FAR struct u16550_s *priv, int offset, uart_datawidth_t value) { - if (priv == NULL || priv->uartbase != 0x10000000) { *(volatile uint8_t *)0x10000000 = '!'; } //// - DEBUGASSERT(priv != NULL); DEBUGASSERT(priv->uartbase == 0x10000000); //// #ifdef CONFIG_SERIAL_UART_ARCH_MMIO *((FAR volatile uart_datawidth_t *)priv->uartbase + offset) = value; #else @@ -1676,7 +1672,6 @@ static void u16550_putc(FAR struct u16550_s *priv, int ch) void u16550_earlyserialinit(void) { - *(volatile uint8_t *)0x10000000 = 'a';//// /* Configuration whichever one is the console */ #ifdef CONSOLE_DEV @@ -1685,7 +1680,6 @@ void u16550_earlyserialinit(void) u16550_setup(&CONSOLE_DEV); #endif #endif - *(volatile uint8_t *)0x10000000 = 'b';//// } /**************************************************************************** From 854045e3d83f3e8a125267653c56726589346687 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Sat, 15 Jul 2023 20:18:48 +0800 Subject: [PATCH 054/108] Restore UART. Tested OK --- drivers/serial/uart_16550.c | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/drivers/serial/uart_16550.c b/drivers/serial/uart_16550.c index 0d09eb7dc1ef3..3d5175617c5d6 100644 --- a/drivers/serial/uart_16550.c +++ b/drivers/serial/uart_16550.c @@ -702,11 +702,9 @@ static inline uint32_t u16550_divisor(FAR struct u16550_s *priv) static int u16550_setup(FAR struct uart_dev_s *dev) { - *(volatile uint8_t *)0x10000000 = 'c';//// -#ifdef TODO //// #ifndef CONFIG_16550_SUPRESS_CONFIG FAR struct u16550_s *priv = (FAR struct u16550_s *)dev->priv; - ////uint16_t div; + uint16_t div; uint32_t lcr; #if defined(CONFIG_SERIAL_IFLOWCONTROL) || defined(CONFIG_SERIAL_OFLOWCONTROL) uint32_t mcr; @@ -714,22 +712,17 @@ static int u16550_setup(FAR struct uart_dev_s *dev) /* Clear fifos */ - *(volatile uint8_t *)0x10000000 = 'd';//// u16550_serialout(priv, UART_FCR_OFFSET, (UART_FCR_RXRST | UART_FCR_TXRST)); -#ifdef TODO //// /* Set trigger */ - *(volatile uint8_t *)0x10000000 = 'e';//// u16550_serialout(priv, UART_FCR_OFFSET, (UART_FCR_FIFOEN | UART_FCR_RXTRIGGER_8)); /* Set up the IER */ - *(volatile uint8_t *)0x10000000 = 'f';//// priv->ier = u16550_serialin(priv, UART_IER_OFFSET); -#endif //// TODO /* Set up the LCR */ @@ -768,10 +761,8 @@ static int u16550_setup(FAR struct uart_dev_s *dev) lcr |= (UART_LCR_PEN | UART_LCR_EPS); } -#ifdef TODO //// /* Enter DLAB=1 */ - *(volatile uint8_t *)0x10000000 = 'g';//// u16550_serialout(priv, UART_LCR_OFFSET, (lcr | UART_LCR_DLAB)); /* Set the BAUD divisor */ @@ -786,16 +777,13 @@ static int u16550_setup(FAR struct uart_dev_s *dev) /* Configure the FIFOs */ - *(volatile uint8_t *)0x10000000 = 'h';//// u16550_serialout(priv, UART_FCR_OFFSET, (UART_FCR_RXTRIGGER_8 | UART_FCR_TXRST | UART_FCR_RXRST | UART_FCR_FIFOEN)); -#endif //// TODO /* Set up the auto flow control */ #if defined(CONFIG_SERIAL_IFLOWCONTROL) || defined(CONFIG_SERIAL_OFLOWCONTROL) - *(volatile uint8_t *)0x10000000 = 'i';//// mcr = u16550_serialin(priv, UART_MCR_OFFSET); if (priv->flow) { @@ -808,20 +796,16 @@ static int u16550_setup(FAR struct uart_dev_s *dev) mcr |= UART_MCR_RTS; - *(volatile uint8_t *)0x10000000 = 'j';//// u16550_serialout(priv, UART_MCR_OFFSET, mcr); #endif /* defined(CONFIG_SERIAL_IFLOWCONTROL) || defined(CONFIG_SERIAL_OFLOWCONTROL) */ /* Reconfigure DMA Rx timeout value */ #ifdef HAVE_16550_UART_DMA - *(volatile uint8_t *)0x10000000 = 'k';//// u16550_dmarxconfig(dev); #endif #endif -#endif //// TODO - *(volatile uint8_t *)0x10000000 = 'l';//// return OK; } @@ -1618,7 +1602,6 @@ static void u16550_txint(struct uart_dev_s *dev, bool enable) static bool u16550_txready(struct uart_dev_s *dev) { - return true; FAR struct u16550_s *priv = (FAR struct u16550_s *)dev->priv; return ((u16550_serialin(priv, UART_LSR_OFFSET) & UART_LSR_THRE) != 0); } From 2261b80da6b9f9e286570f5fb2a17e1ea3d3cfbe Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Sat, 15 Jul 2023 20:38:23 +0800 Subject: [PATCH 055/108] Restore qemu_rv_start. elf_init: filename: /system/bin/init loadinfo: 0x404069e8 --- arch/risc-v/src/qemu-rv/qemu_rv_start.c | 42 +++++++++++++------------ 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_start.c b/arch/risc-v/src/qemu-rv/qemu_rv_start.c index 02c6fc61511ba..dd60967ded384 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_start.c +++ b/arch/risc-v/src/qemu-rv/qemu_rv_start.c @@ -166,9 +166,7 @@ void qemu_rv_start(int mhartid) void qemu_rv_start(int mhartid) { DEBUGASSERT(mhartid == 0); //// - if (0 == mhartid) { qemu_rv_clear_bss(); } //// - qemu_rv_start_s(mhartid); //// -#ifdef TODO //// + /* NOTE: still in M-mode */ if (0 == mhartid) @@ -177,28 +175,29 @@ void qemu_rv_start(int mhartid) /* Initialize the per CPU areas */ - riscv_percpu_add_hart(mhartid); + //// TODO + ////riscv_percpu_add_hart(mhartid); } /* Disable MMU and enable PMP */ WRITE_CSR(satp, 0x0); - WRITE_CSR(pmpaddr0, 0x3fffffffffffffull); - WRITE_CSR(pmpcfg0, 0xf); + ////WRITE_CSR(pmpaddr0, 0x3fffffffffffffull); + ////WRITE_CSR(pmpcfg0, 0xf); /* Set exception and interrupt delegation for S-mode */ - WRITE_CSR(medeleg, 0xffff); - WRITE_CSR(mideleg, 0xffff); + ////WRITE_CSR(medeleg, 0xffff); + ////WRITE_CSR(mideleg, 0xffff); /* Allow to write satp from S-mode */ - CLEAR_CSR(mstatus, MSTATUS_TVM); + ////CLEAR_CSR(mstatus, MSTATUS_TVM); /* Set mstatus to S-mode and enable SUM */ - CLEAR_CSR(mstatus, ~MSTATUS_MPP_MASK); - SET_CSR(mstatus, MSTATUS_MPPS | SSTATUS_SUM); + ////CLEAR_CSR(mstatus, ~MSTATUS_MPP_MASK); + ////SET_CSR(mstatus, MSTATUS_MPPS | SSTATUS_SUM); /* Set the trap vector for S-mode */ @@ -206,7 +205,7 @@ void qemu_rv_start(int mhartid) /* Set the trap vector for M-mode */ - WRITE_CSR(mtvec, (uintptr_t)__trap_vec_m); + ////WRITE_CSR(mtvec, (uintptr_t)__trap_vec_m); if (0 == mhartid) { @@ -214,21 +213,24 @@ void qemu_rv_start(int mhartid) * before entering to S-mode */ - up_mtimer_initialize(); + //// TODO + ////up_mtimer_initialize(); } /* Set mepc to the entry */ - WRITE_CSR(mepc, (uintptr_t)qemu_rv_start_s); + ////WRITE_CSR(mepc, (uintptr_t)qemu_rv_start_s); /* Set a0 to mhartid explicitly and enter to S-mode */ - asm volatile ( - "mv a0, %0 \n" - "mret \n" - :: "r" (mhartid) - ); -#endif //// TODO + ////asm volatile ( + //// "mv a0, %0 \n" + //// "mret \n" + //// :: "r" (mhartid) + ////); + + //// Jump to S-Mode Init ourselves + qemu_rv_start_s(mhartid); //// } #endif From dd721d0a4f18833e65ea6839d08936c0920141b3 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Sat, 15 Jul 2023 20:42:15 +0800 Subject: [PATCH 056/108] Restore qemu_rv_start. up_dump_register: EPC: 0000000040200434 --- arch/risc-v/src/qemu-rv/qemu_rv_start.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_start.c b/arch/risc-v/src/qemu-rv/qemu_rv_start.c index dd60967ded384..39326d28eb086 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_start.c +++ b/arch/risc-v/src/qemu-rv/qemu_rv_start.c @@ -175,8 +175,7 @@ void qemu_rv_start(int mhartid) /* Initialize the per CPU areas */ - //// TODO - ////riscv_percpu_add_hart(mhartid); + riscv_percpu_add_hart(mhartid); } /* Disable MMU and enable PMP */ From 6ed2880c901f5b1a1da42afe14c42574d7c06289 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Sat, 15 Jul 2023 20:58:05 +0800 Subject: [PATCH 057/108] Debug host_call. host_call: host_call: nbr=0x1, parm=0x40406778, size=24 --- arch/risc-v/src/common/riscv_hostfs.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/risc-v/src/common/riscv_hostfs.c b/arch/risc-v/src/common/riscv_hostfs.c index 10bc25855750e..374e058b0df4d 100644 --- a/arch/risc-v/src/common/riscv_hostfs.c +++ b/arch/risc-v/src/common/riscv_hostfs.c @@ -31,6 +31,7 @@ #include #include #include +#include //// /**************************************************************************** * Pre-processor Definitions @@ -52,6 +53,7 @@ static long host_call(unsigned int nbr, void *parm, size_t size) { + _info("host_call: nbr=0x%x, parm=%p, size=%ld\n", nbr, parm, size);//// #ifdef CONFIG_RISCV_SEMIHOSTING_HOSTFS_CACHE_COHERENCE up_clean_dcache(parm, parm + size); #endif From c994f46f353312ec2598795dc484a254a01544ca Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Sat, 15 Jul 2023 21:07:23 +0800 Subject: [PATCH 058/108] Disable Semihosting --- arch/risc-v/src/common/riscv_hostfs.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/arch/risc-v/src/common/riscv_hostfs.c b/arch/risc-v/src/common/riscv_hostfs.c index 374e058b0df4d..17e14b384196a 100644 --- a/arch/risc-v/src/common/riscv_hostfs.c +++ b/arch/risc-v/src/common/riscv_hostfs.c @@ -32,6 +32,7 @@ #include #include #include //// +#include //// /**************************************************************************** * Pre-processor Definitions @@ -53,7 +54,9 @@ static long host_call(unsigned int nbr, void *parm, size_t size) { - _info("host_call: nbr=0x%x, parm=%p, size=%ld\n", nbr, parm, size);//// + _info("nbr=0x%x, parm=%p, size=%ld\n", nbr, parm, size);//// + DEBUGPANIC();//// Semihosting not supported + #ifdef CONFIG_RISCV_SEMIHOSTING_HOSTFS_CACHE_COHERENCE up_clean_dcache(parm, parm + size); #endif From d794e958c115301ca42910ae204680430e565aa6 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Sat, 22 Jul 2023 17:21:05 +0800 Subject: [PATCH 059/108] Ignore initrd --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 95dc6e19b522a..095ffbeff3399 100644 --- a/.gitignore +++ b/.gitignore @@ -60,3 +60,4 @@ uImage .vscode .DS_Store tools/gdb/__pycache__ +initrd From a2c117af9a5f1b37ea2258549a5853195215a267 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Sat, 22 Jul 2023 18:04:34 +0800 Subject: [PATCH 060/108] Loading RAM Disk --- arch/risc-v/src/qemu-rv/qemu_rv_mm_init.c | 16 +++ .../rv-virt/scripts/ld-kernel64.script | 13 ++- .../qemu-rv/rv-virt/src/qemu_rv_appinit.c | 99 +++++++++++++++++++ fs/hostfs/hostfs.c | 8 ++ fs/romfs/fs_romfsutil.c | 7 ++ 5 files changed, 142 insertions(+), 1 deletion(-) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_mm_init.c b/arch/risc-v/src/qemu-rv/qemu_rv_mm_init.c index 4345e79a0a6ca..90b9c21b3d89b 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_mm_init.c +++ b/arch/risc-v/src/qemu-rv/qemu_rv_mm_init.c @@ -269,6 +269,22 @@ void qemu_rv_kernel_mappings(void) binfo("map kernel data\n"); map_region(KSRAM_START, KSRAM_START, KSRAM_SIZE, MMU_KDATA_FLAGS); + // Added RAM Disk + //// From nuttx/boards/risc-v/litex/arty_a7/include/board_memorymap.h + /* ramdisk (RW) */ + extern uint8_t __ramdisk_start[]; + extern uint8_t __ramdisk_size[]; + // Copy 0x46100000 to __ramdisk_start (__ramdisk_size bytes) + // TODO: RAM Disk must not exceed __ramdisk_size bytes + memcpy((void *)__ramdisk_start, (void *)0x46100000, (size_t)__ramdisk_size); + +#ifdef NOTUSED + /* Added RAM Disk */ + _info("map RAM Disk\n"); + map_region((uintptr_t)__ramdisk_start, (uintptr_t)__ramdisk_start, (uintptr_t)__ramdisk_size, MMU_KDATA_FLAGS); + _info("map RAM Disk done\n"); +#endif // NOTUSED + #ifdef CONFIG_ARCH_MMU_TYPE_SV39 /* Connect the L1 and L2 page tables for the kernel text and data */ diff --git a/boards/risc-v/qemu-rv/rv-virt/scripts/ld-kernel64.script b/boards/risc-v/qemu-rv/rv-virt/scripts/ld-kernel64.script index d4ec5ef1320db..96ac2abdb3f4d 100644 --- a/boards/risc-v/qemu-rv/rv-virt/scripts/ld-kernel64.script +++ b/boards/risc-v/qemu-rv/rv-virt/scripts/ld-kernel64.script @@ -26,6 +26,8 @@ MEMORY ksram (rwx) : ORIGIN = 0x40400000, LENGTH = 2048K /* w/ cache */ /* Previously 0x80400000 */ pgram (rwx) : ORIGIN = 0x40600000, LENGTH = 4096K /* w/ cache */ + /* Added RAM Disk */ + ramdisk (rwx) : ORIGIN = 0x40A00000, LENGTH = 16M /* w/ cache */ } OUTPUT_ARCH("riscv") @@ -38,10 +40,19 @@ __ksram_start = ORIGIN(ksram); __ksram_size = LENGTH(ksram); __ksram_end = ORIGIN(ksram) + LENGTH(ksram); +/* Added RAM Disk */ /* Page heap */ __pgheap_start = ORIGIN(pgram); -__pgheap_size = LENGTH(pgram); +__pgheap_size = LENGTH(pgram) + LENGTH(ramdisk); +/* Previously: __pgheap_size = LENGTH(pgram); */ + +/* Added RAM Disk */ +/* Application ramdisk */ + +__ramdisk_start = ORIGIN(ramdisk); +__ramdisk_size = LENGTH(ramdisk); +__ramdisk_end = ORIGIN(ramdisk) + LENGTH(ramdisk); SECTIONS { diff --git a/boards/risc-v/qemu-rv/rv-virt/src/qemu_rv_appinit.c b/boards/risc-v/qemu-rv/rv-virt/src/qemu_rv_appinit.c index ffb00398ceb7e..3b3cec28e827f 100644 --- a/boards/risc-v/qemu-rv/rv-virt/src/qemu_rv_appinit.c +++ b/boards/risc-v/qemu-rv/rv-virt/src/qemu_rv_appinit.c @@ -28,6 +28,7 @@ #include #include #include +#include //// #include @@ -78,3 +79,101 @@ int board_app_initialize(uintptr_t arg) return OK; #endif } + +//// Added RAM Disk +//// From nuttx/boards/risc-v/litex/arty_a7/src/litex_appinit.c + +int mount_ramdisk(void); + +/**************************************************************************** + * Name: board_late_initialize + * + * Description: + * If CONFIG_BOARD_LATE_INITIALIZE is selected, then an additional + * initialization call will be performed in the boot-up sequence to a + * function called board_late_initialize(). board_late_initialize() will + * be called after up_initialize() and board_early_initialize() and just + * before the initial application is started. This additional + * initialization phase may be used, for example, to initialize board- + * specific device drivers for which board_early_initialize() is not + * suitable. + * + * Waiting for events, use of I2C, SPI, etc are permissible in the context + * of board_late_initialize(). That is because board_late_initialize() + * will run on a temporary, internal kernel thread. + * + ****************************************************************************/ + +void board_late_initialize(void) +{ + _info("\n");//// + + // Mount the RAM Disk + mount_ramdisk(); + + /* Perform board-specific initialization */ + +#ifdef CONFIG_NSH_ARCHINIT + + mount(NULL, "/proc", "procfs", 0, NULL); + +#endif +} + +//// From nuttx/boards/risc-v/litex/arty_a7/include/board_memorymap.h + +/* ramdisk (RW) */ +extern uint8_t __ramdisk_start[]; +extern uint8_t __ramdisk_size[]; + +//// From nuttx/boards/risc-v/litex/arty_a7/src/litex_ramdisk.c + +#include +#include +#include + +#ifndef CONFIG_BUILD_KERNEL +#error "Ramdisk usage is intended to be used with kernel build only" +#endif + +#define SECTORSIZE 512 +#define NSECTORS(b) (((b) + SECTORSIZE - 1) / SECTORSIZE) +#define RAMDISK_DEVICE_MINOR 0 + +/**************************************************************************** + * Name: litex_mount_ramdisk + * + * Description: + * Mount a ramdisk defined in the ld-kernel.script to /dev/ramX. + * The ramdisk is intended to contain a romfs with applications which can + * be spawned at runtime. + * + * Returned Value: + * OK is returned on success. + * -ERRORNO is returned on failure. + * + ****************************************************************************/ + +int mount_ramdisk(void) +{ + int ret; + struct boardioc_romdisk_s desc; + + desc.minor = RAMDISK_DEVICE_MINOR; + desc.nsectors = NSECTORS((ssize_t)__ramdisk_size); + desc.sectsize = SECTORSIZE; + desc.image = __ramdisk_start; + + ret = boardctl(BOARDIOC_ROMDISK, (uintptr_t)&desc); + if (ret < 0) + { + syslog(LOG_ERR, "Ramdisk register failed: %s\n", strerror(errno)); + syslog(LOG_ERR, "Ramdisk mountpoint /dev/ram%d\n", + RAMDISK_DEVICE_MINOR); + syslog(LOG_ERR, "Ramdisk length %lu, origin %lx\n", + (ssize_t)__ramdisk_size, + (uintptr_t)__ramdisk_start); + } + + return ret; +} diff --git a/fs/hostfs/hostfs.c b/fs/hostfs/hostfs.c index 43da3eb4a24b0..aaadbd3705bd8 100644 --- a/fs/hostfs/hostfs.c +++ b/fs/hostfs/hostfs.c @@ -239,6 +239,7 @@ static void hostfs_mkpath(FAR struct hostfs_mountpt_s *fs, static int hostfs_open(FAR struct file *filep, FAR const char *relpath, int oflags, mode_t mode) { + _info("relpath=%s, oflags=0x%x, mode=0x%x\n", relpath, oflags, mode);//// FAR struct inode *inode; FAR struct hostfs_mountpt_s *fs; FAR struct hostfs_ofile_s *hf; @@ -824,6 +825,7 @@ static int hostfs_ftruncate(FAR struct file *filep, off_t length) static int hostfs_opendir(FAR struct inode *mountpt, FAR const char *relpath, FAR struct fs_dirent_s **dir) { + _info("relpath=%s\n", relpath);//// FAR struct hostfs_mountpt_s *fs; FAR struct hostfs_dir_s *hdir; char path[HOSTFS_MAX_PATH]; @@ -1177,6 +1179,7 @@ static int hostfs_statfs(FAR struct inode *mountpt, FAR struct statfs *buf) static int hostfs_unlink(FAR struct inode *mountpt, FAR const char *relpath) { + _info("relpath=%s\n", relpath);//// FAR struct hostfs_mountpt_s *fs; char path[HOSTFS_MAX_PATH]; int ret; @@ -1217,6 +1220,7 @@ static int hostfs_unlink(FAR struct inode *mountpt, FAR const char *relpath) static int hostfs_mkdir(FAR struct inode *mountpt, FAR const char *relpath, mode_t mode) { + _info("relpath=%s, mode=0x%x\n", relpath, mode);//// FAR struct hostfs_mountpt_s *fs; char path[HOSTFS_MAX_PATH]; int ret; @@ -1256,6 +1260,7 @@ static int hostfs_mkdir(FAR struct inode *mountpt, FAR const char *relpath, int hostfs_rmdir(FAR struct inode *mountpt, FAR const char *relpath) { + _info("relpath=%s\n", relpath);//// FAR struct hostfs_mountpt_s *fs; char path[HOSTFS_MAX_PATH]; int ret; @@ -1298,6 +1303,7 @@ int hostfs_rmdir(FAR struct inode *mountpt, FAR const char *relpath) int hostfs_rename(FAR struct inode *mountpt, FAR const char *oldrelpath, FAR const char *newrelpath) { + _info("oldrelpath=%s, newrelpath=%s\n", oldrelpath, newrelpath);//// FAR struct hostfs_mountpt_s *fs; char oldpath[HOSTFS_MAX_PATH]; char newpath[HOSTFS_MAX_PATH]; @@ -1342,6 +1348,7 @@ int hostfs_rename(FAR struct inode *mountpt, FAR const char *oldrelpath, static int hostfs_stat(FAR struct inode *mountpt, FAR const char *relpath, FAR struct stat *buf) { + _info("relpath=%s\n", relpath);//// FAR struct hostfs_mountpt_s *fs; char path[HOSTFS_MAX_PATH]; int ret; @@ -1382,6 +1389,7 @@ static int hostfs_stat(FAR struct inode *mountpt, FAR const char *relpath, static int hostfs_chstat(FAR struct inode *mountpt, FAR const char *relpath, FAR const struct stat *buf, int flags) { + _info("relpath=%s\n", relpath);//// FAR struct hostfs_mountpt_s *fs; char path[HOSTFS_MAX_PATH]; int ret; diff --git a/fs/romfs/fs_romfsutil.c b/fs/romfs/fs_romfsutil.c index 8e6127dbf43e3..e4a12132c08c6 100644 --- a/fs/romfs/fs_romfsutil.c +++ b/fs/romfs/fs_romfsutil.c @@ -76,6 +76,13 @@ struct romfs_entryname_s static uint32_t romfs_devread32(FAR struct romfs_mountpt_s *rm, int ndx) { + //// Stop if RAM Disk Memory is too small + extern uint8_t __ramdisk_start[]; //// + extern uint8_t __ramdisk_size[]; //// + if (&rm->rm_buffer[ndx] > __ramdisk_start + (size_t)__ramdisk_size) + { _err("RAM Disk Memory too smol! Expecting %p, got %p\n", __ramdisk_start + (size_t)__ramdisk_size, &rm->rm_buffer[ndx]); }; + DEBUGASSERT(&rm->rm_buffer[ndx] < __ramdisk_start + (size_t)__ramdisk_size); //// + /* This should not read past the end of the sector since the directory * entries are aligned at 16-byte boundaries. */ From 1e5f22124c64c24302bf496f5cc96f3bfb13c4f6 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Sat, 22 Jul 2023 19:35:07 +0800 Subject: [PATCH 061/108] Loading RAM Disk --- .../qemu-rv/rv-virt/configs/knsh64/defconfig | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig b/boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig index 837793fb48bcf..90205edaf07b5 100644 --- a/boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig +++ b/boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig @@ -42,6 +42,8 @@ CONFIG_ARCH_TEXT_VBASE=0xC0000000 CONFIG_ARCH_USE_MMU=y CONFIG_ARCH_USE_MPU=y CONFIG_ARCH_USE_S_MODE=y +CONFIG_BOARDCTL_ROMDISK=y +CONFIG_BOARD_LATE_INITIALIZE=y CONFIG_BOARD_LOOPSPERMSEC=6366 CONFIG_BUILD_KERNEL=y CONFIG_DEBUG_ASSERTIONS=y @@ -52,6 +54,10 @@ CONFIG_DEBUG_BINFMT_INFO=y CONFIG_DEBUG_BINFMT_WARN=y CONFIG_DEBUG_ERROR=y CONFIG_DEBUG_FEATURES=y +CONFIG_DEBUG_FS=y +CONFIG_DEBUG_FS_ERROR=y +CONFIG_DEBUG_FS_INFO=y +CONFIG_DEBUG_FS_WARN=y CONFIG_DEBUG_FULLOPT=y CONFIG_DEBUG_INFO=y CONFIG_DEBUG_SCHED=y @@ -63,16 +69,13 @@ CONFIG_DEBUG_WARN=y CONFIG_DEV_ZERO=y CONFIG_ELF=y CONFIG_EXAMPLES_HELLO=m -CONFIG_FS_HOSTFS=y CONFIG_FS_PROCFS=y +CONFIG_FS_ROMFS=y CONFIG_IDLETHREAD_STACKSIZE=3072 CONFIG_INIT_FILEPATH="/system/bin/init" CONFIG_INIT_MOUNT=y -CONFIG_INIT_MOUNT_DATA="fs=../apps" CONFIG_INIT_MOUNT_FLAGS=0x1 -CONFIG_INIT_MOUNT_FSTYPE="hostfs" -CONFIG_INIT_MOUNT_SOURCE="" -CONFIG_INIT_MOUNT_TARGET="/system" +CONFIG_INIT_MOUNT_TARGET="/system/bin" CONFIG_INIT_STACKSIZE=3072 CONFIG_INTELHEX_BINARY=y CONFIG_LIBC_ENVPATH=y @@ -91,7 +94,6 @@ CONFIG_PATH_INITIAL="/system/bin" CONFIG_RAM_SIZE=1048576 CONFIG_RAM_START=0x40200000 CONFIG_READLINE_CMD_HISTORY=y -CONFIG_RISCV_SEMIHOSTING_HOSTFS=y CONFIG_RR_INTERVAL=200 CONFIG_SCHED_LPWORK=y CONFIG_SCHED_WAITPID=y From f7cf230ca1658497a0c4006d4dca97d454334e35 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Sat, 22 Jul 2023 19:52:56 +0800 Subject: [PATCH 062/108] RAM Disk boots OK on Star64 yay! Disable info log --- boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig | 2 -- 1 file changed, 2 deletions(-) diff --git a/boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig b/boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig index 90205edaf07b5..46fedf0af9056 100644 --- a/boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig +++ b/boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig @@ -50,13 +50,11 @@ CONFIG_DEBUG_ASSERTIONS=y CONFIG_DEBUG_ASSERTIONS_EXPRESSION=y CONFIG_DEBUG_BINFMT=y CONFIG_DEBUG_BINFMT_ERROR=y -CONFIG_DEBUG_BINFMT_INFO=y CONFIG_DEBUG_BINFMT_WARN=y CONFIG_DEBUG_ERROR=y CONFIG_DEBUG_FEATURES=y CONFIG_DEBUG_FS=y CONFIG_DEBUG_FS_ERROR=y -CONFIG_DEBUG_FS_INFO=y CONFIG_DEBUG_FS_WARN=y CONFIG_DEBUG_FULLOPT=y CONFIG_DEBUG_INFO=y From e26103dc0ce574dc37ac741b9c4cb70b7b49cb1c Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Thu, 27 Jul 2023 06:52:45 +0800 Subject: [PATCH 063/108] Ignore init.S --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 095ffbeff3399..25c517718d094 100644 --- a/.gitignore +++ b/.gitignore @@ -61,3 +61,4 @@ uImage .DS_Store tools/gdb/__pycache__ initrd +init.S From e5751b68e9f0e5ff0a4ded35a98c449ab2a2f749 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Thu, 27 Jul 2023 17:29:47 +0800 Subject: [PATCH 064/108] Fix User Address Space and I/O Address Space. Same result --- arch/risc-v/src/qemu-rv/qemu_rv_mm_init.c | 2 +- boards/risc-v/qemu-rv/rv-virt/include/board_memorymap.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_mm_init.c b/arch/risc-v/src/qemu-rv/qemu_rv_mm_init.c index 90b9c21b3d89b..b1da88711a407 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_mm_init.c +++ b/arch/risc-v/src/qemu-rv/qemu_rv_mm_init.c @@ -43,7 +43,7 @@ /* Map the whole I/O memory with vaddr = paddr mappings */ #define MMU_IO_BASE (0x00000000) -#define MMU_IO_SIZE (0x80000000) +#define MMU_IO_SIZE (0x40000000) #ifdef CONFIG_ARCH_MMU_TYPE_SV32 diff --git a/boards/risc-v/qemu-rv/rv-virt/include/board_memorymap.h b/boards/risc-v/qemu-rv/rv-virt/include/board_memorymap.h index 58101fc19ac99..6b15c9a16608c 100644 --- a/boards/risc-v/qemu-rv/rv-virt/include/board_memorymap.h +++ b/boards/risc-v/qemu-rv/rv-virt/include/board_memorymap.h @@ -33,7 +33,7 @@ /* DDR start address */ -#define QEMURV_DDR_BASE (0x80000000) +#define QEMURV_DDR_BASE (0x40000000) #define QEMURV_DDR_SIZE (0x40000000) /* Kernel code memory (RX) */ From 46c1a0f8a559f371dae83c5567f07a1591cba283 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Thu, 27 Jul 2023 19:11:50 +0800 Subject: [PATCH 065/108] Change RAM Base to 0x40200000 --- boards/risc-v/qemu-rv/rv-virt/include/board_memorymap.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boards/risc-v/qemu-rv/rv-virt/include/board_memorymap.h b/boards/risc-v/qemu-rv/rv-virt/include/board_memorymap.h index 6b15c9a16608c..37faa271c8745 100644 --- a/boards/risc-v/qemu-rv/rv-virt/include/board_memorymap.h +++ b/boards/risc-v/qemu-rv/rv-virt/include/board_memorymap.h @@ -33,7 +33,7 @@ /* DDR start address */ -#define QEMURV_DDR_BASE (0x40000000) +#define QEMURV_DDR_BASE (0x40200000) #define QEMURV_DDR_SIZE (0x40000000) /* Kernel code memory (RX) */ From 4d36dd3021db3a3edb94ded12015997dff4918eb Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Thu, 27 Jul 2023 20:16:28 +0800 Subject: [PATCH 066/108] Console Output is stuck --- drivers/serial/serial.c | 1 + drivers/serial/uart_16550.c | 1 + 2 files changed, 2 insertions(+) diff --git a/drivers/serial/serial.c b/drivers/serial/serial.c index e070121545c5d..4d780661ee82a 100644 --- a/drivers/serial/serial.c +++ b/drivers/serial/serial.c @@ -1174,6 +1174,7 @@ static ssize_t uart_read(FAR struct file *filep, static ssize_t uart_write(FAR struct file *filep, FAR const char *buffer, size_t buflen) { + infodumpbuffer("uart_write", (const uint8_t *)buffer, buflen);//// FAR struct inode *inode = filep->f_inode; FAR uart_dev_t *dev = inode->i_private; ssize_t nwritten = buflen; diff --git a/drivers/serial/uart_16550.c b/drivers/serial/uart_16550.c index 3d5175617c5d6..70f18d4e07f7d 100644 --- a/drivers/serial/uart_16550.c +++ b/drivers/serial/uart_16550.c @@ -928,6 +928,7 @@ static void u16550_detach(FAR struct uart_dev_s *dev) static int u16550_interrupt(int irq, FAR void *context, FAR void *arg) { + *(volatile uint8_t *)0x10000000 = '#';//// FAR struct uart_dev_s *dev = (struct uart_dev_s *)arg; FAR struct u16550_s *priv; uint32_t status; From 6087f172b1dedda6fcb7fec4850232a7013b5738 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Fri, 28 Jul 2023 09:36:21 +0800 Subject: [PATCH 067/108] No Console Output from NuttX Shell --- drivers/serial/serial.c | 3 +++ drivers/serial/serial_io.c | 1 + 2 files changed, 4 insertions(+) diff --git a/drivers/serial/serial.c b/drivers/serial/serial.c index 4d780661ee82a..5afa5bc9e289e 100644 --- a/drivers/serial/serial.c +++ b/drivers/serial/serial.c @@ -154,6 +154,7 @@ static struct work_s g_serial_work; static int uart_putxmitchar(FAR uart_dev_t *dev, int ch, bool oktoblock) { + *(volatile uint8_t *)0x10000000 = 'A';//// irqstate_t flags; int nexthead; int ret; @@ -290,6 +291,7 @@ static int uart_putxmitchar(FAR uart_dev_t *dev, int ch, bool oktoblock) static inline void uart_putc(FAR uart_dev_t *dev, int ch) { + *(volatile uint8_t *)0x10000000 = 'B';//// while (!uart_txready(dev)) { } @@ -305,6 +307,7 @@ static inline ssize_t uart_irqwrite(FAR uart_dev_t *dev, FAR const char *buffer, size_t buflen) { + *(volatile uint8_t *)0x10000000 = 'C';//// ssize_t ret = buflen; /* Force each character through the low level interface */ diff --git a/drivers/serial/serial_io.c b/drivers/serial/serial_io.c index e3ea1861446ae..15d9d2d99a85a 100644 --- a/drivers/serial/serial_io.c +++ b/drivers/serial/serial_io.c @@ -54,6 +54,7 @@ void uart_xmitchars(FAR uart_dev_t *dev) { + *(volatile uint8_t *)0x10000000 = 'D';//// uint16_t nbytes = 0; #ifdef CONFIG_SMP From ea607bd33a6d4ca042b6c05cfb1379606209d8e3 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Fri, 28 Jul 2023 11:30:32 +0800 Subject: [PATCH 068/108] Log Console Output --- drivers/serial/serial_io.c | 1 + drivers/serial/uart_16550.c | 3 +++ 2 files changed, 4 insertions(+) diff --git a/drivers/serial/serial_io.c b/drivers/serial/serial_io.c index 15d9d2d99a85a..213fd8e004ed7 100644 --- a/drivers/serial/serial_io.c +++ b/drivers/serial/serial_io.c @@ -63,6 +63,7 @@ void uart_xmitchars(FAR uart_dev_t *dev) /* Send while we still have data in the TX buffer & room in the fifo */ + if (uart_txready(dev)) { *(volatile uint8_t *)0x10000000 = 'E'; }//// while (dev->xmit.head != dev->xmit.tail && uart_txready(dev)) { /* Send the next byte */ diff --git a/drivers/serial/uart_16550.c b/drivers/serial/uart_16550.c index 70f18d4e07f7d..f7e27f0b7a0b4 100644 --- a/drivers/serial/uart_16550.c +++ b/drivers/serial/uart_16550.c @@ -601,6 +601,7 @@ static uart_dev_t g_uart3port = static inline uart_datawidth_t u16550_serialin(FAR struct u16550_s *priv, int offset) { + DEBUGASSERT(priv->uartbase == 0x10000000);//// #ifdef CONFIG_SERIAL_UART_ARCH_MMIO return *((FAR volatile uart_datawidth_t *)priv->uartbase + offset); #else @@ -615,6 +616,7 @@ static inline uart_datawidth_t u16550_serialin(FAR struct u16550_s *priv, static inline void u16550_serialout(FAR struct u16550_s *priv, int offset, uart_datawidth_t value) { + DEBUGASSERT(priv->uartbase == 0x10000000);//// #ifdef CONFIG_SERIAL_UART_ARCH_MMIO *((FAR volatile uart_datawidth_t *)priv->uartbase + offset) = value; #else @@ -1548,6 +1550,7 @@ static void u16550_dmatxavail(FAR struct uart_dev_s *dev) static void u16550_send(struct uart_dev_s *dev, int ch) { + *(volatile uint8_t *)0x10000000 = 'E';//// FAR struct u16550_s *priv = (FAR struct u16550_s *)dev->priv; u16550_serialout(priv, UART_THR_OFFSET, (uart_datawidth_t)ch); } From 3d1efeafe6f1ff63a1e3a35ebc1d5b206893f196 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Fri, 28 Jul 2023 11:33:54 +0800 Subject: [PATCH 069/108] Log Console Output --- drivers/serial/uart_16550.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/serial/uart_16550.c b/drivers/serial/uart_16550.c index f7e27f0b7a0b4..abdcdc7b6ba02 100644 --- a/drivers/serial/uart_16550.c +++ b/drivers/serial/uart_16550.c @@ -1550,7 +1550,7 @@ static void u16550_dmatxavail(FAR struct uart_dev_s *dev) static void u16550_send(struct uart_dev_s *dev, int ch) { - *(volatile uint8_t *)0x10000000 = 'E';//// + *(volatile uint8_t *)0x10000000 = 'F';//// FAR struct u16550_s *priv = (FAR struct u16550_s *)dev->priv; u16550_serialout(priv, UART_THR_OFFSET, (uart_datawidth_t)ch); } From 7ee9fb98b694e81436b300811af608e688c02499 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Fri, 28 Jul 2023 12:10:52 +0800 Subject: [PATCH 070/108] Disable ACLINT --- arch/risc-v/src/qemu-rv/hardware/qemu_rv_memorymap.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/risc-v/src/qemu-rv/hardware/qemu_rv_memorymap.h b/arch/risc-v/src/qemu-rv/hardware/qemu_rv_memorymap.h index 868f3d698a9db..5f2a034daf660 100644 --- a/arch/risc-v/src/qemu-rv/hardware/qemu_rv_memorymap.h +++ b/arch/risc-v/src/qemu-rv/hardware/qemu_rv_memorymap.h @@ -28,7 +28,7 @@ /* Register Base Address ****************************************************/ #define QEMU_RV_CLINT_BASE 0x02000000 -#define QEMU_RV_ACLINT_BASE 0x02f00000 +////#define QEMU_RV_ACLINT_BASE 0x02f00000 #define QEMU_RV_PLIC_BASE 0x0c000000 #endif /* __ARCH_RISCV_SRC_QEMU_RV_HARDWARE_QEMU_RV_MEMORYMAP_H */ From 2ff7d88f87a8397175e3154869d7824cc1c6e14b Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Fri, 28 Jul 2023 12:20:55 +0800 Subject: [PATCH 071/108] UART0 IRQ becomes 32 --- boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig b/boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig index 46fedf0af9056..90f9fe1ce5721 100644 --- a/boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig +++ b/boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig @@ -12,7 +12,7 @@ CONFIG_16550_REGINCR=4 CONFIG_16550_UART0=y CONFIG_16550_UART0_BASE=0x10000000 CONFIG_16550_UART0_CLOCK=3686400 -CONFIG_16550_UART0_IRQ=35 +CONFIG_16550_UART0_IRQ=32 CONFIG_16550_UART0_SERIAL_CONSOLE=y CONFIG_16550_UART=y CONFIG_ARCH="risc-v" @@ -58,6 +58,9 @@ CONFIG_DEBUG_FS_ERROR=y CONFIG_DEBUG_FS_WARN=y CONFIG_DEBUG_FULLOPT=y CONFIG_DEBUG_INFO=y +CONFIG_DEBUG_MM=y +CONFIG_DEBUG_MM_ERROR=y +CONFIG_DEBUG_MM_WARN=y CONFIG_DEBUG_SCHED=y CONFIG_DEBUG_SCHED_ERROR=y CONFIG_DEBUG_SCHED_INFO=y From f3efcb6d67a3d7d3912ccd381313dc8b35f070aa Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Fri, 28 Jul 2023 14:35:31 +0800 Subject: [PATCH 072/108] Log IRQ --- arch/risc-v/src/qemu-rv/qemu_rv_irq.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_irq.c b/arch/risc-v/src/qemu-rv/qemu_rv_irq.c index 5c0badb1f7563..994f711616363 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_irq.c +++ b/arch/risc-v/src/qemu-rv/qemu_rv_irq.c @@ -146,6 +146,7 @@ void up_disable_irq(int irq) void up_enable_irq(int irq) { + _info("irq=%d\n", irq);//// int extirq; if (irq == RISCV_IRQ_SOFT) @@ -184,6 +185,7 @@ void up_enable_irq(int irq) PANIC(); } } + else { _info("***NOT ENABLED: irq=%d\n", irq); }//// } irqstate_t up_irq_enable(void) From 150b43134af71c18e5c8b77e3c5f32867ada2bdd Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Fri, 28 Jul 2023 14:41:08 +0800 Subject: [PATCH 073/108] Clean --- arch/risc-v/src/qemu-rv/qemu_rv_start.c | 8 -------- 1 file changed, 8 deletions(-) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_start.c b/arch/risc-v/src/qemu-rv/qemu_rv_start.c index 39326d28eb086..37ee668f63bce 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_start.c +++ b/arch/risc-v/src/qemu-rv/qemu_rv_start.c @@ -104,7 +104,6 @@ void qemu_rv_start(int mhartid) { /* Configure FPU */ - *(volatile uint8_t *)0x10000000 = 'D';//// riscv_fpuconfig(); if (mhartid > 0) @@ -113,19 +112,15 @@ void qemu_rv_start(int mhartid) } #ifndef CONFIG_BUILD_KERNEL - *(volatile uint8_t *)0x10000000 = 'E';//// qemu_rv_clear_bss(); #endif - *(volatile uint8_t *)0x10000000 = 'F';//// showprogress('A'); #ifdef USE_EARLYSERIALINIT - *(volatile uint8_t *)0x10000000 = 'G';//// riscv_earlyserialinit(); #endif - *(volatile uint8_t *)0x10000000 = 'H';//// showprogress('B'); /* Do board initialization */ @@ -140,17 +135,14 @@ void qemu_rv_start(int mhartid) /* Call nx_start() */ - *(volatile uint8_t *)0x10000000 = 'I';//// nx_start(); cpux: #ifdef CONFIG_SMP - *(volatile uint8_t *)0x10000000 = 'J';//// riscv_cpu_boot(mhartid); #endif - *(volatile uint8_t *)0x10000000 = 'K';//// while (true) { asm("WFI"); From fd11cba135c1206102b150c4e278079dbf15f30d Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Fri, 28 Jul 2023 15:02:31 +0800 Subject: [PATCH 074/108] Log IRQ --- arch/risc-v/src/qemu-rv/qemu_rv_irq.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_irq.c b/arch/risc-v/src/qemu-rv/qemu_rv_irq.c index 994f711616363..618f608994e1a 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_irq.c +++ b/arch/risc-v/src/qemu-rv/qemu_rv_irq.c @@ -151,12 +151,14 @@ void up_enable_irq(int irq) if (irq == RISCV_IRQ_SOFT) { + _info("RISCV_IRQ_SOFT=%d\n", RISCV_IRQ_SOFT);//// /* Read m/sstatus & set machine software interrupt enable in m/sie */ SET_CSR(CSR_IE, IE_SIE); } else if (irq == RISCV_IRQ_TIMER) { + _info("RISCV_IRQ_TIMER=%d\n", RISCV_IRQ_TIMER);//// /* Read m/sstatus & set timer interrupt enable in m/sie */ SET_CSR(CSR_IE, IE_TIE); @@ -164,6 +166,7 @@ void up_enable_irq(int irq) #ifdef CONFIG_BUILD_KERNEL else if (irq == RISCV_IRQ_MTIMER) { + _info("RISCV_IRQ_MTIMER=%d\n", RISCV_IRQ_MTIMER);//// /* Read m/sstatus & set timer interrupt enable in m/sie */ SET_CSR(mie, MIE_MTIE); @@ -172,6 +175,7 @@ void up_enable_irq(int irq) else if (irq > RISCV_IRQ_EXT) { extirq = irq - RISCV_IRQ_EXT; + _info("extirq=%d, RISCV_IRQ_EXT=%d\n", extirq, RISCV_IRQ_EXT);//// /* Set enable bit for the irq */ From eba8bbceba00f0c8ff5458669000b3a69b1bd56a Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Fri, 28 Jul 2023 15:12:13 +0800 Subject: [PATCH 075/108] Change IRQ to 57, Ext IRQ is 32 --- boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig b/boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig index 90f9fe1ce5721..1ea6c92592a40 100644 --- a/boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig +++ b/boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig @@ -12,7 +12,7 @@ CONFIG_16550_REGINCR=4 CONFIG_16550_UART0=y CONFIG_16550_UART0_BASE=0x10000000 CONFIG_16550_UART0_CLOCK=3686400 -CONFIG_16550_UART0_IRQ=32 +CONFIG_16550_UART0_IRQ=57 CONFIG_16550_UART0_SERIAL_CONSOLE=y CONFIG_16550_UART=y CONFIG_ARCH="risc-v" From b1c349b9d0d44b06264897207b000ba257dd40f6 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Fri, 28 Jul 2023 15:27:19 +0800 Subject: [PATCH 076/108] Log IRQ --- arch/risc-v/src/qemu-rv/qemu_rv_irq.c | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_irq.c b/arch/risc-v/src/qemu-rv/qemu_rv_irq.c index 618f608994e1a..061261a38815b 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_irq.c +++ b/arch/risc-v/src/qemu-rv/qemu_rv_irq.c @@ -65,6 +65,7 @@ void up_irqinitialize(void) int id; + ////TODO: Why 52 PLIC Interrupts? for (id = 1; id <= 52; id++) { putreg32(1, (uintptr_t)(QEMU_RV_PLIC_PRIORITY + 4 * id)); From c03eba3b8a67d1a028eefb71771eca6f2958d543 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Fri, 28 Jul 2023 15:52:17 +0800 Subject: [PATCH 077/108] Extend to 127 IRQs --- arch/risc-v/include/qemu-rv/irq.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/arch/risc-v/include/qemu-rv/irq.h b/arch/risc-v/include/qemu-rv/irq.h index 833633909eeaf..a12e8781a5616 100644 --- a/arch/risc-v/include/qemu-rv/irq.h +++ b/arch/risc-v/include/qemu-rv/irq.h @@ -31,8 +31,12 @@ /* Map RISC-V exception code to NuttX IRQ */ -#define QEMU_RV_IRQ_UART0 (RISCV_IRQ_MEXT + 10) +//// "JH7110 Interrupt Connections" says that Global Interrupts are 0 to 126 (127 total interrupts) +//// https://doc-en.rvspace.org/JH7110/TRM/JH7110_TRM/interrupt_connections.html +#define NR_IRQS (127) -#define NR_IRQS (QEMU_RV_IRQ_UART0 + 1) +////#define QEMU_RV_IRQ_UART0 (RISCV_IRQ_MEXT + 10) + +////#define NR_IRQS (QEMU_RV_IRQ_UART0 + 1) #endif /* __ARCH_RISCV_INCLUDE_QEMU_RV_IRQ_H */ From 4d76f70c1c5b5e4b3738189c0d4a14716958bad8 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Fri, 28 Jul 2023 17:12:19 +0800 Subject: [PATCH 078/108] Extend to 127 IRQs --- arch/risc-v/include/qemu-rv/irq.h | 2 +- arch/risc-v/src/qemu-rv/qemu_rv_irq.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/risc-v/include/qemu-rv/irq.h b/arch/risc-v/include/qemu-rv/irq.h index a12e8781a5616..20d15dc417f30 100644 --- a/arch/risc-v/include/qemu-rv/irq.h +++ b/arch/risc-v/include/qemu-rv/irq.h @@ -33,7 +33,7 @@ //// "JH7110 Interrupt Connections" says that Global Interrupts are 0 to 126 (127 total interrupts) //// https://doc-en.rvspace.org/JH7110/TRM/JH7110_TRM/interrupt_connections.html -#define NR_IRQS (127) +#define NR_IRQS (RISCV_IRQ_SEXT + 127) ////#define QEMU_RV_IRQ_UART0 (RISCV_IRQ_MEXT + 10) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_irq.c b/arch/risc-v/src/qemu-rv/qemu_rv_irq.c index 061261a38815b..e7fea36299107 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_irq.c +++ b/arch/risc-v/src/qemu-rv/qemu_rv_irq.c @@ -66,7 +66,7 @@ void up_irqinitialize(void) int id; ////TODO: Why 52 PLIC Interrupts? - for (id = 1; id <= 52; id++) + for (id = 1; id <= NR_IRQS; id++) //// Changed 52 to NR_IRQS { putreg32(1, (uintptr_t)(QEMU_RV_PLIC_PRIORITY + 4 * id)); } From c8f0e3a953e49f25dfdcd957bd9da2aebdf7aa28 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Fri, 28 Jul 2023 17:53:58 +0800 Subject: [PATCH 079/108] Fixing UART Interrupt --- arch/risc-v/src/qemu-rv/qemu_rv_start.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_start.c b/arch/risc-v/src/qemu-rv/qemu_rv_start.c index 37ee668f63bce..b58d6d826ff7a 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_start.c +++ b/arch/risc-v/src/qemu-rv/qemu_rv_start.c @@ -179,7 +179,7 @@ void qemu_rv_start(int mhartid) /* Set exception and interrupt delegation for S-mode */ ////WRITE_CSR(medeleg, 0xffff); - ////WRITE_CSR(mideleg, 0xffff); + ////WRITE_CSR(mideleg, 0xffff); ////TODO: Delegate M-Mode Interrupts to S-Mode /* Allow to write satp from S-mode */ From 121b08f81479d5e21abeeb3a295a62c6d44b27ea Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Fri, 28 Jul 2023 18:12:47 +0800 Subject: [PATCH 080/108] Fixing UART Interrupt --- arch/risc-v/src/qemu-rv/qemu_rv_irq.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_irq.c b/arch/risc-v/src/qemu-rv/qemu_rv_irq.c index e7fea36299107..f865c6aaf5140 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_irq.c +++ b/arch/risc-v/src/qemu-rv/qemu_rv_irq.c @@ -180,7 +180,7 @@ void up_enable_irq(int irq) /* Set enable bit for the irq */ - if (0 <= extirq && extirq <= 63) + if (0 <= extirq && extirq <= 63) ////TODO: Why 63? { modifyreg32(QEMU_RV_PLIC_ENABLE1 + (4 * (extirq / 32)), 0, 1 << (extirq % 32)); @@ -195,6 +195,7 @@ void up_enable_irq(int irq) irqstate_t up_irq_enable(void) { + _info("\n");//// irqstate_t oldstat; /* Enable external interrupts (mie/sie) */ From bf3475d369e4d240f80555d727f3694c5df7e1cb Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Fri, 28 Jul 2023 18:40:05 +0800 Subject: [PATCH 081/108] Debug Exception --- arch/risc-v/src/common/riscv_exception_common.S | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/arch/risc-v/src/common/riscv_exception_common.S b/arch/risc-v/src/common/riscv_exception_common.S index 1f1180d46b307..b29c7121cb20c 100644 --- a/arch/risc-v/src/common/riscv_exception_common.S +++ b/arch/risc-v/src/common/riscv_exception_common.S @@ -75,6 +75,14 @@ .align 8 exception_common: + /* Begin Debug */ + /* Load UART Base Address to Register t0 */ + li t0, 0x10000000 + /* Load `#` to Register t1 */ + li t1, 0x23 + /* Store byte from Register t1 to UART Base Address, Offset 0 */ + sb t1, 0(t0) + /* End Debug */ #ifdef CONFIG_ARCH_KERNEL_STACK /* Take the kernel stack into use */ From a3f4121b5a2183c04a9b15144d55e66f0e734355 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Fri, 28 Jul 2023 19:55:20 +0800 Subject: [PATCH 082/108] Debug Exception --- arch/risc-v/src/common/riscv_exception_common.S | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/risc-v/src/common/riscv_exception_common.S b/arch/risc-v/src/common/riscv_exception_common.S index b29c7121cb20c..9dd0a6690220f 100644 --- a/arch/risc-v/src/common/riscv_exception_common.S +++ b/arch/risc-v/src/common/riscv_exception_common.S @@ -78,8 +78,8 @@ exception_common: /* Begin Debug */ /* Load UART Base Address to Register t0 */ li t0, 0x10000000 - /* Load `#` to Register t1 */ - li t1, 0x23 + /* Load `$` to Register t1 */ + li t1, 0x24 /* Store byte from Register t1 to UART Base Address, Offset 0 */ sb t1, 0(t0) /* End Debug */ From 2979e5fac6bb6d51671035ff15cf8de14539b492 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Fri, 28 Jul 2023 20:03:50 +0800 Subject: [PATCH 083/108] Debug Exception --- arch/risc-v/src/qemu-rv/qemu_rv_irq_dispatch.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_irq_dispatch.c b/arch/risc-v/src/qemu-rv/qemu_rv_irq_dispatch.c index f73f672169586..e85e492dc6e4f 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_irq_dispatch.c +++ b/arch/risc-v/src/qemu-rv/qemu_rv_irq_dispatch.c @@ -55,12 +55,14 @@ void *riscv_dispatch_irq(uintptr_t vector, uintptr_t *regs) { + *(volatile uint8_t *)0x10000000 = '%';//// int irq = (vector >> RV_IRQ_MASK) | (vector & 0xf); /* Firstly, check if the irq is machine external interrupt */ if (RISCV_IRQ_EXT == irq) { + *(volatile uint8_t *)0x10000000 = '^';//// uintptr_t val = getreg32(QEMU_RV_PLIC_CLAIM); /* Add the value to nuttx irq which is offset to the mext */ @@ -72,6 +74,7 @@ void *riscv_dispatch_irq(uintptr_t vector, uintptr_t *regs) if (RISCV_IRQ_EXT != irq) { + *(volatile uint8_t *)0x10000000 = '&';//// /* Deliver the IRQ */ regs = riscv_doirq(irq, regs); @@ -79,6 +82,7 @@ void *riscv_dispatch_irq(uintptr_t vector, uintptr_t *regs) if (RISCV_IRQ_EXT <= irq) { + *(volatile uint8_t *)0x10000000 = '*';//// /* Then write PLIC_CLAIM to clear pending in PLIC */ putreg32(irq - RISCV_IRQ_EXT, QEMU_RV_PLIC_CLAIM); From 715fab2f79a778361ed2f83c0b7fb3ee6cfe8a18 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Fri, 28 Jul 2023 20:10:58 +0800 Subject: [PATCH 084/108] Debug Exception --- arch/risc-v/src/common/riscv_doirq.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/risc-v/src/common/riscv_doirq.c b/arch/risc-v/src/common/riscv_doirq.c index a1faf2aa0c512..a10d52cbd40c9 100644 --- a/arch/risc-v/src/common/riscv_doirq.c +++ b/arch/risc-v/src/common/riscv_doirq.c @@ -26,6 +26,7 @@ #include #include +#include //// #include #include @@ -57,6 +58,7 @@ uintptr_t *riscv_doirq(int irq, uintptr_t *regs) { + _info("irq=%d\n", irq);//// board_autoled_on(LED_INIRQ); #ifdef CONFIG_SUPPRESS_INTERRUPTS PANIC(); From ea7e9a019fef790d9e242218e7f9c5762f2c0937 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Fri, 28 Jul 2023 20:53:12 +0800 Subject: [PATCH 085/108] Debug Exception --- arch/risc-v/src/qemu-rv/qemu_rv_irq.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_irq.c b/arch/risc-v/src/qemu-rv/qemu_rv_irq.c index f865c6aaf5140..d92d875641aeb 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_irq.c +++ b/arch/risc-v/src/qemu-rv/qemu_rv_irq.c @@ -93,6 +93,9 @@ void up_irqinitialize(void) up_irq_enable(); #endif + + ////Testing + for (id = RISCV_IRQ_EXT + 1; id < 89; id++) { up_enable_irq(id); } //// } /**************************************************************************** @@ -105,6 +108,7 @@ void up_irqinitialize(void) void up_disable_irq(int irq) { + _info("irq=%d\n", irq);//// int extirq; if (irq == RISCV_IRQ_SOFT) From 4ccd58dcd2ca61662323aa297324e3ed065be35d Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Fri, 28 Jul 2023 22:23:47 +0800 Subject: [PATCH 086/108] Debug Exception --- arch/risc-v/src/qemu-rv/qemu_rv_irq.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_irq.c b/arch/risc-v/src/qemu-rv/qemu_rv_irq.c index d92d875641aeb..0049c6e156092 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_irq.c +++ b/arch/risc-v/src/qemu-rv/qemu_rv_irq.c @@ -94,7 +94,7 @@ void up_irqinitialize(void) up_irq_enable(); #endif - ////Testing + ////Testing: Enable all interrupts, all contexts for (id = RISCV_IRQ_EXT + 1; id < 89; id++) { up_enable_irq(id); } //// } @@ -186,8 +186,13 @@ void up_enable_irq(int irq) if (0 <= extirq && extirq <= 63) ////TODO: Why 63? { + ////TODO: What about QEMU_RV_PLIC_ENABLE2? Why 32? modifyreg32(QEMU_RV_PLIC_ENABLE1 + (4 * (extirq / 32)), 0, 1 << (extirq % 32)); + ////Testing + modifyreg32(QEMU_RV_PLIC_ENABLE2 + (4 * (extirq / 32)),//// + 0, 1 << (extirq % 32));//// + ////TODO: Test other contexts } else { From c003d2e7a19a945ea914ab6aeccdfbcbdc1e3d23 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Fri, 28 Jul 2023 22:34:53 +0800 Subject: [PATCH 087/108] Debug Exception --- .../src/qemu-rv/hardware/qemu_rv_plic.h | 9 ++ arch/risc-v/src/qemu-rv/qemu_rv_irq.c | 20 +++- .../rv-virt/scripts/ld-kernel64.script.tmp | 98 +++++++++++++++++++ 3 files changed, 122 insertions(+), 5 deletions(-) create mode 100644 boards/risc-v/qemu-rv/rv-virt/scripts/ld-kernel64.script.tmp diff --git a/arch/risc-v/src/qemu-rv/hardware/qemu_rv_plic.h b/arch/risc-v/src/qemu-rv/hardware/qemu_rv_plic.h index eac61f8fd1cad..76a921819d4eb 100644 --- a/arch/risc-v/src/qemu-rv/hardware/qemu_rv_plic.h +++ b/arch/risc-v/src/qemu-rv/hardware/qemu_rv_plic.h @@ -39,6 +39,15 @@ # define QEMU_RV_PLIC_ENABLE2 (QEMU_RV_PLIC_BASE + 0x002084) # define QEMU_RV_PLIC_THRESHOLD (QEMU_RV_PLIC_BASE + 0x201000) # define QEMU_RV_PLIC_CLAIM (QEMU_RV_PLIC_BASE + 0x201004) + +////Testing other contexts +# define QEMU_RV_PLIC_ENABLE_CONTEXT2 (QEMU_RV_PLIC_BASE + 0x002100) +# define QEMU_RV_PLIC_ENABLE_CONTEXT3 (QEMU_RV_PLIC_BASE + 0x002180) +# define QEMU_RV_PLIC_ENABLE_CONTEXT4 (QEMU_RV_PLIC_BASE + 0x002200) +# define QEMU_RV_PLIC_ENABLE_CONTEXT5 (QEMU_RV_PLIC_BASE + 0x002280) +# define QEMU_RV_PLIC_ENABLE_CONTEXT6 (QEMU_RV_PLIC_BASE + 0x002300) +# define QEMU_RV_PLIC_ENABLE_CONTEXT7 (QEMU_RV_PLIC_BASE + 0x002380) +# define QEMU_RV_PLIC_ENABLE_CONTEXT8 (QEMU_RV_PLIC_BASE + 0x002400) #else # define QEMU_RV_PLIC_ENABLE1 (QEMU_RV_PLIC_BASE + 0x002000) # define QEMU_RV_PLIC_ENABLE2 (QEMU_RV_PLIC_BASE + 0x002004) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_irq.c b/arch/risc-v/src/qemu-rv/qemu_rv_irq.c index 0049c6e156092..296767f4e5b4e 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_irq.c +++ b/arch/risc-v/src/qemu-rv/qemu_rv_irq.c @@ -186,13 +186,23 @@ void up_enable_irq(int irq) if (0 <= extirq && extirq <= 63) ////TODO: Why 63? { - ////TODO: What about QEMU_RV_PLIC_ENABLE2? Why 32? modifyreg32(QEMU_RV_PLIC_ENABLE1 + (4 * (extirq / 32)), 0, 1 << (extirq % 32)); - ////Testing - modifyreg32(QEMU_RV_PLIC_ENABLE2 + (4 * (extirq / 32)),//// - 0, 1 << (extirq % 32));//// - ////TODO: Test other contexts + ////Test other contexts + modifyreg32(QEMU_RV_PLIC_ENABLE_CONTEXT2 + (4 * (extirq / 32)), + 0, 1 << (extirq % 32)); + modifyreg32(QEMU_RV_PLIC_ENABLE_CONTEXT3 + (4 * (extirq / 32)), + 0, 1 << (extirq % 32)); + modifyreg32(QEMU_RV_PLIC_ENABLE_CONTEXT4 + (4 * (extirq / 32)), + 0, 1 << (extirq % 32)); + modifyreg32(QEMU_RV_PLIC_ENABLE_CONTEXT5 + (4 * (extirq / 32)), + 0, 1 << (extirq % 32)); + modifyreg32(QEMU_RV_PLIC_ENABLE_CONTEXT6 + (4 * (extirq / 32)), + 0, 1 << (extirq % 32)); + modifyreg32(QEMU_RV_PLIC_ENABLE_CONTEXT7 + (4 * (extirq / 32)), + 0, 1 << (extirq % 32)); + modifyreg32(QEMU_RV_PLIC_ENABLE_CONTEXT8 + (4 * (extirq / 32)), + 0, 1 << (extirq % 32)); } else { diff --git a/boards/risc-v/qemu-rv/rv-virt/scripts/ld-kernel64.script.tmp b/boards/risc-v/qemu-rv/rv-virt/scripts/ld-kernel64.script.tmp new file mode 100644 index 0000000000000..0dd8838de32de --- /dev/null +++ b/boards/risc-v/qemu-rv/rv-virt/scripts/ld-kernel64.script.tmp @@ -0,0 +1,98 @@ +MEMORY +{ + kflash (rx) : ORIGIN = 0x40200000, LENGTH = 2048K + ksram (rwx) : ORIGIN = 0x40400000, LENGTH = 2048K + pgram (rwx) : ORIGIN = 0x40600000, LENGTH = 4096K + ramdisk (rwx) : ORIGIN = 0x40A00000, LENGTH = 16M +} +OUTPUT_ARCH("riscv") +__kflash_start = ORIGIN(kflash); +__kflash_size = LENGTH(kflash); +__ksram_start = ORIGIN(ksram); +__ksram_size = LENGTH(ksram); +__ksram_end = ORIGIN(ksram) + LENGTH(ksram); +__pgheap_start = ORIGIN(pgram); +__pgheap_size = LENGTH(pgram) + LENGTH(ramdisk); +__ramdisk_start = ORIGIN(ramdisk); +__ramdisk_size = LENGTH(ramdisk); +__ramdisk_end = ORIGIN(ramdisk) + LENGTH(ramdisk); +SECTIONS +{ + . = 0x40200000; + .text : + { + _stext = . ; + *(.text) + *(.text.*) + *(.gnu.warning) + *(.stub) + *(.glue_7) + *(.glue_7t) + *(.jcr) + *(.gnu.linkonce.t.*) + *(.init) + *(.fini) + _etext = . ; + } + .rodata : + { + _srodata = . ; + *(.rodata) + *(.rodata1) + *(.rodata.*) + *(.gnu.linkonce.r*) + _erodata = . ; + } + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } + _eronly = ABSOLUTE(.); + .data : + { + _sdata = . ; + *(.data) + *(.data1) + *(.data.*) + *(.gnu.linkonce.d*) + . = ALIGN(4); + _edata = . ; + } + .bss : + { + _sbss = . ; + *(.bss) + *(.bss.*) + *(.sbss) + *(.sbss.*) + *(.gnu.linkonce.b*) + *(COMMON) + _ebss = . ; + } > ksram + .pgtables (NOLOAD) : ALIGN(0x1000) { + *(.pgtables) + . = ALIGN(4); + } > ksram + .stack_top : { + . = ALIGN(32); + _ebss = ABSOLUTE(.); + } > ksram + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_info 0 : { *(.debug_info) } + .debug_line 0 : { *(.debug_line) } + .debug_pubnames 0 : { *(.debug_pubnames) } + .debug_aranges 0 : { *(.debug_aranges) } +} From c3c12d0ede8c917f50899ab7622b4193056c82fc Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Fri, 28 Jul 2023 22:43:01 +0800 Subject: [PATCH 088/108] Debug Exception --- .../src/qemu-rv/hardware/qemu_rv_plic.h | 2 + arch/risc-v/src/qemu-rv/qemu_rv_irq.c | 4 + .../rv-virt/scripts/ld-kernel64.script.tmp | 98 ------------------- 3 files changed, 6 insertions(+), 98 deletions(-) delete mode 100644 boards/risc-v/qemu-rv/rv-virt/scripts/ld-kernel64.script.tmp diff --git a/arch/risc-v/src/qemu-rv/hardware/qemu_rv_plic.h b/arch/risc-v/src/qemu-rv/hardware/qemu_rv_plic.h index 76a921819d4eb..6eca71b99040a 100644 --- a/arch/risc-v/src/qemu-rv/hardware/qemu_rv_plic.h +++ b/arch/risc-v/src/qemu-rv/hardware/qemu_rv_plic.h @@ -41,6 +41,8 @@ # define QEMU_RV_PLIC_CLAIM (QEMU_RV_PLIC_BASE + 0x201004) ////Testing other contexts +# define QEMU_RV_PLIC_ENABLE_CONTEXT0 (QEMU_RV_PLIC_BASE + 0x002000) +# define QEMU_RV_PLIC_ENABLE_CONTEXT1 (QEMU_RV_PLIC_BASE + 0x002080) # define QEMU_RV_PLIC_ENABLE_CONTEXT2 (QEMU_RV_PLIC_BASE + 0x002100) # define QEMU_RV_PLIC_ENABLE_CONTEXT3 (QEMU_RV_PLIC_BASE + 0x002180) # define QEMU_RV_PLIC_ENABLE_CONTEXT4 (QEMU_RV_PLIC_BASE + 0x002200) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_irq.c b/arch/risc-v/src/qemu-rv/qemu_rv_irq.c index 296767f4e5b4e..afc6b6914ece8 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_irq.c +++ b/arch/risc-v/src/qemu-rv/qemu_rv_irq.c @@ -189,6 +189,10 @@ void up_enable_irq(int irq) modifyreg32(QEMU_RV_PLIC_ENABLE1 + (4 * (extirq / 32)), 0, 1 << (extirq % 32)); ////Test other contexts + modifyreg32(QEMU_RV_PLIC_ENABLE_CONTEXT0 + (4 * (extirq / 32)), + 0, 1 << (extirq % 32)); + modifyreg32(QEMU_RV_PLIC_ENABLE_CONTEXT1 + (4 * (extirq / 32)), + 0, 1 << (extirq % 32)); modifyreg32(QEMU_RV_PLIC_ENABLE_CONTEXT2 + (4 * (extirq / 32)), 0, 1 << (extirq % 32)); modifyreg32(QEMU_RV_PLIC_ENABLE_CONTEXT3 + (4 * (extirq / 32)), diff --git a/boards/risc-v/qemu-rv/rv-virt/scripts/ld-kernel64.script.tmp b/boards/risc-v/qemu-rv/rv-virt/scripts/ld-kernel64.script.tmp deleted file mode 100644 index 0dd8838de32de..0000000000000 --- a/boards/risc-v/qemu-rv/rv-virt/scripts/ld-kernel64.script.tmp +++ /dev/null @@ -1,98 +0,0 @@ -MEMORY -{ - kflash (rx) : ORIGIN = 0x40200000, LENGTH = 2048K - ksram (rwx) : ORIGIN = 0x40400000, LENGTH = 2048K - pgram (rwx) : ORIGIN = 0x40600000, LENGTH = 4096K - ramdisk (rwx) : ORIGIN = 0x40A00000, LENGTH = 16M -} -OUTPUT_ARCH("riscv") -__kflash_start = ORIGIN(kflash); -__kflash_size = LENGTH(kflash); -__ksram_start = ORIGIN(ksram); -__ksram_size = LENGTH(ksram); -__ksram_end = ORIGIN(ksram) + LENGTH(ksram); -__pgheap_start = ORIGIN(pgram); -__pgheap_size = LENGTH(pgram) + LENGTH(ramdisk); -__ramdisk_start = ORIGIN(ramdisk); -__ramdisk_size = LENGTH(ramdisk); -__ramdisk_end = ORIGIN(ramdisk) + LENGTH(ramdisk); -SECTIONS -{ - . = 0x40200000; - .text : - { - _stext = . ; - *(.text) - *(.text.*) - *(.gnu.warning) - *(.stub) - *(.glue_7) - *(.glue_7t) - *(.jcr) - *(.gnu.linkonce.t.*) - *(.init) - *(.fini) - _etext = . ; - } - .rodata : - { - _srodata = . ; - *(.rodata) - *(.rodata1) - *(.rodata.*) - *(.gnu.linkonce.r*) - _erodata = . ; - } - .tdata : { - _stdata = ABSOLUTE(.); - *(.tdata .tdata.* .gnu.linkonce.td.*); - _etdata = ABSOLUTE(.); - } - .tbss : { - _stbss = ABSOLUTE(.); - *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); - _etbss = ABSOLUTE(.); - } - _eronly = ABSOLUTE(.); - .data : - { - _sdata = . ; - *(.data) - *(.data1) - *(.data.*) - *(.gnu.linkonce.d*) - . = ALIGN(4); - _edata = . ; - } - .bss : - { - _sbss = . ; - *(.bss) - *(.bss.*) - *(.sbss) - *(.sbss.*) - *(.gnu.linkonce.b*) - *(COMMON) - _ebss = . ; - } > ksram - .pgtables (NOLOAD) : ALIGN(0x1000) { - *(.pgtables) - . = ALIGN(4); - } > ksram - .stack_top : { - . = ALIGN(32); - _ebss = ABSOLUTE(.); - } > ksram - .stab 0 : { *(.stab) } - .stabstr 0 : { *(.stabstr) } - .stab.excl 0 : { *(.stab.excl) } - .stab.exclstr 0 : { *(.stab.exclstr) } - .stab.index 0 : { *(.stab.index) } - .stab.indexstr 0 : { *(.stab.indexstr) } - .comment 0 : { *(.comment) } - .debug_abbrev 0 : { *(.debug_abbrev) } - .debug_info 0 : { *(.debug_info) } - .debug_line 0 : { *(.debug_line) } - .debug_pubnames 0 : { *(.debug_pubnames) } - .debug_aranges 0 : { *(.debug_aranges) } -} From 89d7fdaf0cdf9cca22e286099dc61cd2715860e3 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Fri, 28 Jul 2023 23:38:56 +0800 Subject: [PATCH 089/108] Fix PLIC for Hart 1 S-Mode --- .../src/qemu-rv/hardware/qemu_rv_plic.h | 37 +++++++++++-------- arch/risc-v/src/qemu-rv/qemu_rv_irq.c | 19 ---------- 2 files changed, 22 insertions(+), 34 deletions(-) diff --git a/arch/risc-v/src/qemu-rv/hardware/qemu_rv_plic.h b/arch/risc-v/src/qemu-rv/hardware/qemu_rv_plic.h index 6eca71b99040a..a161eefe9e759 100644 --- a/arch/risc-v/src/qemu-rv/hardware/qemu_rv_plic.h +++ b/arch/risc-v/src/qemu-rv/hardware/qemu_rv_plic.h @@ -31,25 +31,32 @@ * Pre-processor Definitions ****************************************************************************/ +// | 0x0C00_0004 | 4B | RW | Source 1 priority #define QEMU_RV_PLIC_PRIORITY (QEMU_RV_PLIC_BASE + 0x000000) + +// | 0x0C00_1000 | 4B | RO | Start of pending array #define QEMU_RV_PLIC_PENDING1 (QEMU_RV_PLIC_BASE + 0x001000) +// Previously: +// #define QEMU_RV_PLIC_PRIORITY (QEMU_RV_PLIC_BASE + 0x000000) +// #define QEMU_RV_PLIC_PENDING1 (QEMU_RV_PLIC_BASE + 0x001000) + #ifdef CONFIG_ARCH_USE_S_MODE -# define QEMU_RV_PLIC_ENABLE1 (QEMU_RV_PLIC_BASE + 0x002080) -# define QEMU_RV_PLIC_ENABLE2 (QEMU_RV_PLIC_BASE + 0x002084) -# define QEMU_RV_PLIC_THRESHOLD (QEMU_RV_PLIC_BASE + 0x201000) -# define QEMU_RV_PLIC_CLAIM (QEMU_RV_PLIC_BASE + 0x201004) - -////Testing other contexts -# define QEMU_RV_PLIC_ENABLE_CONTEXT0 (QEMU_RV_PLIC_BASE + 0x002000) -# define QEMU_RV_PLIC_ENABLE_CONTEXT1 (QEMU_RV_PLIC_BASE + 0x002080) -# define QEMU_RV_PLIC_ENABLE_CONTEXT2 (QEMU_RV_PLIC_BASE + 0x002100) -# define QEMU_RV_PLIC_ENABLE_CONTEXT3 (QEMU_RV_PLIC_BASE + 0x002180) -# define QEMU_RV_PLIC_ENABLE_CONTEXT4 (QEMU_RV_PLIC_BASE + 0x002200) -# define QEMU_RV_PLIC_ENABLE_CONTEXT5 (QEMU_RV_PLIC_BASE + 0x002280) -# define QEMU_RV_PLIC_ENABLE_CONTEXT6 (QEMU_RV_PLIC_BASE + 0x002300) -# define QEMU_RV_PLIC_ENABLE_CONTEXT7 (QEMU_RV_PLIC_BASE + 0x002380) -# define QEMU_RV_PLIC_ENABLE_CONTEXT8 (QEMU_RV_PLIC_BASE + 0x002400) +// | 0x0C00_2100 | 4B | RW | Start Hart 1 S-Mode interrupt enables +# define QEMU_RV_PLIC_ENABLE1 (QEMU_RV_PLIC_BASE + 0x002100) +# define QEMU_RV_PLIC_ENABLE2 (QEMU_RV_PLIC_BASE + 0x002104) + +// | 0x0C20_2000 | 4B | RW | Hart 1 S-Mode priority threshold +# define QEMU_RV_PLIC_THRESHOLD (QEMU_RV_PLIC_BASE + 0x202000) + +// | 0x0C20_2004 | 4B | RW | Hart 1 S-Mode claim/complete +# define QEMU_RV_PLIC_CLAIM (QEMU_RV_PLIC_BASE + 0x202004) + +// Previously: +// # define QEMU_RV_PLIC_ENABLE1 (QEMU_RV_PLIC_BASE + 0x002080) +// # define QEMU_RV_PLIC_ENABLE2 (QEMU_RV_PLIC_BASE + 0x002084) +// # define QEMU_RV_PLIC_THRESHOLD (QEMU_RV_PLIC_BASE + 0x201000) +// # define QEMU_RV_PLIC_CLAIM (QEMU_RV_PLIC_BASE + 0x201004) #else # define QEMU_RV_PLIC_ENABLE1 (QEMU_RV_PLIC_BASE + 0x002000) # define QEMU_RV_PLIC_ENABLE2 (QEMU_RV_PLIC_BASE + 0x002004) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_irq.c b/arch/risc-v/src/qemu-rv/qemu_rv_irq.c index afc6b6914ece8..18f7fbb750683 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_irq.c +++ b/arch/risc-v/src/qemu-rv/qemu_rv_irq.c @@ -188,25 +188,6 @@ void up_enable_irq(int irq) { modifyreg32(QEMU_RV_PLIC_ENABLE1 + (4 * (extirq / 32)), 0, 1 << (extirq % 32)); - ////Test other contexts - modifyreg32(QEMU_RV_PLIC_ENABLE_CONTEXT0 + (4 * (extirq / 32)), - 0, 1 << (extirq % 32)); - modifyreg32(QEMU_RV_PLIC_ENABLE_CONTEXT1 + (4 * (extirq / 32)), - 0, 1 << (extirq % 32)); - modifyreg32(QEMU_RV_PLIC_ENABLE_CONTEXT2 + (4 * (extirq / 32)), - 0, 1 << (extirq % 32)); - modifyreg32(QEMU_RV_PLIC_ENABLE_CONTEXT3 + (4 * (extirq / 32)), - 0, 1 << (extirq % 32)); - modifyreg32(QEMU_RV_PLIC_ENABLE_CONTEXT4 + (4 * (extirq / 32)), - 0, 1 << (extirq % 32)); - modifyreg32(QEMU_RV_PLIC_ENABLE_CONTEXT5 + (4 * (extirq / 32)), - 0, 1 << (extirq % 32)); - modifyreg32(QEMU_RV_PLIC_ENABLE_CONTEXT6 + (4 * (extirq / 32)), - 0, 1 << (extirq % 32)); - modifyreg32(QEMU_RV_PLIC_ENABLE_CONTEXT7 + (4 * (extirq / 32)), - 0, 1 << (extirq % 32)); - modifyreg32(QEMU_RV_PLIC_ENABLE_CONTEXT8 + (4 * (extirq / 32)), - 0, 1 << (extirq % 32)); } else { From c2d256a92a48c1cfdedb11ffa8eca6d1c9f15818 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Fri, 28 Jul 2023 23:45:04 +0800 Subject: [PATCH 090/108] IRQ 57 OK yay! --- arch/risc-v/src/qemu-rv/qemu_rv_irq.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_irq.c b/arch/risc-v/src/qemu-rv/qemu_rv_irq.c index 18f7fbb750683..d5c9a7ca68fca 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_irq.c +++ b/arch/risc-v/src/qemu-rv/qemu_rv_irq.c @@ -95,7 +95,7 @@ void up_irqinitialize(void) #endif ////Testing: Enable all interrupts, all contexts - for (id = RISCV_IRQ_EXT + 1; id < 89; id++) { up_enable_irq(id); } //// + // for (id = RISCV_IRQ_EXT + 1; id < 89; id++) { up_enable_irq(id); } //// } /**************************************************************************** From e6f5ed798a3b69f7c4218480a8acb7d5b966707e Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Fri, 28 Jul 2023 23:50:04 +0800 Subject: [PATCH 091/108] Remove logs --- arch/risc-v/src/common/riscv_doirq.c | 2 -- arch/risc-v/src/qemu-rv/qemu_rv_irq_dispatch.c | 4 ---- 2 files changed, 6 deletions(-) diff --git a/arch/risc-v/src/common/riscv_doirq.c b/arch/risc-v/src/common/riscv_doirq.c index a10d52cbd40c9..a1faf2aa0c512 100644 --- a/arch/risc-v/src/common/riscv_doirq.c +++ b/arch/risc-v/src/common/riscv_doirq.c @@ -26,7 +26,6 @@ #include #include -#include //// #include #include @@ -58,7 +57,6 @@ uintptr_t *riscv_doirq(int irq, uintptr_t *regs) { - _info("irq=%d\n", irq);//// board_autoled_on(LED_INIRQ); #ifdef CONFIG_SUPPRESS_INTERRUPTS PANIC(); diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_irq_dispatch.c b/arch/risc-v/src/qemu-rv/qemu_rv_irq_dispatch.c index e85e492dc6e4f..f73f672169586 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_irq_dispatch.c +++ b/arch/risc-v/src/qemu-rv/qemu_rv_irq_dispatch.c @@ -55,14 +55,12 @@ void *riscv_dispatch_irq(uintptr_t vector, uintptr_t *regs) { - *(volatile uint8_t *)0x10000000 = '%';//// int irq = (vector >> RV_IRQ_MASK) | (vector & 0xf); /* Firstly, check if the irq is machine external interrupt */ if (RISCV_IRQ_EXT == irq) { - *(volatile uint8_t *)0x10000000 = '^';//// uintptr_t val = getreg32(QEMU_RV_PLIC_CLAIM); /* Add the value to nuttx irq which is offset to the mext */ @@ -74,7 +72,6 @@ void *riscv_dispatch_irq(uintptr_t vector, uintptr_t *regs) if (RISCV_IRQ_EXT != irq) { - *(volatile uint8_t *)0x10000000 = '&';//// /* Deliver the IRQ */ regs = riscv_doirq(irq, regs); @@ -82,7 +79,6 @@ void *riscv_dispatch_irq(uintptr_t vector, uintptr_t *regs) if (RISCV_IRQ_EXT <= irq) { - *(volatile uint8_t *)0x10000000 = '*';//// /* Then write PLIC_CLAIM to clear pending in PLIC */ putreg32(irq - RISCV_IRQ_EXT, QEMU_RV_PLIC_CLAIM); From 0678e84948b821b6f63a9c2d4e37f4b4228ba423 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Fri, 28 Jul 2023 23:53:56 +0800 Subject: [PATCH 092/108] Remove logs --- arch/risc-v/src/common/riscv_exception_common.S | 8 -------- drivers/serial/uart_16550.c | 1 - 2 files changed, 9 deletions(-) diff --git a/arch/risc-v/src/common/riscv_exception_common.S b/arch/risc-v/src/common/riscv_exception_common.S index 9dd0a6690220f..1f1180d46b307 100644 --- a/arch/risc-v/src/common/riscv_exception_common.S +++ b/arch/risc-v/src/common/riscv_exception_common.S @@ -75,14 +75,6 @@ .align 8 exception_common: - /* Begin Debug */ - /* Load UART Base Address to Register t0 */ - li t0, 0x10000000 - /* Load `$` to Register t1 */ - li t1, 0x24 - /* Store byte from Register t1 to UART Base Address, Offset 0 */ - sb t1, 0(t0) - /* End Debug */ #ifdef CONFIG_ARCH_KERNEL_STACK /* Take the kernel stack into use */ diff --git a/drivers/serial/uart_16550.c b/drivers/serial/uart_16550.c index abdcdc7b6ba02..beed6b20ee1ea 100644 --- a/drivers/serial/uart_16550.c +++ b/drivers/serial/uart_16550.c @@ -930,7 +930,6 @@ static void u16550_detach(FAR struct uart_dev_s *dev) static int u16550_interrupt(int irq, FAR void *context, FAR void *arg) { - *(volatile uint8_t *)0x10000000 = '#';//// FAR struct uart_dev_s *dev = (struct uart_dev_s *)arg; FAR struct u16550_s *priv; uint32_t status; From a5027d514187a04bbc532a29b0c13cb4eb9e3781 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Sat, 29 Jul 2023 00:54:58 +0800 Subject: [PATCH 093/108] IRQ 57 OK yay! --- arch/risc-v/src/qemu-rv/qemu_rv_irq.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_irq.c b/arch/risc-v/src/qemu-rv/qemu_rv_irq.c index d5c9a7ca68fca..5a864452d4fd1 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_irq.c +++ b/arch/risc-v/src/qemu-rv/qemu_rv_irq.c @@ -129,7 +129,7 @@ void up_disable_irq(int irq) /* Clear enable bit for the irq */ - if (0 <= extirq && extirq <= 63) + if (0 <= extirq && extirq <= 63) ////TODO: Why 63? { modifyreg32(QEMU_RV_PLIC_ENABLE1 + (4 * (extirq / 32)), 1 << (extirq % 32), 0); From 7923912771b636a348a473341af55a5fdf988ec4 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Sat, 29 Jul 2023 15:22:10 +0800 Subject: [PATCH 094/108] responds to UART Input yay --- drivers/serial/uart_16550.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/serial/uart_16550.c b/drivers/serial/uart_16550.c index beed6b20ee1ea..ee49b647bf8ea 100644 --- a/drivers/serial/uart_16550.c +++ b/drivers/serial/uart_16550.c @@ -972,6 +972,7 @@ static int u16550_interrupt(int irq, FAR void *context, FAR void *arg) case UART_IIR_INTID_RDA: case UART_IIR_INTID_CTI: { + *(volatile uint8_t *)0x10000000 = '+';//// uart_recvchars(dev); break; } From 1d5a79cb0bef3fed7c7e65238771df18f307ced4 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Sat, 29 Jul 2023 15:40:18 +0800 Subject: [PATCH 095/108] responds to UART Input yay --- drivers/serial/uart_16550.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/serial/uart_16550.c b/drivers/serial/uart_16550.c index ee49b647bf8ea..0c4e2192770b3 100644 --- a/drivers/serial/uart_16550.c +++ b/drivers/serial/uart_16550.c @@ -981,6 +981,7 @@ static int u16550_interrupt(int irq, FAR void *context, FAR void *arg) case UART_IIR_INTID_THRE: { + *(volatile uint8_t *)0x10000000 = '-';//// uart_xmitchars(dev); break; } From 9094e954088513b3881d4137771472850cbd9f47 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Sat, 29 Jul 2023 20:59:56 +0800 Subject: [PATCH 096/108] Interrupt triggered repeatedly --- drivers/serial/uart_16550.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/serial/uart_16550.c b/drivers/serial/uart_16550.c index 0c4e2192770b3..71a9f1e591cfa 100644 --- a/drivers/serial/uart_16550.c +++ b/drivers/serial/uart_16550.c @@ -930,6 +930,7 @@ static void u16550_detach(FAR struct uart_dev_s *dev) static int u16550_interrupt(int irq, FAR void *context, FAR void *arg) { + *(volatile uint8_t *)0x10000000 = '#';//// FAR struct uart_dev_s *dev = (struct uart_dev_s *)arg; FAR struct u16550_s *priv; uint32_t status; @@ -1231,6 +1232,7 @@ static int u16550_receive(struct uart_dev_s *dev, unsigned int *status) static void u16550_rxint(struct uart_dev_s *dev, bool enable) { + _info("enable=%d\n", enable);//// FAR struct u16550_s *priv = (FAR struct u16550_s *)dev->priv; #ifdef HAVE_16550_UART_DMA @@ -1566,6 +1568,7 @@ static void u16550_send(struct uart_dev_s *dev, int ch) static void u16550_txint(struct uart_dev_s *dev, bool enable) { + _info("enable=%d\n", enable);//// FAR struct u16550_s *priv = (FAR struct u16550_s *)dev->priv; irqstate_t flags; From 9104a64fed5a21e90661c472c95bc2f910ae5584 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Sat, 29 Jul 2023 21:11:54 +0800 Subject: [PATCH 097/108] Shows 0 forever --- drivers/serial/uart_16550.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/serial/uart_16550.c b/drivers/serial/uart_16550.c index 71a9f1e591cfa..fa0d6e69a74e7 100644 --- a/drivers/serial/uart_16550.c +++ b/drivers/serial/uart_16550.c @@ -930,7 +930,7 @@ static void u16550_detach(FAR struct uart_dev_s *dev) static int u16550_interrupt(int irq, FAR void *context, FAR void *arg) { - *(volatile uint8_t *)0x10000000 = '#';//// + ////*(volatile uint8_t *)0x10000000 = '#';//// FAR struct uart_dev_s *dev = (struct uart_dev_s *)arg; FAR struct u16550_s *priv; uint32_t status; @@ -961,6 +961,7 @@ static int u16550_interrupt(int irq, FAR void *context, FAR void *arg) * pending interrupt */ + static int i = 0; if (i++ % 1000 == 1) { *(volatile uint8_t *)0x10000000 = '0'; }//// break; } @@ -991,6 +992,7 @@ static int u16550_interrupt(int irq, FAR void *context, FAR void *arg) case UART_IIR_INTID_MSI: { + *(volatile uint8_t *)0x10000000 = '1';//// /* Read the modem status register (MSR) to clear */ status = u16550_serialin(priv, UART_MSR_OFFSET); @@ -1002,6 +1004,7 @@ static int u16550_interrupt(int irq, FAR void *context, FAR void *arg) case UART_IIR_INTID_RLS: { + *(volatile uint8_t *)0x10000000 = '2';//// /* Read the line status register (LSR) to clear */ status = u16550_serialin(priv, UART_LSR_OFFSET); @@ -1013,6 +1016,7 @@ static int u16550_interrupt(int irq, FAR void *context, FAR void *arg) default: { + *(volatile uint8_t *)0x10000000 = '3';//// serr("ERROR: Unexpected IIR: %02"PRIx32"\n", status); break; } From ba4231e2ad2c65e6c342962f653c680ef5d00d4f Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Sat, 29 Jul 2023 21:26:09 +0800 Subject: [PATCH 098/108] Checking claim --- arch/risc-v/src/qemu-rv/qemu_rv_irq.c | 3 --- arch/risc-v/src/qemu-rv/qemu_rv_irq_dispatch.c | 2 ++ drivers/serial/uart_16550.c | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_irq.c b/arch/risc-v/src/qemu-rv/qemu_rv_irq.c index 5a864452d4fd1..dc82265c1e303 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_irq.c +++ b/arch/risc-v/src/qemu-rv/qemu_rv_irq.c @@ -93,9 +93,6 @@ void up_irqinitialize(void) up_irq_enable(); #endif - - ////Testing: Enable all interrupts, all contexts - // for (id = RISCV_IRQ_EXT + 1; id < 89; id++) { up_enable_irq(id); } //// } /**************************************************************************** diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_irq_dispatch.c b/arch/risc-v/src/qemu-rv/qemu_rv_irq_dispatch.c index f73f672169586..8327b62dde02d 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_irq_dispatch.c +++ b/arch/risc-v/src/qemu-rv/qemu_rv_irq_dispatch.c @@ -26,6 +26,7 @@ #include #include +#include /// #include #include @@ -79,6 +80,7 @@ void *riscv_dispatch_irq(uintptr_t vector, uintptr_t *regs) if (RISCV_IRQ_EXT <= irq) { + _info("irq=%d, RISCV_IRQ_EXT=%d\n", irq, RISCV_IRQ_EXT);//// /* Then write PLIC_CLAIM to clear pending in PLIC */ putreg32(irq - RISCV_IRQ_EXT, QEMU_RV_PLIC_CLAIM); diff --git a/drivers/serial/uart_16550.c b/drivers/serial/uart_16550.c index fa0d6e69a74e7..d76b8cfc0fada 100644 --- a/drivers/serial/uart_16550.c +++ b/drivers/serial/uart_16550.c @@ -961,7 +961,7 @@ static int u16550_interrupt(int irq, FAR void *context, FAR void *arg) * pending interrupt */ - static int i = 0; if (i++ % 1000 == 1) { *(volatile uint8_t *)0x10000000 = '0'; }//// + static int i = 0; if (i++ % 10000 == 1) { *(volatile uint8_t *)0x10000000 = '0'; }//// break; } From 652648ded2ef70a051a0b2e4e44e8b6dba3a8250 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Sat, 29 Jul 2023 21:33:12 +0800 Subject: [PATCH 099/108] Why UART_IIR_INTSTATUS = 0 --- arch/risc-v/src/qemu-rv/qemu_rv_irq_dispatch.c | 2 +- drivers/serial/uart_16550.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_irq_dispatch.c b/arch/risc-v/src/qemu-rv/qemu_rv_irq_dispatch.c index 8327b62dde02d..2545924ce41d1 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_irq_dispatch.c +++ b/arch/risc-v/src/qemu-rv/qemu_rv_irq_dispatch.c @@ -80,7 +80,7 @@ void *riscv_dispatch_irq(uintptr_t vector, uintptr_t *regs) if (RISCV_IRQ_EXT <= irq) { - _info("irq=%d, RISCV_IRQ_EXT=%d\n", irq, RISCV_IRQ_EXT);//// + ////_info("irq=%d, RISCV_IRQ_EXT=%d\n", irq, RISCV_IRQ_EXT);//// /* Then write PLIC_CLAIM to clear pending in PLIC */ putreg32(irq - RISCV_IRQ_EXT, QEMU_RV_PLIC_CLAIM); diff --git a/drivers/serial/uart_16550.c b/drivers/serial/uart_16550.c index d76b8cfc0fada..e77803fe4ad38 100644 --- a/drivers/serial/uart_16550.c +++ b/drivers/serial/uart_16550.c @@ -961,7 +961,7 @@ static int u16550_interrupt(int irq, FAR void *context, FAR void *arg) * pending interrupt */ - static int i = 0; if (i++ % 10000 == 1) { *(volatile uint8_t *)0x10000000 = '0'; }//// + static int i = 0; if (i++ % 100000 == 1) { *(volatile uint8_t *)0x10000000 = '0'; }//// break; } From 9d715b36b1af469e32929e53e9ca2734ed21a2c6 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Sat, 29 Jul 2023 22:13:05 +0800 Subject: [PATCH 100/108] Log UART Interrupt Status. 056789 --- drivers/serial/uart_16550.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/drivers/serial/uart_16550.c b/drivers/serial/uart_16550.c index e77803fe4ad38..a44534ca52e1d 100644 --- a/drivers/serial/uart_16550.c +++ b/drivers/serial/uart_16550.c @@ -961,7 +961,27 @@ static int u16550_interrupt(int irq, FAR void *context, FAR void *arg) * pending interrupt */ - static int i = 0; if (i++ % 100000 == 1) { *(volatile uint8_t *)0x10000000 = '0'; }//// + ////Begin + static int i = 0; if (i++ % 1000000 == 1) { + *(volatile uint8_t *)0x10000000 = '0'; + #define UART_IIR_MSI 0x00 /* Modem status interrupt */ + #define UART_IIR_THRI 0x02 /* Transmitter holding register empty */ + #define UART_IIR_RDI 0x04 /* Receiver data interrupt */ + #define UART_IIR_RLSI 0x06 /* Receiver line status interrupt */ + #define UART_IIR_BUSY 0x07 /* DesignWare APB Busy Detect */ + #define UART_IIR_RX_TIMEOUT 0x0c /* OMAP RX Timeout interrupt */ + #define UART_IIR_XOFF 0x10 /* OMAP XOFF/Special Character */ + #define UART_IIR_CTS_RTS_DSR 0x20 /* OMAP CTS/RTS/DSR Change */ + if (status & UART_IIR_MSI) { *(volatile uint8_t *)0x10000000 = '4'; }//// + if (status & UART_IIR_THRI) { *(volatile uint8_t *)0x10000000 = '5'; }//// + if (status & UART_IIR_RDI) { *(volatile uint8_t *)0x10000000 = '6'; }//// + if (status & UART_IIR_RLSI) { *(volatile uint8_t *)0x10000000 = '7'; }//// + if (status & UART_IIR_BUSY) { *(volatile uint8_t *)0x10000000 = '8'; }//// + if (status & UART_IIR_RX_TIMEOUT) { *(volatile uint8_t *)0x10000000 = '9'; }//// + if (status & UART_IIR_XOFF) { *(volatile uint8_t *)0x10000000 = 'A'; }//// + if (status & UART_IIR_CTS_RTS_DSR) { *(volatile uint8_t *)0x10000000 = 'B'; }//// + }//// + ////End break; } From 37124dfee133d7fba19b505e6bc058ed58979d30 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Sat, 29 Jul 2023 22:43:45 +0800 Subject: [PATCH 101/108] Log UART Interrupt Status. 056789 --- drivers/serial/uart_16550.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/serial/uart_16550.c b/drivers/serial/uart_16550.c index a44534ca52e1d..f9302001573b5 100644 --- a/drivers/serial/uart_16550.c +++ b/drivers/serial/uart_16550.c @@ -972,6 +972,8 @@ static int u16550_interrupt(int irq, FAR void *context, FAR void *arg) #define UART_IIR_RX_TIMEOUT 0x0c /* OMAP RX Timeout interrupt */ #define UART_IIR_XOFF 0x10 /* OMAP XOFF/Special Character */ #define UART_IIR_CTS_RTS_DSR 0x20 /* OMAP CTS/RTS/DSR Change */ + bool rx_timeout = (status & 0x3f) == UART_IIR_RX_TIMEOUT; + if (rx_timeout) { *(volatile uint8_t *)0x10000000 = 'C'; }//// if (status & UART_IIR_MSI) { *(volatile uint8_t *)0x10000000 = '4'; }//// if (status & UART_IIR_THRI) { *(volatile uint8_t *)0x10000000 = '5'; }//// if (status & UART_IIR_RDI) { *(volatile uint8_t *)0x10000000 = '6'; }//// From 06e6b5a35cfbe61350ea3753aff1a4ddab0951e2 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Sun, 30 Jul 2023 14:23:45 +0800 Subject: [PATCH 102/108] Log riscv_dispatch_irq. Seems OK --- arch/risc-v/src/qemu-rv/qemu_rv_irq_dispatch.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_irq_dispatch.c b/arch/risc-v/src/qemu-rv/qemu_rv_irq_dispatch.c index 2545924ce41d1..8327b62dde02d 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_irq_dispatch.c +++ b/arch/risc-v/src/qemu-rv/qemu_rv_irq_dispatch.c @@ -80,7 +80,7 @@ void *riscv_dispatch_irq(uintptr_t vector, uintptr_t *regs) if (RISCV_IRQ_EXT <= irq) { - ////_info("irq=%d, RISCV_IRQ_EXT=%d\n", irq, RISCV_IRQ_EXT);//// + _info("irq=%d, RISCV_IRQ_EXT=%d\n", irq, RISCV_IRQ_EXT);//// /* Then write PLIC_CLAIM to clear pending in PLIC */ putreg32(irq - RISCV_IRQ_EXT, QEMU_RV_PLIC_CLAIM); From 476eea007d8dbbc0960f0c7d6784eedf880a2c56 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Sun, 30 Jul 2023 15:36:35 +0800 Subject: [PATCH 103/108] Fix delay --- arch/risc-v/src/qemu-rv/qemu_rv_irq_dispatch.c | 1 + boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_irq_dispatch.c b/arch/risc-v/src/qemu-rv/qemu_rv_irq_dispatch.c index 8327b62dde02d..c188e7fe4efd9 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_irq_dispatch.c +++ b/arch/risc-v/src/qemu-rv/qemu_rv_irq_dispatch.c @@ -81,6 +81,7 @@ void *riscv_dispatch_irq(uintptr_t vector, uintptr_t *regs) if (RISCV_IRQ_EXT <= irq) { _info("irq=%d, RISCV_IRQ_EXT=%d\n", irq, RISCV_IRQ_EXT);//// + ////up_putc('.'); up_mdelay(1000);//// /* Then write PLIC_CLAIM to clear pending in PLIC */ putreg32(irq - RISCV_IRQ_EXT, QEMU_RV_PLIC_CLAIM); diff --git a/boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig b/boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig index 1ea6c92592a40..6fe4931aaa126 100644 --- a/boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig +++ b/boards/risc-v/qemu-rv/rv-virt/configs/knsh64/defconfig @@ -44,7 +44,7 @@ CONFIG_ARCH_USE_MPU=y CONFIG_ARCH_USE_S_MODE=y CONFIG_BOARDCTL_ROMDISK=y CONFIG_BOARD_LATE_INITIALIZE=y -CONFIG_BOARD_LOOPSPERMSEC=6366 +CONFIG_BOARD_LOOPSPERMSEC=116524 CONFIG_BUILD_KERNEL=y CONFIG_DEBUG_ASSERTIONS=y CONFIG_DEBUG_ASSERTIONS_EXPRESSION=y From 93dc2abbe7a6b7df1fc99b19183eada901f80e34 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Sun, 30 Jul 2023 15:40:03 +0800 Subject: [PATCH 104/108] Fixing interrupt --- arch/risc-v/src/qemu-rv/qemu_rv_irq_dispatch.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_irq_dispatch.c b/arch/risc-v/src/qemu-rv/qemu_rv_irq_dispatch.c index c188e7fe4efd9..7238e011fd252 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_irq_dispatch.c +++ b/arch/risc-v/src/qemu-rv/qemu_rv_irq_dispatch.c @@ -80,7 +80,7 @@ void *riscv_dispatch_irq(uintptr_t vector, uintptr_t *regs) if (RISCV_IRQ_EXT <= irq) { - _info("irq=%d, RISCV_IRQ_EXT=%d\n", irq, RISCV_IRQ_EXT);//// + ////_info("irq=%d, RISCV_IRQ_EXT=%d\n", irq, RISCV_IRQ_EXT);//// ////up_putc('.'); up_mdelay(1000);//// /* Then write PLIC_CLAIM to clear pending in PLIC */ From 7cd0b5fd1007e0510e2e869e834ab94139b91dcf Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Sun, 30 Jul 2023 16:14:43 +0800 Subject: [PATCH 105/108] Delay enable IRQ --- drivers/serial/serial.c | 1 + drivers/serial/uart_16550.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/serial/serial.c b/drivers/serial/serial.c index 5afa5bc9e289e..e044cf8d8b8c2 100644 --- a/drivers/serial/serial.c +++ b/drivers/serial/serial.c @@ -1178,6 +1178,7 @@ static ssize_t uart_write(FAR struct file *filep, FAR const char *buffer, size_t buflen) { infodumpbuffer("uart_write", (const uint8_t *)buffer, buflen);//// + static bool first_time = true; if (first_time) { up_enable_irq(57); first_time = false; }//// FAR struct inode *inode = filep->f_inode; FAR uart_dev_t *dev = inode->i_private; ssize_t nwritten = buflen; diff --git a/drivers/serial/uart_16550.c b/drivers/serial/uart_16550.c index f9302001573b5..c15d4266fe24d 100644 --- a/drivers/serial/uart_16550.c +++ b/drivers/serial/uart_16550.c @@ -868,7 +868,7 @@ static int u16550_attach(struct uart_dev_s *dev) * in the UART */ - up_enable_irq(priv->irq); + ////up_enable_irq(priv->irq); #ifdef HAVE_16550_UART_DMA if (priv->chanrx) From a74a89ce0876fdaf43b869f6a2a5eb64d03cb72c Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Sun, 30 Jul 2023 16:22:28 +0800 Subject: [PATCH 106/108] Remove logs --- drivers/serial/serial_io.c | 4 ++-- drivers/serial/uart_16550.c | 41 +++++++++++++++++++------------------ 2 files changed, 23 insertions(+), 22 deletions(-) diff --git a/drivers/serial/serial_io.c b/drivers/serial/serial_io.c index 213fd8e004ed7..fff714df226b3 100644 --- a/drivers/serial/serial_io.c +++ b/drivers/serial/serial_io.c @@ -54,7 +54,7 @@ void uart_xmitchars(FAR uart_dev_t *dev) { - *(volatile uint8_t *)0x10000000 = 'D';//// + ////*(volatile uint8_t *)0x10000000 = 'D';//// uint16_t nbytes = 0; #ifdef CONFIG_SMP @@ -63,7 +63,7 @@ void uart_xmitchars(FAR uart_dev_t *dev) /* Send while we still have data in the TX buffer & room in the fifo */ - if (uart_txready(dev)) { *(volatile uint8_t *)0x10000000 = 'E'; }//// + ////if (uart_txready(dev)) { *(volatile uint8_t *)0x10000000 = 'E'; }//// while (dev->xmit.head != dev->xmit.tail && uart_txready(dev)) { /* Send the next byte */ diff --git a/drivers/serial/uart_16550.c b/drivers/serial/uart_16550.c index c15d4266fe24d..e06081d1749a5 100644 --- a/drivers/serial/uart_16550.c +++ b/drivers/serial/uart_16550.c @@ -963,25 +963,26 @@ static int u16550_interrupt(int irq, FAR void *context, FAR void *arg) ////Begin static int i = 0; if (i++ % 1000000 == 1) { - *(volatile uint8_t *)0x10000000 = '0'; - #define UART_IIR_MSI 0x00 /* Modem status interrupt */ - #define UART_IIR_THRI 0x02 /* Transmitter holding register empty */ - #define UART_IIR_RDI 0x04 /* Receiver data interrupt */ - #define UART_IIR_RLSI 0x06 /* Receiver line status interrupt */ - #define UART_IIR_BUSY 0x07 /* DesignWare APB Busy Detect */ - #define UART_IIR_RX_TIMEOUT 0x0c /* OMAP RX Timeout interrupt */ - #define UART_IIR_XOFF 0x10 /* OMAP XOFF/Special Character */ - #define UART_IIR_CTS_RTS_DSR 0x20 /* OMAP CTS/RTS/DSR Change */ - bool rx_timeout = (status & 0x3f) == UART_IIR_RX_TIMEOUT; - if (rx_timeout) { *(volatile uint8_t *)0x10000000 = 'C'; }//// - if (status & UART_IIR_MSI) { *(volatile uint8_t *)0x10000000 = '4'; }//// - if (status & UART_IIR_THRI) { *(volatile uint8_t *)0x10000000 = '5'; }//// - if (status & UART_IIR_RDI) { *(volatile uint8_t *)0x10000000 = '6'; }//// - if (status & UART_IIR_RLSI) { *(volatile uint8_t *)0x10000000 = '7'; }//// - if (status & UART_IIR_BUSY) { *(volatile uint8_t *)0x10000000 = '8'; }//// - if (status & UART_IIR_RX_TIMEOUT) { *(volatile uint8_t *)0x10000000 = '9'; }//// - if (status & UART_IIR_XOFF) { *(volatile uint8_t *)0x10000000 = 'A'; }//// - if (status & UART_IIR_CTS_RTS_DSR) { *(volatile uint8_t *)0x10000000 = 'B'; }//// + *(volatile uint8_t *)0x10000000 = '.'; + // *(volatile uint8_t *)0x10000000 = '0'; + // #define UART_IIR_MSI 0x00 /* Modem status interrupt */ + // #define UART_IIR_THRI 0x02 /* Transmitter holding register empty */ + // #define UART_IIR_RDI 0x04 /* Receiver data interrupt */ + // #define UART_IIR_RLSI 0x06 /* Receiver line status interrupt */ + // #define UART_IIR_BUSY 0x07 /* DesignWare APB Busy Detect */ + // #define UART_IIR_RX_TIMEOUT 0x0c /* OMAP RX Timeout interrupt */ + // #define UART_IIR_XOFF 0x10 /* OMAP XOFF/Special Character */ + // #define UART_IIR_CTS_RTS_DSR 0x20 /* OMAP CTS/RTS/DSR Change */ + // bool rx_timeout = (status & 0x3f) == UART_IIR_RX_TIMEOUT; + // if (rx_timeout) { *(volatile uint8_t *)0x10000000 = 'C'; }//// + // if (status & UART_IIR_MSI) { *(volatile uint8_t *)0x10000000 = '4'; }//// + // if (status & UART_IIR_THRI) { *(volatile uint8_t *)0x10000000 = '5'; }//// + // if (status & UART_IIR_RDI) { *(volatile uint8_t *)0x10000000 = '6'; }//// + // if (status & UART_IIR_RLSI) { *(volatile uint8_t *)0x10000000 = '7'; }//// + // if (status & UART_IIR_BUSY) { *(volatile uint8_t *)0x10000000 = '8'; }//// + // if (status & UART_IIR_RX_TIMEOUT) { *(volatile uint8_t *)0x10000000 = '9'; }//// + // if (status & UART_IIR_XOFF) { *(volatile uint8_t *)0x10000000 = 'A'; }//// + // if (status & UART_IIR_CTS_RTS_DSR) { *(volatile uint8_t *)0x10000000 = 'B'; }//// }//// ////End break; @@ -1005,7 +1006,7 @@ static int u16550_interrupt(int irq, FAR void *context, FAR void *arg) case UART_IIR_INTID_THRE: { - *(volatile uint8_t *)0x10000000 = '-';//// + ////*(volatile uint8_t *)0x10000000 = '-';//// uart_xmitchars(dev); break; } From 84e234924c5f30d60e798bb0dd52230438261c04 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Sun, 30 Jul 2023 16:31:07 +0800 Subject: [PATCH 107/108] Remove logs. NSH OK yay! --- drivers/serial/serial.c | 6 +++--- drivers/serial/uart_16550.c | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/drivers/serial/serial.c b/drivers/serial/serial.c index e044cf8d8b8c2..a6b5dc57ae32b 100644 --- a/drivers/serial/serial.c +++ b/drivers/serial/serial.c @@ -154,7 +154,7 @@ static struct work_s g_serial_work; static int uart_putxmitchar(FAR uart_dev_t *dev, int ch, bool oktoblock) { - *(volatile uint8_t *)0x10000000 = 'A';//// + ////*(volatile uint8_t *)0x10000000 = 'A';//// irqstate_t flags; int nexthead; int ret; @@ -1177,8 +1177,8 @@ static ssize_t uart_read(FAR struct file *filep, static ssize_t uart_write(FAR struct file *filep, FAR const char *buffer, size_t buflen) { - infodumpbuffer("uart_write", (const uint8_t *)buffer, buflen);//// - static bool first_time = true; if (first_time) { up_enable_irq(57); first_time = false; }//// + ////infodumpbuffer("uart_write", (const uint8_t *)buffer, buflen);//// + static int count = 0; if (count++ == 3) { up_enable_irq(57); }//// FAR struct inode *inode = filep->f_inode; FAR uart_dev_t *dev = inode->i_private; ssize_t nwritten = buflen; diff --git a/drivers/serial/uart_16550.c b/drivers/serial/uart_16550.c index e06081d1749a5..e5508852c1718 100644 --- a/drivers/serial/uart_16550.c +++ b/drivers/serial/uart_16550.c @@ -1259,7 +1259,7 @@ static int u16550_receive(struct uart_dev_s *dev, unsigned int *status) static void u16550_rxint(struct uart_dev_s *dev, bool enable) { - _info("enable=%d\n", enable);//// + ////_info("enable=%d\n", enable);//// FAR struct u16550_s *priv = (FAR struct u16550_s *)dev->priv; #ifdef HAVE_16550_UART_DMA @@ -1580,7 +1580,7 @@ static void u16550_dmatxavail(FAR struct uart_dev_s *dev) static void u16550_send(struct uart_dev_s *dev, int ch) { - *(volatile uint8_t *)0x10000000 = 'F';//// + ////*(volatile uint8_t *)0x10000000 = 'F';//// FAR struct u16550_s *priv = (FAR struct u16550_s *)dev->priv; u16550_serialout(priv, UART_THR_OFFSET, (uart_datawidth_t)ch); } @@ -1595,7 +1595,7 @@ static void u16550_send(struct uart_dev_s *dev, int ch) static void u16550_txint(struct uart_dev_s *dev, bool enable) { - _info("enable=%d\n", enable);//// + ////_info("enable=%d\n", enable);//// FAR struct u16550_s *priv = (FAR struct u16550_s *)dev->priv; irqstate_t flags; From 866da1207d8990630a14789170f6ba5831130bbd Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Mon, 31 Jul 2023 07:36:36 +0800 Subject: [PATCH 108/108] Hart 1 Machine Mode doesn't work --- arch/risc-v/src/qemu-rv/qemu_rv_irq.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_irq.c b/arch/risc-v/src/qemu-rv/qemu_rv_irq.c index dc82265c1e303..edf4b2b8fa876 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_irq.c +++ b/arch/risc-v/src/qemu-rv/qemu_rv_irq.c @@ -54,6 +54,15 @@ void up_irqinitialize(void) putreg32(0x0, QEMU_RV_PLIC_ENABLE1); putreg32(0x0, QEMU_RV_PLIC_ENABLE2); +#ifdef NOTUSED + // Disable All Global Interrupts for Hart 1 Machine-Mode + // | 0x0C00_2080 | 4B | RW | Start Hart 1 M-Mode interrupt enables + #define QEMU_RV_PLIC_ENABLE1_MMODE (QEMU_RV_PLIC_BASE + 0x002080) + #define QEMU_RV_PLIC_ENABLE2_MMODE (QEMU_RV_PLIC_BASE + 0x002084) + putreg32(0x0, QEMU_RV_PLIC_ENABLE1_MMODE); + putreg32(0x0, QEMU_RV_PLIC_ENABLE2_MMODE); +#endif // NOTUSED + /* Colorize the interrupt stack for debug purposes */ #if defined(CONFIG_STACK_COLORATION) && CONFIG_ARCH_INTERRUPTSTACK > 15