From d997d38b41c881118df926c8f58c107fc0e0e560 Mon Sep 17 00:00:00 2001 From: Lee Lup Yuen Date: Sun, 10 Dec 2023 14:37:49 +0800 Subject: [PATCH] Clean up --- arch/risc-v/src/bl808/bl808_start.c | 178 +++++++++++++++------------- 1 file changed, 93 insertions(+), 85 deletions(-) diff --git a/arch/risc-v/src/bl808/bl808_start.c b/arch/risc-v/src/bl808/bl808_start.c index aaa65a053a6db..a7caf1223b5d0 100644 --- a/arch/risc-v/src/bl808/bl808_start.c +++ b/arch/risc-v/src/bl808/bl808_start.c @@ -37,10 +37,6 @@ #include "bl808_mm_init.h" #include "bl808_memorymap.h" -////TODO -static void bl808_copy_ramdisk(void); -static void bl808_copy_overlap(uint8_t *dest, const uint8_t *src, size_t count); - /**************************************************************************** * Pre-processor Definitions ****************************************************************************/ @@ -57,6 +53,88 @@ static void bl808_copy_overlap(uint8_t *dest, const uint8_t *src, size_t count); extern void __trap_vec(void); +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +// Copy an overlapping memory region. +static void bl808_copy_overlap(uint8_t *dest, const uint8_t *src, size_t count) +{ + uint8_t *d = dest + count - 1; + const uint8_t *s = src + count - 1; + + if (dest <= src) + { + _info("dest and src should overlap"); + PANIC(); + } + + while (count--) + { + volatile uint8_t c = *s; /* Prevent compiler optimisation */ + *d = c; + d--; + s--; + } +} + +// Copy the RAM Disk from NuttX Image to RAM Disk Region. +static void bl808_copy_ramdisk(void) +{ + const char *header = "-rom1fs-"; + uint8_t *ramdisk_addr = NULL; + uint8_t *addr; + uint32_t size; + + // After _edata, search for "-rom1fs-". This is the RAM Disk Address. + // Limit search to 256 KB after Idle Stack Top. + binfo("_edata=%p, _sbss=%p, _ebss=%p, BL808_IDLESTACK_TOP=%p\n", + (void *)_edata, (void *)_sbss, (void *)_ebss, + (void *)BL808_IDLESTACK_TOP); + for (addr = _edata; addr < (uint8_t *)BL808_IDLESTACK_TOP + (256 * 1024); addr++) + { + if (memcmp(addr, header, strlen(header)) == 0) + { + ramdisk_addr = addr; + break; + } + } + + // Stop if RAM Disk is missing + binfo("ramdisk_addr=%p\n", ramdisk_addr); + if (ramdisk_addr == NULL) + { + _info("Missing RAM Disk. Check the initrd padding."); + PANIC(); + } + + // RAM Disk must be after Idle Stack, to prevent overwriting + if (ramdisk_addr <= (uint8_t *)BL808_IDLESTACK_TOP) + { + const size_t pad = (size_t)BL808_IDLESTACK_TOP - (size_t)ramdisk_addr; + _info("RAM Disk must be after Idle Stack. Increase initrd padding " + "by %ul bytes.", pad); + PANIC(); + } + + // Read the Filesystem Size from the next 4 bytes, in Big Endian + size = (ramdisk_addr[8] << 24) + (ramdisk_addr[9] << 16) + + (ramdisk_addr[10] << 8) + ramdisk_addr[11] + 0x1f0; + binfo("size=%d\n", size); + + // Filesystem Size must be less than RAM Disk Memory Region + if (size > (size_t)__ramdisk_size) + { + _info("RAM Disk Region too small. Increase by %ul bytes.\n", + size - (size_t)__ramdisk_size); + PANIC(); + } + + // Copy the Filesystem Size to RAM Disk Start. + // __ramdisk_start overlaps with ramdisk_addr + size. + bl808_copy_overlap(__ramdisk_start, ramdisk_addr, size); +} + /**************************************************************************** * Public Data ****************************************************************************/ @@ -74,7 +152,7 @@ uintptr_t g_idle_topstack = BL808_IDLESTACK_TOP; /**************************************************************************** * Name: bl808_clear_bss ****************************************************************************/ - +////TODO void bl808_clear_bss(void) { uint32_t *dest; @@ -92,7 +170,7 @@ void bl808_clear_bss(void) /**************************************************************************** * Name: bl808_start ****************************************************************************/ - +////TODO void bl808_start_s(int mhartid) { /* Configure FPU */ @@ -139,7 +217,7 @@ void bl808_start_s(int mhartid) /**************************************************************************** * Name: bl808_start ****************************************************************************/ - +////TODO void bl808_start(int mhartid) { DEBUGASSERT(mhartid == 0); /* Only Hart 0 supported for now */ @@ -172,92 +250,22 @@ void bl808_start(int mhartid) bl808_start_s(mhartid); } +/**************************************************************************** + * Name: riscv_earlyserialinit + ****************************************************************************/ +////TODO void riscv_earlyserialinit(void) { //// TODO: Declaration bl808_earlyserialinit(); } +/**************************************************************************** + * Name: riscv_serialinit + ****************************************************************************/ +////TODO void riscv_serialinit(void) { //// TODO: Declaration bl808_serialinit(); } - -static void bl808_copy_ramdisk(void) -{ - const char *header = "-rom1fs-"; - uint8_t *ramdisk_addr = NULL; - uint8_t *addr; - uint32_t size; - - // After _edata, search for "-rom1fs-". This is the RAM Disk Address. - // Limit search to 256 KB after Idle Stack Top. - binfo("_edata=%p, _sbss=%p, _ebss=%p, BL808_IDLESTACK_TOP=%p\n", - (void *)_edata, (void *)_sbss, (void *)_ebss, - (void *)BL808_IDLESTACK_TOP); - for (addr = _edata; addr < (uint8_t *)BL808_IDLESTACK_TOP + (256 * 1024); addr++) - { - if (memcmp(addr, header, strlen(header)) == 0) - { - ramdisk_addr = addr; - break; - } - } - - // Stop if RAM Disk is missing - binfo("ramdisk_addr=%p\n", ramdisk_addr); - if (ramdisk_addr == NULL) - { - _info("Missing RAM Disk. Check the initrd padding."); - PANIC(); - } - - // RAM Disk must be after Idle Stack, to prevent overwriting - if (ramdisk_addr <= (uint8_t *)BL808_IDLESTACK_TOP) - { - const size_t pad = (size_t)BL808_IDLESTACK_TOP - (size_t)ramdisk_addr; - _info("RAM Disk must be after Idle Stack. Increase initrd padding " - "by %ul bytes.", pad); - PANIC(); - } - - // Read the Filesystem Size from the next 4 bytes, in Big Endian - size = (ramdisk_addr[8] << 24) + (ramdisk_addr[9] << 16) + - (ramdisk_addr[10] << 8) + ramdisk_addr[11] + 0x1f0; - binfo("size=%d\n", size); - - // Filesystem Size must be less than RAM Disk Memory Region - if (size > (size_t)__ramdisk_size) - { - _info("RAM Disk Region too small. Increase by %ul bytes.\n", - size - (size_t)__ramdisk_size); - PANIC(); - } - - // Copy the Filesystem Size to RAM Disk Start - // Warning: __ramdisk_start overlaps with ramdisk_addr + size - // memmove is aliased to memcpy, so we implement memmove ourselves - bl808_copy_overlap(__ramdisk_start, ramdisk_addr, size); -} - -// From libs/libc/string/lib_memmove.c -static void bl808_copy_overlap(uint8_t *dest, const uint8_t *src, size_t count) -{ - uint8_t *d = dest + count - 1; - const uint8_t *s = src + count - 1; - - if (dest <= src) - { - _info("dest and src should overlap"); - PANIC(); - } - - while (count--) - { - volatile uint8_t c = *s; /* Prevent compiler optimisation */ - *d = c; - d--; - s--; - } -}