Implement the _llseek syscall. It's Linux only, so we'll actually use the lseek syscall.
--HG-- extra : convert_revision : cccfd5efddbba527c6fb4e07ad2ab235a2670918
This commit is contained in:
parent
477afcaf5b
commit
23dc5099a4
3 changed files with 38 additions and 1 deletions
|
@ -333,7 +333,7 @@ SyscallDesc SparcLinuxProcess::syscallDescs[] = {
|
||||||
/* 233 */ SyscallDesc("stime", unimplementedFunc),
|
/* 233 */ SyscallDesc("stime", unimplementedFunc),
|
||||||
/* 234 */ SyscallDesc("statfs64", unimplementedFunc),
|
/* 234 */ SyscallDesc("statfs64", unimplementedFunc),
|
||||||
/* 235 */ SyscallDesc("fstatfs64", unimplementedFunc),
|
/* 235 */ SyscallDesc("fstatfs64", unimplementedFunc),
|
||||||
/* 236 */ SyscallDesc("_llseek", unimplementedFunc),
|
/* 236 */ SyscallDesc("_llseek", _llseekFunc),
|
||||||
/* 237 */ SyscallDesc("mlock", unimplementedFunc),
|
/* 237 */ SyscallDesc("mlock", unimplementedFunc),
|
||||||
/* 238 */ SyscallDesc("munlock", unimplementedFunc),
|
/* 238 */ SyscallDesc("munlock", unimplementedFunc),
|
||||||
/* 239 */ SyscallDesc("mlockall", unimplementedFunc),
|
/* 239 */ SyscallDesc("mlockall", unimplementedFunc),
|
||||||
|
|
|
@ -183,6 +183,39 @@ lseekFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SyscallReturn
|
||||||
|
_llseekFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc)
|
||||||
|
{
|
||||||
|
int fd = p->sim_fd(tc->getSyscallArg(0));
|
||||||
|
uint64_t offset_high = tc->getSyscallArg(1);
|
||||||
|
uint32_t offset_low = tc->getSyscallArg(2);
|
||||||
|
Addr result_ptr = tc->getSyscallArg(3);
|
||||||
|
int whence = tc->getSyscallArg(4);
|
||||||
|
|
||||||
|
uint64_t offset = (offset_high << 32) | offset_low;
|
||||||
|
|
||||||
|
uint64_t result = lseek(fd, offset, whence);
|
||||||
|
result = TheISA::htog(result);
|
||||||
|
|
||||||
|
if (result == (off_t)-1) {
|
||||||
|
//The seek failed.
|
||||||
|
return -errno;
|
||||||
|
} else {
|
||||||
|
//The seek succeeded.
|
||||||
|
//Copy "result" to "result_ptr"
|
||||||
|
//XXX We'll assume that the size of loff_t is 64 bits on the
|
||||||
|
//target platform
|
||||||
|
BufferArg result_buf(result_ptr, sizeof(result));
|
||||||
|
memcpy(result_buf.bufferPtr(), &result, sizeof(result));
|
||||||
|
result_buf.copyOut(tc->getMemPort());
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return (result == (off_t)-1) ? -errno : result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
SyscallReturn
|
SyscallReturn
|
||||||
munmapFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc)
|
munmapFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc)
|
||||||
{
|
{
|
||||||
|
|
|
@ -211,6 +211,10 @@ SyscallReturn writeFunc(SyscallDesc *desc, int num,
|
||||||
SyscallReturn lseekFunc(SyscallDesc *desc, int num,
|
SyscallReturn lseekFunc(SyscallDesc *desc, int num,
|
||||||
LiveProcess *p, ThreadContext *tc);
|
LiveProcess *p, ThreadContext *tc);
|
||||||
|
|
||||||
|
/// Target _llseek() handler.
|
||||||
|
SyscallReturn _llseekFunc(SyscallDesc *desc, int num,
|
||||||
|
LiveProcess *p, ThreadContext *tc);
|
||||||
|
|
||||||
/// Target munmap() handler.
|
/// Target munmap() handler.
|
||||||
SyscallReturn munmapFunc(SyscallDesc *desc, int num,
|
SyscallReturn munmapFunc(SyscallDesc *desc, int num,
|
||||||
LiveProcess *p, ThreadContext *tc);
|
LiveProcess *p, ThreadContext *tc);
|
||||||
|
|
Loading…
Reference in a new issue