From baf88e908d285191c13b5e96c16065957e5af7a6 Mon Sep 17 00:00:00 2001 From: Ali Saidi Date: Wed, 29 Oct 2014 23:18:26 -0500 Subject: arm: Fix multi-system AArch64 boot w/caches. Automatically extract cpu release address from DTB file. Check SCTLR_EL1 to verify all caches are enabled. --- src/base/loader/dtb_object.cc | 21 +++++++++++++++++++++ src/base/loader/dtb_object.hh | 7 +++++++ 2 files changed, 28 insertions(+) (limited to 'src/base') diff --git a/src/base/loader/dtb_object.cc b/src/base/loader/dtb_object.cc index f22cee1ed..adf7d2c3a 100644 --- a/src/base/loader/dtb_object.cc +++ b/src/base/loader/dtb_object.cc @@ -35,6 +35,7 @@ #include #include "base/loader/dtb_object.hh" +#include "sim/byteswap.hh" #include "fdt.h" #include "libfdt.h" @@ -154,6 +155,26 @@ DtbObject::addBootCmdLine(const char* _args, size_t len) return true; } +Addr +DtbObject::findReleaseAddr() +{ + void *fd = (void*)fileData; + + int offset = fdt_path_offset(fd, "/cpus/cpu@0"); + int len; + + const void* temp = fdt_getprop(fd, offset, "cpu-release-addr", &len); + Addr rel_addr = 0; + + if (len > 3) + rel_addr = betoh(*static_cast(temp)); + if (len == 8) + rel_addr = (rel_addr << 32) | betoh(*(static_cast(temp)+1)); + + return rel_addr; +} + + bool DtbObject::loadGlobalSymbols(SymbolTable *symtab, Addr addrMask) { diff --git a/src/base/loader/dtb_object.hh b/src/base/loader/dtb_object.hh index ec5294553..74bb52d44 100644 --- a/src/base/loader/dtb_object.hh +++ b/src/base/loader/dtb_object.hh @@ -60,6 +60,13 @@ class DtbObject : public ObjectFile * @return returns true on success, false otherwise */ bool addBootCmdLine(const char* _args, size_t len); + + /** Parse the DTB file enough to find the provided release + * address and return it. + * @return release address for SMP boot + */ + Addr findReleaseAddr(); + bool loadGlobalSymbols(SymbolTable *symtab, Addr addrMask = std::numeric_limits::max()); bool loadLocalSymbols(SymbolTable *symtab, -- cgit v1.2.3