Load local kernel symbols, and set aic7xxx_no_reset to prevent an initial
authorAndrew Schultz <alschult@umich.edu>
Sun, 22 Feb 2004 01:31:08 +0000 (20:31 -0500)
committerAndrew Schultz <alschult@umich.edu>
Sun, 22 Feb 2004 01:31:08 +0000 (20:31 -0500)
(very painful) bus reset from occuring

base/loader/elf_object.cc:
    Fixed to allow proper loading of local symbols

--HG--
extra : convert_revision : 5c9a1f4d7b5748a1c8cabdfd67763c21f988f8fd

base/loader/elf_object.cc
kern/linux/linux_system.cc

index 9889b9d4cc98b41a7663ffb095df380f7d1ce8f3..98e3198a6ec0ee83f5702d231648441744a53f9b 100644 (file)
@@ -225,7 +225,7 @@ ElfObject::loadSomeSymbols(SymbolTable *symtab, int binding)
             // loop through all the symbols, only loading global ones
             for (ii = 0; ii < count; ++ii) {
                 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,
                                   elf_strptr(elf, shdr.sh_link, sym.st_name));
                 }
index 798577ba5ca856e0c34e68a2d765a0e2f508201e..718e54ad223c648219294e84e42cf70c405d0184 100644 (file)
@@ -77,6 +77,9 @@ LinuxSystem::LinuxSystem(const string _name, const uint64_t _init_param,
         panic("could not load kernel symbols\n");
     debugSymbolTable = kernelSymtab;
 
+    if (!kernel->loadLocalSymbols(kernelSymtab))
+        panic("could not load kernel local symbols\n");
+
     if (!console->loadGlobalSymbols(consoleSymtab))
         panic("could not load console symbols\n");
 
@@ -271,6 +274,7 @@ LinuxSystem::LinuxSystem(const string _name, const uint64_t _init_param,
 #endif //FS_MEASURE
 
     Addr addr = 0;
+
     if (kernelSymtab->findAddress("est_cycle_freq", addr)) {
         Addr paddr = vtophys(physmem, addr);
         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;
     }
 
+    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)) {
         Addr paddr = vtophys(physmem, addr);
         char *osflags = (char *)physmem->dma_addr(paddr, sizeof(uint32_t));