mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2025-12-26 06:08:20 +00:00
riscv: Work area size based on /memory node in fdt
* It is not granted that we will always access to natually aligned access. So, before handling endianess do byte-a-byte load using the appropriate libfdt function to avoid unaligned access issues Signed-off-by: Francescodario Cuzzocrea <bosconovic@gmail.com>
This commit is contained in:
committed by
Gedare Bloom
parent
0d15487401
commit
0e3792edbf
@@ -60,6 +60,11 @@ static void* get_end_of_memory_from_fdt(void)
|
||||
int ac;
|
||||
int sc;
|
||||
int len;
|
||||
/* start64, size64, start32, and size32 help to avoid unaligned access */
|
||||
uint64_t start64;
|
||||
uint64_t size64;
|
||||
uint64_t start32;
|
||||
uint64_t size32;
|
||||
uintptr_t start;
|
||||
uintptr_t size;
|
||||
|
||||
@@ -100,17 +105,23 @@ static void* get_end_of_memory_from_fdt(void)
|
||||
}
|
||||
|
||||
if (ac == 1) {
|
||||
start = fdt32_to_cpu(((fdt32_t *)val)[0]);
|
||||
size = fdt32_to_cpu(((fdt32_t *)val)[1]);
|
||||
start32 = fdt32_ld(&((fdt32_t *)val)[0]);
|
||||
start = fdt32_to_cpu(start32);
|
||||
size32 = fdt32_ld(&((fdt32_t *)val)[1]);
|
||||
size = fdt32_to_cpu(size32);
|
||||
}
|
||||
|
||||
if (ac == 2) {
|
||||
start = fdt64_to_cpu(((fdt64_t *)val)[0]);
|
||||
|
||||
if (sc == 1)
|
||||
size = fdt32_to_cpu(((fdt32_t *)(val+8))[0]);
|
||||
else
|
||||
size = fdt64_to_cpu(((fdt64_t *)val)[1]);
|
||||
start64 = fdt64_ld(&((fdt64_t *)val)[0]);
|
||||
start = fdt64_to_cpu(start64);
|
||||
if (sc == 1) {
|
||||
size32 = fdt32_ld(&((fdt32_t *)(val+8))[0]);
|
||||
size = fdt32_to_cpu(size32);
|
||||
}
|
||||
else {
|
||||
size64 = fdt64_ld(&((fdt64_t *)val)[1]);
|
||||
size = fdt64_to_cpu(size64);
|
||||
}
|
||||
}
|
||||
|
||||
return (void*) (start + size);
|
||||
|
||||
Reference in New Issue
Block a user