Found and fixed 3 decoder.isa bugs!!! Now the hello_world program runs for a while
authorKorey Sewell <ksewell@umich.edu>
Thu, 16 Mar 2006 23:39:54 +0000 (18:39 -0500)
committerKorey Sewell <ksewell@umich.edu>
Thu, 16 Mar 2006 23:39:54 +0000 (18:39 -0500)
before getting in a infinite loop. It actually "tries" to syscall too, but syscalls
aren't implemented just yet

arch/mips/faults.cc:
    more descriptive names for faults (will help future users as well as me!)
arch/mips/isa/base.isa:
    make sure we are printing out "BasicOp" format disassembly instructions as dest,src,src instead of src,src,dest
arch/mips/isa/decoder.isa:
    FIX LW/SW Bug!!!! I was actually loading a byte instead of a word
    FIX JALR Bug!!!! I was not saving the link address in R31 for this instruction
    FIX SLL/NOP Bug!!! We now recognize the varying flavors of sll,nop,ehb,& ssnop correctly
base/loader/elf_object.cc:
    change back to original way
base/loader/elf_object.hh:
    change back to original!

--HG--
extra : convert_revision : 39b65fba31c1842ac6966346fe8a35816a4231fa

arch/mips/faults.cc
arch/mips/isa/base.isa
arch/mips/isa/decoder.isa
base/loader/elf_object.cc
base/loader/elf_object.hh

index 142328c409dca9d445826348eff4b97734b20488..1b31dfa6904b2be74997182e9fc5aefaaf96581d 100644 (file)
 namespace MipsISA
 {
 
-FaultName MachineCheckFault::_name = "mchk";
+FaultName MachineCheckFault::_name = "Machine Check";
 FaultVect MachineCheckFault::_vect = 0x0401;
 FaultStat MachineCheckFault::_count;
 
-FaultName AlignmentFault::_name = "unalign";
+FaultName AlignmentFault::_name = "Alignment";
 FaultVect AlignmentFault::_vect = 0x0301;
 FaultStat AlignmentFault::_count;
 
index 4125b51014b1a359c86da269bb93d822f9ee6ecc..89837c1365fa251ec403c6062ddea856ac9b21f9 100644 (file)
@@ -66,27 +66,24 @@ output decoder {{
 
         ccprintf(ss, "%-10s ", mnemonic);
 
-        // just print the first two source regs... if there's
-        // a third one, it's a read-modify-write dest (Rc),
-        // e.g. for CMOVxx
-        if(_numSrcRegs > 0)
-        {
+        if(_numDestRegs > 0){
+            if(_numSrcRegs > 0)
+                ss << ",";
+            printReg(ss, _destRegIdx[0]);
+        }
+
+        if(_numSrcRegs > 0) {
             printReg(ss, _srcRegIdx[0]);
         }
 
-        if(_numSrcRegs > 1)
-        {
+        if(_numSrcRegs > 1) {
             ss << ",";
             printReg(ss, _srcRegIdx[1]);
         }
 
-        // just print the first dest... if there's a second one,
-        // it's generally implicit
-        if(_numDestRegs > 0)
-        {
-            if(_numSrcRegs > 0)
-                ss << ",";
-            printReg(ss, _destRegIdx[0]);
+
+        if(mnemonic == "sll"){
+            ccprintf(ss," %d",SA);
         }
 
         return ss.str();
index 93e7238f8dac3644bb5ff8917ea0a80c89f947df..2e5f8e53648b3c6329f65546f2cedffd931789a6 100644 (file)
@@ -28,19 +28,19 @@ decode OPCODE_HI default Unknown::unknown() {
                 format BasicOp {
 
                     //Table A-3 Note: "1. Specific encodings of the rt, rd, and sa fields
-                    //are used to distinguish among the SLL, NOP, SSNOP and EHB functions."
-
+                    //are used to distinguish among the SLL, NOP, SSNOP and EHB functions.
                     0x0: decode RS  {
-                        0x0: decode RT {
-                                 0x0: decode RD default Nop::nop() {
+                        0x0: decode RT {     //fix Nop traditional vs. Nop converted disassembly later
+                             0x0: decode RD  default Nop::nop(){
                                   0x0: decode SA {
-                                      0x1: ssnop({{ ; }});  //really sll r0,r0,1
-                                      0x3: ehb({{ ; }});  //really sll r0,r0,3
+                                      0x1: ssnop({{ ; }}); //really sll r0,r0,1
+                                      0x3: ehb({{ ; }});   //really sll r0,r0,3
                                   }
                              }
+
+                             default: sll({{ Rd = Rt.uw << SA; }});
                         }
 
-                      default: sll({{ Rd = Rt.uw << SA; }});
                     }
 
                     0x2: decode SRL {
@@ -77,9 +77,9 @@ decode OPCODE_HI default Unknown::unknown() {
                     }
 
                     0x1: decode HINT {
-                        0: jalr({{ NNPC = Rs; }},IsCall,IsReturn);
+                        0: jalr({{ Rd = NNPC; NNPC = Rs; }},IsCall,IsReturn);
 
-                        1: jalr_hb({{ NNPC = Rs; clear_exe_inst_hazards();}},IsCall,IsReturn);
+                        1: jalr_hb({{ Rd = NNPC; NNPC = Rs; clear_exe_inst_hazards();}},IsCall,IsReturn);
                     }
                 }
 
@@ -866,7 +866,7 @@ decode OPCODE_HI default Unknown::unknown() {
             0x0: lb({{ Rt.sw = Mem.sb; }});
             0x1: lh({{ Rt.sw = Mem.sh; }});
             0x2: lwl({{ Rt.sw = Mem.sw; }});//, WordAlign);
-            0x3: lw({{ Rt.sw = Mem.sb; }});
+            0x3: lw({{ Rt.sw = Mem.sw; }});
             0x4: lbu({{ Rt.uw = Mem.ub; }});
             0x5: lhu({{ Rt.uw = Mem.uh; }});
             0x6: lwr({{ Rt.uw = Mem.uw; }});//, WordAlign);
@@ -879,9 +879,9 @@ decode OPCODE_HI default Unknown::unknown() {
         format StoreMemory {
             0x0: sb({{ Mem.ub = Rt<7:0>; }});
             0x1: sh({{ Mem.uh = Rt<15:0>; }});
-            0x2: swl({{ Mem.ub = Rt<31:0>; }});//,WordAlign);
-            0x3: sw({{ Mem.ub = Rt<31:0>; }});
-            0x6: swr({{ Mem.ub = Rt<31:0>; }});//,WordAlign);
+            0x2: swl({{ Mem.uw = Rt<31:0>; }});//,WordAlign);
+            0x3: sw({{ Mem.uw = Rt<31:0>; }});
+            0x6: swr({{ Mem.uw = Rt<31:0>; }});//,WordAlign);
         }
 
         format WarnUnimpl {
index b9636b454b13f0296a450f406f27746af81752c7..06c0ae66317bb218d960ff17e6266ceb8b8f743e 100644 (file)
@@ -157,48 +157,14 @@ ElfObject::tryFile(const string &fname, int fd, size_t len, uint8_t *data)
             } // while sections
         }
 
-        int32_t global_ptr;
-        if (arch == ObjectFile::Mips) {
-            Elf_Scn *section;
-            GElf_Shdr shdr;
-            Elf_Data *rdata;
-            int secIdx = 1;
-
-            // Get the first section
-            section = elf_getscn(elf, secIdx);
-
-            // While there are no more sections
-            while (section != NULL) {
-                gelf_getshdr(section, &shdr);
-                /*shdr.sh_type == SHT_MIPS_REGINFO && */
-                if (!strcmp(".reginfo",elf_strptr(elf, ehdr.e_shstrndx, shdr.sh_name))) {
-                    // We have found MIPS reginfo section:
-                    // -------------------------------
-                    // Check the 6th 32bit word for the initialized global pointer value
-                    // -------------------------------
-                    rdata = elf_rawdata(section, NULL);
-                    assert(rdata->d_buf);
-
-                    if(ehdr.e_ident[EI_DATA] == ELFDATA2LSB)
-                        global_ptr = htole(((int32_t*)rdata->d_buf)[5]);
-                    else
-                        global_ptr = htobe(((int32_t*)rdata->d_buf)[5]);
-                    break;
-                }
-
-                section = elf_getscn(elf, ++secIdx);
-            } // if section found
-
-        }
-
         elf_end(elf);
-        return new ElfObject(fname, fd, len, data, global_ptr,arch, opSys);
+        return new ElfObject(fname, fd, len, data, arch, opSys);
     }
 }
 
 
 ElfObject::ElfObject(const string &_filename, int _fd,
-                     size_t _len, uint8_t *_data,Addr global_ptr,
+                     size_t _len, uint8_t *_data,
                      Arch _arch, OpSys _opSys)
     : ObjectFile(_filename, _fd, _len, _data, _arch, _opSys)
 
@@ -222,7 +188,6 @@ ElfObject::ElfObject(const string &_filename, int _fd,
 
     entry = ehdr.e_entry;
 
-    globalPtr = global_ptr;
 
     // initialize segment sizes to 0 in case they're not present
     text.size = data.size = bss.size = 0;
index d1fd32fd0c24e7a251c4b4ffecd74c483d9346b0..72c265edd686f138ec918e4a490efbbdfb66c22d 100644 (file)
@@ -39,7 +39,7 @@ class ElfObject : public ObjectFile
     bool loadSomeSymbols(SymbolTable *symtab, int binding);
 
     ElfObject(const std::string &_filename, int _fd,
-              size_t _len, uint8_t *_data,Addr global_ptr,
+              size_t _len, uint8_t *_data,
               Arch _arch, OpSys _opSys);
 
   public: