process.cc (13028:9a09c342891e) process.cc (13613:a19963be12ca)
1/*
2 * Copyright (c) 2014 Advanced Micro Devices, Inc.
3 * Copyright (c) 2007 The Hewlett-Packard Development Company
4 * All rights reserved.
5 *
6 * The license below extends only to copyright in the software and shall
7 * not be construed as granting a license to any other intellectual
8 * property including but not limited to intellectual property relating

--- 105 unchanged lines hidden (view full) ---

114 new EmulationPageTable(params->name, params->pid,
115 PageBytes),
116 objFile),
117 syscallDescs(_syscallDescs), numSyscallDescs(_numSyscallDescs)
118{
119}
120
121void X86Process::clone(ThreadContext *old_tc, ThreadContext *new_tc,
1/*
2 * Copyright (c) 2014 Advanced Micro Devices, Inc.
3 * Copyright (c) 2007 The Hewlett-Packard Development Company
4 * All rights reserved.
5 *
6 * The license below extends only to copyright in the software and shall
7 * not be construed as granting a license to any other intellectual
8 * property including but not limited to intellectual property relating

--- 105 unchanged lines hidden (view full) ---

114 new EmulationPageTable(params->name, params->pid,
115 PageBytes),
116 objFile),
117 syscallDescs(_syscallDescs), numSyscallDescs(_numSyscallDescs)
118{
119}
120
121void X86Process::clone(ThreadContext *old_tc, ThreadContext *new_tc,
122 Process *p, TheISA::IntReg flags)
122 Process *p, RegVal flags)
123{
124 Process::clone(old_tc, new_tc, p, flags);
125 X86Process *process = (X86Process*)p;
126 *process = *this;
127}
128
129X86_64Process::X86_64Process(ProcessParams *params, ObjectFile *objFile,
130 SyscallDesc *_syscallDescs, int _numSyscallDescs)

--- 308 unchanged lines hidden (view full) ---

439
440 tc->setMiscReg(MISCREG_TSG_BASE, GDTVirtAddr);
441 tc->setMiscReg(MISCREG_TSG_LIMIT, 0xffff);
442
443 tc->setMiscReg(MISCREG_IDTR_BASE, IDTVirtAddr);
444 tc->setMiscReg(MISCREG_IDTR_LIMIT, 0xffff);
445
446 /* enabling syscall and sysret */
123{
124 Process::clone(old_tc, new_tc, p, flags);
125 X86Process *process = (X86Process*)p;
126 *process = *this;
127}
128
129X86_64Process::X86_64Process(ProcessParams *params, ObjectFile *objFile,
130 SyscallDesc *_syscallDescs, int _numSyscallDescs)

--- 308 unchanged lines hidden (view full) ---

439
440 tc->setMiscReg(MISCREG_TSG_BASE, GDTVirtAddr);
441 tc->setMiscReg(MISCREG_TSG_LIMIT, 0xffff);
442
443 tc->setMiscReg(MISCREG_IDTR_BASE, IDTVirtAddr);
444 tc->setMiscReg(MISCREG_IDTR_LIMIT, 0xffff);
445
446 /* enabling syscall and sysret */
447 MiscReg star = ((MiscReg)sret << 48) | ((MiscReg)scall << 32);
447 RegVal star = ((RegVal)sret << 48) | ((RegVal)scall << 32);
448 tc->setMiscReg(MISCREG_STAR, star);
448 tc->setMiscReg(MISCREG_STAR, star);
449 MiscReg lstar = (MiscReg)syscallCodeVirtAddr;
449 RegVal lstar = (RegVal)syscallCodeVirtAddr;
450 tc->setMiscReg(MISCREG_LSTAR, lstar);
450 tc->setMiscReg(MISCREG_LSTAR, lstar);
451 MiscReg sfmask = (1 << 8) | (1 << 10); // TF | DF
451 RegVal sfmask = (1 << 8) | (1 << 10); // TF | DF
452 tc->setMiscReg(MISCREG_SF_MASK, sfmask);
453 }
454
455 /* Set up the content of the TSS and write it to physical memory. */
456
457 struct {
458 uint32_t reserved0; // +00h
459 uint32_t RSP0_low; // +04h

--- 605 unchanged lines hidden (view full) ---

1065}
1066
1067void
1068X86Process::setSyscallReturn(ThreadContext *tc, SyscallReturn retval)
1069{
1070 tc->setIntReg(INTREG_RAX, retval.encodedValue());
1071}
1072
452 tc->setMiscReg(MISCREG_SF_MASK, sfmask);
453 }
454
455 /* Set up the content of the TSS and write it to physical memory. */
456
457 struct {
458 uint32_t reserved0; // +00h
459 uint32_t RSP0_low; // +04h

--- 605 unchanged lines hidden (view full) ---

1065}
1066
1067void
1068X86Process::setSyscallReturn(ThreadContext *tc, SyscallReturn retval)
1069{
1070 tc->setIntReg(INTREG_RAX, retval.encodedValue());
1071}
1072
1073X86ISA::IntReg
1073RegVal
1074X86_64Process::getSyscallArg(ThreadContext *tc, int &i)
1075{
1076 assert(i < NumArgumentRegs);
1077 return tc->readIntReg(ArgumentReg[i++]);
1078}
1079
1080void
1074X86_64Process::getSyscallArg(ThreadContext *tc, int &i)
1075{
1076 assert(i < NumArgumentRegs);
1077 return tc->readIntReg(ArgumentReg[i++]);
1078}
1079
1080void
1081X86_64Process::setSyscallArg(ThreadContext *tc, int i, X86ISA::IntReg val)
1081X86_64Process::setSyscallArg(ThreadContext *tc, int i, RegVal val)
1082{
1083 assert(i < NumArgumentRegs);
1084 return tc->setIntReg(ArgumentReg[i], val);
1085}
1086
1087void
1088X86_64Process::clone(ThreadContext *old_tc, ThreadContext *new_tc,
1082{
1083 assert(i < NumArgumentRegs);
1084 return tc->setIntReg(ArgumentReg[i], val);
1085}
1086
1087void
1088X86_64Process::clone(ThreadContext *old_tc, ThreadContext *new_tc,
1089 Process *p, TheISA::IntReg flags)
1089 Process *p, RegVal flags)
1090{
1091 X86Process::clone(old_tc, new_tc, p, flags);
1092 ((X86_64Process*)p)->vsyscallPage = vsyscallPage;
1093}
1094
1090{
1091 X86Process::clone(old_tc, new_tc, p, flags);
1092 ((X86_64Process*)p)->vsyscallPage = vsyscallPage;
1093}
1094
1095X86ISA::IntReg
1095RegVal
1096I386Process::getSyscallArg(ThreadContext *tc, int &i)
1097{
1098 assert(i < NumArgumentRegs32);
1099 return tc->readIntReg(ArgumentReg32[i++]);
1100}
1101
1096I386Process::getSyscallArg(ThreadContext *tc, int &i)
1097{
1098 assert(i < NumArgumentRegs32);
1099 return tc->readIntReg(ArgumentReg32[i++]);
1100}
1101
1102X86ISA::IntReg
1102RegVal
1103I386Process::getSyscallArg(ThreadContext *tc, int &i, int width)
1104{
1105 assert(width == 32 || width == 64);
1106 assert(i < NumArgumentRegs);
1107 uint64_t retVal = tc->readIntReg(ArgumentReg32[i++]) & mask(32);
1108 if (width == 64)
1109 retVal |= ((uint64_t)tc->readIntReg(ArgumentReg[i++]) << 32);
1110 return retVal;
1111}
1112
1113void
1103I386Process::getSyscallArg(ThreadContext *tc, int &i, int width)
1104{
1105 assert(width == 32 || width == 64);
1106 assert(i < NumArgumentRegs);
1107 uint64_t retVal = tc->readIntReg(ArgumentReg32[i++]) & mask(32);
1108 if (width == 64)
1109 retVal |= ((uint64_t)tc->readIntReg(ArgumentReg[i++]) << 32);
1110 return retVal;
1111}
1112
1113void
1114I386Process::setSyscallArg(ThreadContext *tc, int i, X86ISA::IntReg val)
1114I386Process::setSyscallArg(ThreadContext *tc, int i, RegVal val)
1115{
1116 assert(i < NumArgumentRegs);
1117 return tc->setIntReg(ArgumentReg[i], val);
1118}
1119
1120void
1121I386Process::clone(ThreadContext *old_tc, ThreadContext *new_tc,
1115{
1116 assert(i < NumArgumentRegs);
1117 return tc->setIntReg(ArgumentReg[i], val);
1118}
1119
1120void
1121I386Process::clone(ThreadContext *old_tc, ThreadContext *new_tc,
1122 Process *p, TheISA::IntReg flags)
1122 Process *p, RegVal flags)
1123{
1124 X86Process::clone(old_tc, new_tc, p, flags);
1125 ((I386Process*)p)->vsyscallPage = vsyscallPage;
1126}
1123{
1124 X86Process::clone(old_tc, new_tc, p, flags);
1125 ((I386Process*)p)->vsyscallPage = vsyscallPage;
1126}