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, 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 */ |
447 RegVal star = ((RegVal)sret << 48) | ((RegVal)scall << 32); |
448 tc->setMiscReg(MISCREG_STAR, star); |
449 RegVal lstar = (RegVal)syscallCodeVirtAddr; |
450 tc->setMiscReg(MISCREG_LSTAR, lstar); |
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 |
1073RegVal |
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, 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, |
1089 Process *p, RegVal flags) |
1090{ 1091 X86Process::clone(old_tc, new_tc, p, flags); 1092 ((X86_64Process*)p)->vsyscallPage = vsyscallPage; 1093} 1094 |
1095RegVal |
1096I386Process::getSyscallArg(ThreadContext *tc, int &i) 1097{ 1098 assert(i < NumArgumentRegs32); 1099 return tc->readIntReg(ArgumentReg32[i++]); 1100} 1101 |
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 |
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, |
1122 Process *p, RegVal flags) |
1123{ 1124 X86Process::clone(old_tc, new_tc, p, flags); 1125 ((I386Process*)p)->vsyscallPage = vsyscallPage; 1126} |