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:
Francescodario Cuzzocrea
2023-11-09 12:38:09 +01:00
committed by Gedare Bloom
parent 0d15487401
commit 0e3792edbf

View File

@@ -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);