Skip to content

Commit

Permalink
Clean up
Browse files Browse the repository at this point in the history
  • Loading branch information
lupyuen committed Dec 10, 2023
1 parent f58b585 commit d997d38
Showing 1 changed file with 93 additions and 85 deletions.
178 changes: 93 additions & 85 deletions arch/risc-v/src/bl808/bl808_start.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
****************************************************************************/
Expand All @@ -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
****************************************************************************/
Expand All @@ -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;
Expand All @@ -92,7 +170,7 @@ void bl808_clear_bss(void)
/****************************************************************************
* Name: bl808_start
****************************************************************************/

////TODO
void bl808_start_s(int mhartid)
{
/* Configure FPU */
Expand Down Expand Up @@ -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 */
Expand Down Expand Up @@ -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--;
}
}

0 comments on commit d997d38

Please sign in to comment.