add fcntl64Func
use ThreadContext rename src/arch/mips/isa/formats/branch.isa: src/arch/mips/isa/formats/fp.isa: src/arch/mips/isa/includes.isa: Use ThreadContext src/sim/syscall_emul.cc: fcntl64 function using TC src/sim/syscall_emul.hh: Add fcntl64func --HG-- extra : convert_revision : b5e2348530473704388b1c5a2b59bf78360260a9
This commit is contained in:
parent
68e470f78a
commit
4cc31e1aef
5 changed files with 45 additions and 12 deletions
|
@ -88,7 +88,7 @@ output header {{
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
Addr branchTarget(ExecContext *xc) const;
|
Addr branchTarget(ThreadContext *tc) const;
|
||||||
|
|
||||||
std::string
|
std::string
|
||||||
generateDisassembly(Addr pc, const SymbolTable *symtab) const;
|
generateDisassembly(Addr pc, const SymbolTable *symtab) const;
|
||||||
|
@ -103,10 +103,10 @@ output decoder {{
|
||||||
}
|
}
|
||||||
|
|
||||||
Addr
|
Addr
|
||||||
Jump::branchTarget(ExecContext *xc) const
|
Jump::branchTarget(ThreadContext *tc) const
|
||||||
{
|
{
|
||||||
Addr NPC = xc->readPC() + 4;
|
Addr NPC = tc->readPC() + 4;
|
||||||
uint64_t Rb = xc->readIntReg(_srcRegIdx[0]);
|
uint64_t Rb = tc->readIntReg(_srcRegIdx[0]);
|
||||||
return (Rb & ~3) | (NPC & 1);
|
return (Rb & ~3) | (NPC & 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -95,7 +95,7 @@ output exec {{
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
bool
|
bool
|
||||||
fpInvalidOp(FPOp *inst, %(CPU_exec_context)s *xc, const T dest_val,
|
fpInvalidOp(FPOp *inst, %(CPU_exec_context)s *cpu, const T dest_val,
|
||||||
Trace::InstRecord *traceData)
|
Trace::InstRecord *traceData)
|
||||||
{
|
{
|
||||||
uint64_t mips_nan = 0;
|
uint64_t mips_nan = 0;
|
||||||
|
@ -111,13 +111,13 @@ output exec {{
|
||||||
}
|
}
|
||||||
|
|
||||||
//Set value to QNAN
|
//Set value to QNAN
|
||||||
xc->setFloatRegBits(inst, 0, mips_nan, size);
|
cpu->setFloatRegBits(inst, 0, mips_nan, size);
|
||||||
|
|
||||||
//Read FCSR from FloatRegFile
|
//Read FCSR from FloatRegFile
|
||||||
uint32_t fcsr_bits = xc->cpuXC->readFloatRegBits(FCSR);
|
uint32_t fcsr_bits = cpu->tc->readFloatRegBits(FCSR);
|
||||||
|
|
||||||
//Write FCSR from FloatRegFile
|
//Write FCSR from FloatRegFile
|
||||||
xc->cpuXC->setFloatRegBits(FCSR, genInvalidVector(fcsr_bits));
|
cpu->tc->setFloatRegBits(FCSR, genInvalidVector(fcsr_bits));
|
||||||
|
|
||||||
if (traceData) { traceData->setData(mips_nan); }
|
if (traceData) { traceData->setData(mips_nan); }
|
||||||
return true;
|
return true;
|
||||||
|
@ -127,15 +127,15 @@ output exec {{
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
fpResetCauseBits(%(CPU_exec_context)s *xc)
|
fpResetCauseBits(%(CPU_exec_context)s *cpu)
|
||||||
{
|
{
|
||||||
//Read FCSR from FloatRegFile
|
//Read FCSR from FloatRegFile
|
||||||
uint32_t fcsr = xc->cpuXC->readFloatRegBits(FCSR);
|
uint32_t fcsr = cpu->tc->readFloatRegBits(FCSR);
|
||||||
|
|
||||||
fcsr = bits(fcsr, 31, 18) << 18 | bits(fcsr, 11, 0);
|
fcsr = bits(fcsr, 31, 18) << 18 | bits(fcsr, 11, 0);
|
||||||
|
|
||||||
//Write FCSR from FloatRegFile
|
//Write FCSR from FloatRegFile
|
||||||
xc->cpuXC->setFloatRegBits(FCSR, fcsr);
|
cpu->tc->setFloatRegBits(FCSR, fcsr);
|
||||||
}
|
}
|
||||||
}};
|
}};
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,7 @@ output decoder {{
|
||||||
#include "arch/mips/isa_traits.hh"
|
#include "arch/mips/isa_traits.hh"
|
||||||
#include "base/cprintf.hh"
|
#include "base/cprintf.hh"
|
||||||
#include "base/loader/symtab.hh"
|
#include "base/loader/symtab.hh"
|
||||||
#include "cpu/exec_context.hh" // for Jump::branchTarget()
|
#include "cpu/thread_context.hh"
|
||||||
#include "arch/mips/faults.hh"
|
#include "arch/mips/faults.hh"
|
||||||
#include "arch/mips/isa_traits.hh"
|
#include "arch/mips/isa_traits.hh"
|
||||||
#include "arch/mips/utility.hh"
|
#include "arch/mips/utility.hh"
|
||||||
|
|
|
@ -340,6 +340,35 @@ fcntlFunc(SyscallDesc *desc, int num, Process *process,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SyscallReturn
|
||||||
|
fcntl64Func(SyscallDesc *desc, int num, Process *process,
|
||||||
|
ThreadContext *tc)
|
||||||
|
{
|
||||||
|
int fd = tc->getSyscallArg(0);
|
||||||
|
|
||||||
|
if (fd < 0 || process->sim_fd(fd) < 0)
|
||||||
|
return -EBADF;
|
||||||
|
|
||||||
|
int cmd = tc->getSyscallArg(1);
|
||||||
|
switch (cmd) {
|
||||||
|
case 33: //F_GETLK64
|
||||||
|
warn("fcntl64(%d, F_GETLK64) not supported, error returned\n", fd);
|
||||||
|
return -EMFILE;
|
||||||
|
|
||||||
|
case 34: // F_SETLK64
|
||||||
|
case 35: // F_SETLKW64
|
||||||
|
warn("fcntl64(%d, F_SETLK(W)64) not supported, error returned\n", fd);
|
||||||
|
return -EMFILE;
|
||||||
|
|
||||||
|
default:
|
||||||
|
// not sure if this is totally valid, but we'll pass it through
|
||||||
|
// to the underlying OS
|
||||||
|
warn("fcntl64(%d, %d) passed through to host\n", fd, cmd);
|
||||||
|
return fcntl(process->sim_fd(fd), cmd);
|
||||||
|
// return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
SyscallReturn
|
SyscallReturn
|
||||||
pipePseudoFunc(SyscallDesc *desc, int callnum, Process *process,
|
pipePseudoFunc(SyscallDesc *desc, int callnum, Process *process,
|
||||||
ThreadContext *tc)
|
ThreadContext *tc)
|
||||||
|
|
|
@ -249,6 +249,10 @@ SyscallReturn fchownFunc(SyscallDesc *desc, int num,
|
||||||
SyscallReturn fcntlFunc(SyscallDesc *desc, int num,
|
SyscallReturn fcntlFunc(SyscallDesc *desc, int num,
|
||||||
Process *process, ThreadContext *tc);
|
Process *process, ThreadContext *tc);
|
||||||
|
|
||||||
|
/// Target fcntl64() handler.
|
||||||
|
SyscallReturn fcntl64Func(SyscallDesc *desc, int num,
|
||||||
|
Process *process, ThreadContext *tc);
|
||||||
|
|
||||||
/// Target setuid() handler.
|
/// Target setuid() handler.
|
||||||
SyscallReturn setuidFunc(SyscallDesc *desc, int num,
|
SyscallReturn setuidFunc(SyscallDesc *desc, int num,
|
||||||
Process *p, ThreadContext *tc);
|
Process *p, ThreadContext *tc);
|
||||||
|
|
Loading…
Reference in a new issue