Load local kernel symbols, and set aic7xxx_no_reset to prevent an initial
(very painful) bus reset from occuring base/loader/elf_object.cc: Fixed to allow proper loading of local symbols --HG-- extra : convert_revision : 5c9a1f4d7b5748a1c8cabdfd67763c21f988f8fd
This commit is contained in:
parent
43787ad863
commit
c82113d022
2 changed files with 15 additions and 1 deletions
|
@ -225,7 +225,7 @@ ElfObject::loadSomeSymbols(SymbolTable *symtab, int binding)
|
||||||
// loop through all the symbols, only loading global ones
|
// loop through all the symbols, only loading global ones
|
||||||
for (ii = 0; ii < count; ++ii) {
|
for (ii = 0; ii < count; ++ii) {
|
||||||
gelf_getsym(data, ii, &sym);
|
gelf_getsym(data, ii, &sym);
|
||||||
if (GELF_ST_BIND(sym.st_info) & binding) {
|
if (GELF_ST_BIND(sym.st_info) == binding) {
|
||||||
symtab->insert(sym.st_value,
|
symtab->insert(sym.st_value,
|
||||||
elf_strptr(elf, shdr.sh_link, sym.st_name));
|
elf_strptr(elf, shdr.sh_link, sym.st_name));
|
||||||
}
|
}
|
||||||
|
|
|
@ -77,6 +77,9 @@ LinuxSystem::LinuxSystem(const string _name, const uint64_t _init_param,
|
||||||
panic("could not load kernel symbols\n");
|
panic("could not load kernel symbols\n");
|
||||||
debugSymbolTable = kernelSymtab;
|
debugSymbolTable = kernelSymtab;
|
||||||
|
|
||||||
|
if (!kernel->loadLocalSymbols(kernelSymtab))
|
||||||
|
panic("could not load kernel local symbols\n");
|
||||||
|
|
||||||
if (!console->loadGlobalSymbols(consoleSymtab))
|
if (!console->loadGlobalSymbols(consoleSymtab))
|
||||||
panic("could not load console symbols\n");
|
panic("could not load console symbols\n");
|
||||||
|
|
||||||
|
@ -271,6 +274,7 @@ LinuxSystem::LinuxSystem(const string _name, const uint64_t _init_param,
|
||||||
#endif //FS_MEASURE
|
#endif //FS_MEASURE
|
||||||
|
|
||||||
Addr addr = 0;
|
Addr addr = 0;
|
||||||
|
|
||||||
if (kernelSymtab->findAddress("est_cycle_freq", addr)) {
|
if (kernelSymtab->findAddress("est_cycle_freq", addr)) {
|
||||||
Addr paddr = vtophys(physmem, addr);
|
Addr paddr = vtophys(physmem, addr);
|
||||||
uint8_t *est_cycle_frequency =
|
uint8_t *est_cycle_frequency =
|
||||||
|
@ -280,6 +284,16 @@ LinuxSystem::LinuxSystem(const string _name, const uint64_t _init_param,
|
||||||
*(uint64_t *)est_cycle_frequency = ticksPerSecond;
|
*(uint64_t *)est_cycle_frequency = ticksPerSecond;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (kernelSymtab->findAddress("aic7xxx_no_reset", addr)) {
|
||||||
|
Addr paddr = vtophys(physmem, addr);
|
||||||
|
uint8_t *aic7xxx_no_reset =
|
||||||
|
physmem->dma_addr(paddr, sizeof(uint32_t));
|
||||||
|
|
||||||
|
if (aic7xxx_no_reset) {
|
||||||
|
*(uint32_t *)aic7xxx_no_reset = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (consoleSymtab->findAddress("env_booted_osflags", addr)) {
|
if (consoleSymtab->findAddress("env_booted_osflags", addr)) {
|
||||||
Addr paddr = vtophys(physmem, addr);
|
Addr paddr = vtophys(physmem, addr);
|
||||||
char *osflags = (char *)physmem->dma_addr(paddr, sizeof(uint32_t));
|
char *osflags = (char *)physmem->dma_addr(paddr, sizeof(uint32_t));
|
||||||
|
|
Loading…
Reference in a new issue