summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arch/mips/isa/base.isa7
-rw-r--r--arch/mips/isa/decoder.isa8
-rw-r--r--arch/mips/isa_traits.hh19
-rw-r--r--arch/mips/linux_process.cc17
4 files changed, 31 insertions, 20 deletions
diff --git a/arch/mips/isa/base.isa b/arch/mips/isa/base.isa
index 89837c136..139a6d876 100644
--- a/arch/mips/isa/base.isa
+++ b/arch/mips/isa/base.isa
@@ -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();
diff --git a/arch/mips/isa/decoder.isa b/arch/mips/isa/decoder.isa
index 3a8a4dfd8..f5dd3d911 100644
--- a/arch/mips/isa/decoder.isa
+++ b/arch/mips/isa/decoder.isa
@@ -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 {
diff --git a/arch/mips/isa_traits.hh b/arch/mips/isa_traits.hh
index 8363f42f3..486a5d130 100644
--- a/arch/mips/isa_traits.hh
+++ b/arch/mips/isa_traits.hh
@@ -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);
@@ -589,7 +589,20 @@ extern const Addr PageOffset;
static inline void setSyscallReturn(SyscallReturn return_value, RegFile *regs)
{
- regs->intRegFile[ReturnValueReg1] = 1;
+ // check for error condition. Alpha syscall convention is to
+ // indicate success/failure in reg a3 (r19) and put the
+ // return value itself in the standard return value reg (v0).
+ if (return_value.successful()) {
+ // no error
+ regs->intRegFile[ReturnValueReg1] = 0;
+ regs->intRegFile[ReturnValueReg2] = return_value.value();
+ } else {
+ // got an error, return details
+ regs->intRegFile[ReturnValueReg1] = (IntReg) -1;
+ regs->intRegFile[ReturnValueReg2] = -return_value.value();
+ }
+
+ //regs->intRegFile[ReturnValueReg1] = (IntReg)return_value;
//panic("Returning from syscall\n");
}
diff --git a/arch/mips/linux_process.cc b/arch/mips/linux_process.cc
index 91e9a56a1..92a79cfd1 100644
--- a/arch/mips/linux_process.cc
+++ b/arch/mips/linux_process.cc
@@ -26,7 +26,6 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#include "arch/mips/common_syscall_emul.hh"
#include "arch/mips/linux_process.hh"
#include "arch/mips/isa_traits.hh"
@@ -162,11 +161,11 @@ SyscallDesc MipsLinuxProcess::syscallDescs[] = {
/* 43 */ SyscallDesc("times", unimplementedFunc),
/* 44 */ SyscallDesc("prof", unimplementedFunc),
/* 45 */ SyscallDesc("brk", unimplementedFunc),/*openFunc<Linux>*/
- /* 46 */ SyscallDesc("setgid", setgidFunc),
+ /* 46 */ SyscallDesc("setgid", unimplementedFunc),
/* 47 */ SyscallDesc("getgid", getgidFunc),
/* 48 */ SyscallDesc("signal", ignoreFunc),
- /* 49 */ SyscallDesc("geteuid", unimplementedFunc),
- /* 50 */ SyscallDesc("getegid", unimplementedFunc),
+ /* 49 */ SyscallDesc("geteuid", geteuidFunc),
+ /* 50 */ SyscallDesc("getegid", getegidFunc),
/* 51 */ SyscallDesc("acct", unimplementedFunc),
/* 52 */ SyscallDesc("umount2", unimplementedFunc),
/* 53 */ SyscallDesc("lock", unimplementedFunc),
@@ -207,7 +206,7 @@ SyscallDesc MipsLinuxProcess::syscallDescs[] = {
/* 88 */ SyscallDesc("reboot", unimplementedFunc),
/* 89 */ SyscallDesc("readdir", unimplementedFunc),
/* 90 */ SyscallDesc("mmap", mmapFunc<Linux>),
- /* 91 */ SyscallDesc("munmap", ),/*fstatFunc<Linux>*/
+ /* 91 */ SyscallDesc("munmap",unimplementedFunc),/*fstatFunc<Linux>*/
/* 92 */ SyscallDesc("truncate", fcntlFunc),
/* 93 */ SyscallDesc("ftruncate", unimplementedFunc),
/* 94 */ SyscallDesc("fchmod", unimplementedFunc),
@@ -238,9 +237,9 @@ SyscallDesc MipsLinuxProcess::syscallDescs[] = {
/* 119 */ SyscallDesc("sigreturn", unimplementedFunc),
/* 120 */ SyscallDesc("clone", unimplementedFunc),
/* 121 */ SyscallDesc("setdomainname", unimplementedFunc),
- /* 122 */ SyscallDesc("uname", unameFunc)/*,writevFunc<Linux>*/
- /* 123 */ SyscallDesc("modify_ldt", fchownFunc),
- /* 124 */ SyscallDesc("adjtimex", fchmodFunc<Linux>),
+ /* 122 */ SyscallDesc("uname", unameFunc),
+ /* 123 */ SyscallDesc("modify_ldt", unimplementedFunc),
+ /* 124 */ SyscallDesc("adjtimex", unimplementedFunc),
/* 125 */ SyscallDesc("mprotect", unimplementedFunc),
/* 126 */ SyscallDesc("sigprocmask", unimplementedFunc),
/* 127 */ SyscallDesc("create_module", unimplementedFunc),
@@ -262,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),