support for unaligned memory access
authorKorey Sewell <ksewell@umich.edu>
Sun, 19 Mar 2006 18:40:03 +0000 (13:40 -0500)
committerKorey Sewell <ksewell@umich.edu>
Sun, 19 Mar 2006 18:40:03 +0000 (13:40 -0500)
arch/mips/isa/base.isa:
    disassembly fixes
arch/mips/isa/decoder.isa:
    support for unaligned loads/stores
arch/mips/isa_traits.hh:
    edit Syscall Reg values
arch/mips/linux_process.cc:
    call writevFunc on writev syscall

--HG--
extra : convert_revision : 4aea6d069bd7ba0e83b23d2d85c50d68532f0454

arch/mips/isa/base.isa
arch/mips/isa/decoder.isa
arch/mips/isa_traits.hh
arch/mips/linux_process.cc

index 89837c1365fa251ec403c6062ddea856ac9b21f9..139a6d8767089f1c963942165d680336ba7252d4 100644 (file)
@@ -67,12 +67,11 @@ output decoder {{
         ccprintf(ss, "%-10s ", mnemonic);
 
         if(_numDestRegs > 0){
-            if(_numSrcRegs > 0)
-                ss << ",";
             printReg(ss, _destRegIdx[0]);
         }
 
         if(_numSrcRegs > 0) {
+            ss << ",";
             printReg(ss, _srcRegIdx[0]);
         }
 
@@ -82,8 +81,8 @@ output decoder {{
         }
 
 
-        if(mnemonic == "sll"){
-            ccprintf(ss," %d",SA);
+        if(mnemonic == "sll" || mnemonic == "sra"){
+            ccprintf(ss,", %d",SA);
         }
 
         return ss.str();
index 3a8a4dfd85cc8b4223f760756eb3323f0f73d1b0..f5dd3d911f7690ca810ba9aca452f810b33719d1 100644 (file)
@@ -865,11 +865,11 @@ decode OPCODE_HI default Unknown::unknown() {
         format LoadMemory {
             0x0: lb({{ Rt.sw = Mem.sb; }});
             0x1: lh({{ Rt.sw = Mem.sh; }});
-            0x2: lwl({{ Rt.sw = Mem.sw; }});//, WordAlign);
+            0x2: lwl({{ uint32_t temp = Mem.uw<31:16> << 16; Rt.uw &= 0x00FF; Rt.uw |= temp;}}, {{ EA = (Rs + disp) & ~3; }});
             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);
+            0x6: lwr({{ uint32_t temp = 0x00FF & Mem.uw<15:0>; Rt.uw &= 0xFF00; Rt.uw |= temp; }}, {{ EA = (Rs + disp) & ~3; }});
         }
 
         0x7: FailUnimpl::reserved();
@@ -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.uw = Rt<31:0>; }});//,WordAlign);
+            0x2: swl({{ Mem.uh = Rt<31:16>; }}, {{ EA = (Rs + disp) & ~3; }});
             0x3: sw({{ Mem.uw = Rt<31:0>; }});
-            0x6: swr({{ Mem.uw = Rt<31:0>; }});//,WordAlign);
+            0x6: swr({{ Mem.uh = Rt<15:0>; }},{{ EA = ((Rs + disp) & ~3) + 4;}});
         }
 
         format WarnUnimpl {
index a69d848426cea4d76db3df1f4dc13412356dc001..486a5d13032ebb3bcdc7b6e1d6a610c67ec250ad 100644 (file)
@@ -136,8 +136,8 @@ namespace MipsISA
     const int ReturnAddressReg = 31;
 
     const int SyscallNumReg = ReturnValueReg1;
-    const int SyscallPseudoReturnReg = ArgumentReg3;
-    const int SyscallSuccessReg = 19;
+    const int SyscallPseudoReturnReg = ReturnValueReg1;
+    const int SyscallSuccessReg = ReturnValueReg1;
 
     const int LogVMPageSize = 13;      // 8K bytes
     const int VMPageSize = (1 << LogVMPageSize);
index f0045d4747910045902b5c52771000da47334a0c..92a79cfd172b379b12b9f1cac467bb2243703cc6 100644 (file)
@@ -237,7 +237,7 @@ SyscallDesc MipsLinuxProcess::syscallDescs[] = {
     /* 119 */ SyscallDesc("sigreturn", unimplementedFunc),
     /* 120 */ SyscallDesc("clone", unimplementedFunc),
     /* 121 */ SyscallDesc("setdomainname", unimplementedFunc),
-    /* 122 */ SyscallDesc("uname", unameFunc),/*,writevFunc<Linux>*/
+    /* 122 */ SyscallDesc("uname", unameFunc),
     /* 123 */ SyscallDesc("modify_ldt", unimplementedFunc),
     /* 124 */ SyscallDesc("adjtimex", unimplementedFunc),
     /* 125 */ SyscallDesc("mprotect", unimplementedFunc),
@@ -261,7 +261,7 @@ SyscallDesc MipsLinuxProcess::syscallDescs[] = {
     /* 143 */ SyscallDesc("flock", unimplementedFunc),
     /* 144 */ SyscallDesc("msync", unimplementedFunc),/*getrlimitFunc<Linux>*/
     /* 145 */ SyscallDesc("readv", unimplementedFunc),
-    /* 146 */ SyscallDesc("writev", unimplementedFunc/*writeFunc*/),
+    /* 146 */ SyscallDesc("writev", writevFunc<Linux>),
     /* 147 */ SyscallDesc("cacheflush", unimplementedFunc),
     /* 148 */ SyscallDesc("cachectl", unimplementedFunc),
     /* 149 */ SyscallDesc("sysmips", unimplementedFunc),