gem5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
process.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2003-2004 The Regents of The University of Michigan
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are
7  * met: redistributions of source code must retain the above copyright
8  * notice, this list of conditions and the following disclaimer;
9  * redistributions in binary form must reproduce the above copyright
10  * notice, this list of conditions and the following disclaimer in the
11  * documentation and/or other materials provided with the distribution;
12  * neither the name of the copyright holders nor the names of its
13  * contributors may be used to endorse or promote products derived from
14  * this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  *
28  * Authors: Gabe Black
29  * Ali Saidi
30  */
31 
32 #include "arch/sparc/process.hh"
33 
34 #include "arch/sparc/asi.hh"
35 #include "arch/sparc/handlers.hh"
36 #include "arch/sparc/isa_traits.hh"
37 #include "arch/sparc/registers.hh"
38 #include "arch/sparc/types.hh"
41 #include "base/misc.hh"
42 #include "cpu/thread_context.hh"
43 #include "debug/Stack.hh"
44 #include "mem/page_table.hh"
45 #include "sim/aux_vector.hh"
46 #include "sim/process_impl.hh"
47 #include "sim/syscall_return.hh"
48 #include "sim/system.hh"
49 
50 using namespace std;
51 using namespace SparcISA;
52 
53 static const int FirstArgumentReg = 8;
54 
55 
56 SparcProcess::SparcProcess(ProcessParams * params, ObjectFile *objFile,
57  Addr _StackBias)
58  : Process(params, objFile), StackBias(_StackBias)
59 {
60  // Initialize these to 0s
61  fillStart = 0;
62  spillStart = 0;
63 }
64 
65 void
66 SparcProcess::handleTrap(int trapNum, ThreadContext *tc, Fault *fault)
67 {
68  PCState pc = tc->pcState();
69  switch (trapNum) {
70  case 0x01: // Software breakpoint
71  warn("Software breakpoint encountered at pc %#x.\n", pc.pc());
72  break;
73  case 0x02: // Division by zero
74  warn("Software signaled a division by zero at pc %#x.\n", pc.pc());
75  break;
76  case 0x03: // Flush window trap
77  flushWindows(tc);
78  break;
79  case 0x04: // Clean windows
80  warn("Ignoring process request for clean register "
81  "windows at pc %#x.\n", pc.pc());
82  break;
83  case 0x05: // Range check
84  warn("Software signaled a range check at pc %#x.\n", pc.pc());
85  break;
86  case 0x06: // Fix alignment
87  warn("Ignoring process request for os assisted unaligned accesses "
88  "at pc %#x.\n", pc.pc());
89  break;
90  case 0x07: // Integer overflow
91  warn("Software signaled an integer overflow at pc %#x.\n", pc.pc());
92  break;
93  case 0x32: // Get integer condition codes
94  warn("Ignoring process request to get the integer condition codes "
95  "at pc %#x.\n", pc.pc());
96  break;
97  case 0x33: // Set integer condition codes
98  warn("Ignoring process request to set the integer condition codes "
99  "at pc %#x.\n", pc.pc());
100  break;
101  default:
102  panic("Unimplemented trap to operating system: trap number %#x.\n", trapNum);
103  }
104 }
105 
106 void
108 {
110 
112  // From the SPARC ABI
113 
114  // Setup default FP state
116 
118 
119  /*
120  * Register window management registers
121  */
122 
123  // No windows contain info from other programs
124  // tc->setMiscRegNoEffect(MISCREG_OTHERWIN, 0);
125  tc->setIntReg(NumIntArchRegs + 6, 0);
126  // There are no windows to pop
127  // tc->setMiscRegNoEffect(MISCREG_CANRESTORE, 0);
128  tc->setIntReg(NumIntArchRegs + 4, 0);
129  // All windows are available to save into
130  // tc->setMiscRegNoEffect(MISCREG_CANSAVE, NWindows - 2);
131  tc->setIntReg(NumIntArchRegs + 3, NWindows - 2);
132  // All windows are "clean"
133  // tc->setMiscRegNoEffect(MISCREG_CLEANWIN, NWindows);
135  // Start with register window 0
136  tc->setMiscReg(MISCREG_CWP, 0);
137  // Always use spill and fill traps 0
138  // tc->setMiscRegNoEffect(MISCREG_WSTATE, 0);
139  tc->setIntReg(NumIntArchRegs + 7, 0);
140  // Set the trap level to 0
142  // Set the ASI register to something fixed
144 
145  // Set the MMU Primary Context Register to hold the process' pid
147 
148  /*
149  * T1 specific registers
150  */
151  // Turn on the icache, dcache, dtb translation, and itb translation.
153 }
154 
155 void
157 {
159 
161  // The process runs in user mode with 32 bit addresses
162  PSTATE pstate = 0;
163  pstate.ie = 1;
164  pstate.am = 1;
165  tc->setMiscReg(MISCREG_PSTATE, pstate);
166 
167  argsInit(32 / 8, PageBytes);
168 }
169 
170 void
172 {
174 
176  // The process runs in user mode
177  PSTATE pstate = 0;
178  pstate.ie = 1;
179  tc->setMiscReg(MISCREG_PSTATE, pstate);
180 
181  argsInit(sizeof(IntReg), PageBytes);
182 }
183 
184 template<class IntType>
185 void
187 {
188  int intSize = sizeof(IntType);
189 
190  typedef AuxVector<IntType> auxv_t;
191 
192  std::vector<auxv_t> auxv;
193 
194  string filename;
195  if (argv.size() < 1)
196  filename = "";
197  else
198  filename = argv[0];
199 
200  // Even for a 32 bit process, the ABI says we still need to
201  // maintain double word alignment of the stack pointer.
202  uint64_t align = 16;
203 
204  // Patch the ld_bias for dynamic executables.
205  updateBias();
206 
207  // load object file into target memory
209 
210  enum hardwareCaps
211  {
212  M5_HWCAP_SPARC_FLUSH = 1,
213  M5_HWCAP_SPARC_STBAR = 2,
214  M5_HWCAP_SPARC_SWAP = 4,
215  M5_HWCAP_SPARC_MULDIV = 8,
216  M5_HWCAP_SPARC_V9 = 16,
217  // This one should technically only be set
218  // if there is a cheetah or cheetah_plus tlb,
219  // but we'll use it all the time
220  M5_HWCAP_SPARC_ULTRA3 = 32
221  };
222 
223  const int64_t hwcap =
224  M5_HWCAP_SPARC_FLUSH |
225  M5_HWCAP_SPARC_STBAR |
226  M5_HWCAP_SPARC_SWAP |
227  M5_HWCAP_SPARC_MULDIV |
228  M5_HWCAP_SPARC_V9 |
229  M5_HWCAP_SPARC_ULTRA3;
230 
231  // Setup the auxilliary vectors. These will already have endian conversion.
232  // Auxilliary vectors are loaded only for elf formatted executables.
233  ElfObject * elfObject = dynamic_cast<ElfObject *>(objFile);
234  if (elfObject) {
235  // Bits which describe the system hardware capabilities
236  auxv.push_back(auxv_t(M5_AT_HWCAP, hwcap));
237  // The system page size
238  auxv.push_back(auxv_t(M5_AT_PAGESZ, SparcISA::PageBytes));
239  // Defined to be 100 in the kernel source.
240  // Frequency at which times() increments
241  auxv.push_back(auxv_t(M5_AT_CLKTCK, 100));
242  // For statically linked executables, this is the virtual address of the
243  // program header tables if they appear in the executable image
244  auxv.push_back(auxv_t(M5_AT_PHDR, elfObject->programHeaderTable()));
245  // This is the size of a program header entry from the elf file.
246  auxv.push_back(auxv_t(M5_AT_PHENT, elfObject->programHeaderSize()));
247  // This is the number of program headers from the original elf file.
248  auxv.push_back(auxv_t(M5_AT_PHNUM, elfObject->programHeaderCount()));
249  // This is the base address of the ELF interpreter; it should be
250  // zero for static executables or contain the base address for
251  // dynamic executables.
252  auxv.push_back(auxv_t(M5_AT_BASE, getBias()));
253  // This is hardwired to 0 in the elf loading code in the kernel
254  auxv.push_back(auxv_t(M5_AT_FLAGS, 0));
255  // The entry point to the program
256  auxv.push_back(auxv_t(M5_AT_ENTRY, objFile->entryPoint()));
257  // Different user and group IDs
258  auxv.push_back(auxv_t(M5_AT_UID, uid()));
259  auxv.push_back(auxv_t(M5_AT_EUID, euid()));
260  auxv.push_back(auxv_t(M5_AT_GID, gid()));
261  auxv.push_back(auxv_t(M5_AT_EGID, egid()));
262  // Whether to enable "secure mode" in the executable
263  auxv.push_back(auxv_t(M5_AT_SECURE, 0));
264  }
265 
266  // Figure out how big the initial stack needs to be
267 
268  // The unaccounted for 8 byte 0 at the top of the stack
269  int sentry_size = 8;
270 
271  // This is the name of the file which is present on the initial stack
272  // It's purpose is to let the user space linker examine the original file.
273  int file_name_size = filename.size() + 1;
274 
275  int env_data_size = 0;
276  for (int i = 0; i < envp.size(); ++i) {
277  env_data_size += envp[i].size() + 1;
278  }
279  int arg_data_size = 0;
280  for (int i = 0; i < argv.size(); ++i) {
281  arg_data_size += argv[i].size() + 1;
282  }
283 
284  // The info_block.
285  int base_info_block_size =
286  sentry_size + file_name_size + env_data_size + arg_data_size;
287 
288  int info_block_size = roundUp(base_info_block_size, align);
289 
290  int info_block_padding = info_block_size - base_info_block_size;
291 
292  // Each auxilliary vector is two words
293  int aux_array_size = intSize * 2 * (auxv.size() + 1);
294 
295  int envp_array_size = intSize * (envp.size() + 1);
296  int argv_array_size = intSize * (argv.size() + 1);
297 
298  int argc_size = intSize;
299  int window_save_size = intSize * 16;
300 
301  // Figure out the size of the contents of the actual initial frame
302  int frame_size =
303  aux_array_size +
304  envp_array_size +
305  argv_array_size +
306  argc_size +
307  window_save_size;
308 
309  // There needs to be padding after the auxiliary vector data so that the
310  // very bottom of the stack is aligned properly.
311  int aligned_partial_size = roundUp(frame_size, align);
312  int aux_padding = aligned_partial_size - frame_size;
313 
314  int space_needed =
315  info_block_size +
316  aux_padding +
317  frame_size;
318 
319  memState->setStackMin(memState->getStackBase() - space_needed);
320  memState->setStackMin(roundDown(memState->getStackMin(), align));
321  memState->setStackSize(memState->getStackBase() - memState->getStackMin());
322 
323  // Allocate space for the stack
324  allocateMem(roundDown(memState->getStackMin(), pageSize),
325  roundUp(memState->getStackSize(), pageSize));
326 
327  // map out initial stack contents
328  IntType sentry_base = memState->getStackBase() - sentry_size;
329  IntType file_name_base = sentry_base - file_name_size;
330  IntType env_data_base = file_name_base - env_data_size;
331  IntType arg_data_base = env_data_base - arg_data_size;
332  IntType auxv_array_base = arg_data_base -
333  info_block_padding - aux_array_size - aux_padding;
334  IntType envp_array_base = auxv_array_base - envp_array_size;
335  IntType argv_array_base = envp_array_base - argv_array_size;
336  IntType argc_base = argv_array_base - argc_size;
337 #if TRACING_ON
338  IntType window_save_base = argc_base - window_save_size;
339 #endif
340 
341  DPRINTF(Stack, "The addresses of items on the initial stack:\n");
342  DPRINTF(Stack, "%#x - sentry NULL\n", sentry_base);
343  DPRINTF(Stack, "filename = %s\n", filename);
344  DPRINTF(Stack, "%#x - file name\n", file_name_base);
345  DPRINTF(Stack, "%#x - env data\n", env_data_base);
346  DPRINTF(Stack, "%#x - arg data\n", arg_data_base);
347  DPRINTF(Stack, "%#x - auxv array\n", auxv_array_base);
348  DPRINTF(Stack, "%#x - envp array\n", envp_array_base);
349  DPRINTF(Stack, "%#x - argv array\n", argv_array_base);
350  DPRINTF(Stack, "%#x - argc \n", argc_base);
351  DPRINTF(Stack, "%#x - window save\n", window_save_base);
352  DPRINTF(Stack, "%#x - stack min\n", memState->getStackMin());
353 
354  assert(window_save_base == memState->getStackMin());
355 
356  // write contents to stack
357 
358  // figure out argc
359  IntType argc = argv.size();
360  IntType guestArgc = SparcISA::htog(argc);
361 
362  // Write out the sentry void *
363  uint64_t sentry_NULL = 0;
364  initVirtMem.writeBlob(sentry_base,
365  (uint8_t*)&sentry_NULL, sentry_size);
366 
367  // Write the file name
368  initVirtMem.writeString(file_name_base, filename.c_str());
369 
370  // Copy the aux stuff
371  for (int x = 0; x < auxv.size(); x++) {
372  initVirtMem.writeBlob(auxv_array_base + x * 2 * intSize,
373  (uint8_t*)&(auxv[x].a_type), intSize);
374  initVirtMem.writeBlob(auxv_array_base + (x * 2 + 1) * intSize,
375  (uint8_t*)&(auxv[x].a_val), intSize);
376  }
377 
378  // Write out the terminating zeroed auxilliary vector
379  const IntType zero = 0;
380  initVirtMem.writeBlob(auxv_array_base + intSize * 2 * auxv.size(),
381  (uint8_t*)&zero, intSize);
382  initVirtMem.writeBlob(auxv_array_base + intSize * (2 * auxv.size() + 1),
383  (uint8_t*)&zero, intSize);
384 
385  copyStringArray(envp, envp_array_base, env_data_base, initVirtMem);
386  copyStringArray(argv, argv_array_base, arg_data_base, initVirtMem);
387 
388  initVirtMem.writeBlob(argc_base, (uint8_t*)&guestArgc, intSize);
389 
390  // Set up space for the trap handlers into the processes address space.
391  // Since the stack grows down and there is reserved address space abov
392  // it, we can put stuff above it and stay out of the way.
393  fillStart = memState->getStackBase();
395 
397  // Set up the thread context to start running the process
398  // assert(NumArgumentRegs >= 2);
399  // tc->setIntReg(ArgumentReg[0], argc);
400  // tc->setIntReg(ArgumentReg[1], argv_array_base);
401  tc->setIntReg(StackPointerReg, memState->getStackMin() - StackBias);
402 
403  // %g1 is a pointer to a function that should be run at exit. Since we
404  // don't have anything like that, it should be set to 0.
405  tc->setIntReg(1, 0);
406 
407  tc->pcState(getStartPC());
408 
409  // Align the "stack_min" to a page boundary.
410  memState->setStackMin(roundDown(memState->getStackMin(), pageSize));
411 }
412 
413 void
414 Sparc64Process::argsInit(int intSize, int pageSize)
415 {
416  SparcProcess::argsInit<uint64_t>(pageSize);
417 
418  // Stuff the trap handlers into the process address space
420  (uint8_t*)fillHandler64, sizeof(MachInst) * numFillInsts);
422  (uint8_t*)spillHandler64, sizeof(MachInst) * numSpillInsts);
423 }
424 
425 void
426 Sparc32Process::argsInit(int intSize, int pageSize)
427 {
428  SparcProcess::argsInit<uint32_t>(pageSize);
429 
430  // Stuff the trap handlers into the process address space
432  (uint8_t*)fillHandler32, sizeof(MachInst) * numFillInsts);
434  (uint8_t*)spillHandler32, sizeof(MachInst) * numSpillInsts);
435 }
436 
438 {
439  IntReg Cansave = tc->readIntReg(NumIntArchRegs + 3);
440  IntReg Canrestore = tc->readIntReg(NumIntArchRegs + 4);
441  IntReg Otherwin = tc->readIntReg(NumIntArchRegs + 6);
442  MiscReg CWP = tc->readMiscReg(MISCREG_CWP);
443  MiscReg origCWP = CWP;
444  CWP = (CWP + Cansave + 2) % NWindows;
445  while (NWindows - 2 - Cansave != 0) {
446  if (Otherwin) {
447  panic("Otherwin non-zero.\n");
448  } else {
449  tc->setMiscReg(MISCREG_CWP, CWP);
450  // Do the stores
452  for (int index = 16; index < 32; index++) {
453  uint32_t regVal = tc->readIntReg(index);
454  regVal = htog(regVal);
455  if (!tc->getMemProxy().tryWriteBlob(
456  sp + (index - 16) * 4, (uint8_t *)&regVal, 4)) {
457  warn("Failed to save register to the stack when "
458  "flushing windows.\n");
459  }
460  }
461  Canrestore--;
462  Cansave++;
463  CWP = (CWP + 1) % NWindows;
464  }
465  }
466  tc->setIntReg(NumIntArchRegs + 3, Cansave);
467  tc->setIntReg(NumIntArchRegs + 4, Canrestore);
468  tc->setMiscReg(MISCREG_CWP, origCWP);
469 }
470 
471 void
473 {
474  IntReg Cansave = tc->readIntReg(NumIntArchRegs + 3);
475  IntReg Canrestore = tc->readIntReg(NumIntArchRegs + 4);
476  IntReg Otherwin = tc->readIntReg(NumIntArchRegs + 6);
477  MiscReg CWP = tc->readMiscReg(MISCREG_CWP);
478  MiscReg origCWP = CWP;
479  CWP = (CWP + Cansave + 2) % NWindows;
480  while (NWindows - 2 - Cansave != 0) {
481  if (Otherwin) {
482  panic("Otherwin non-zero.\n");
483  } else {
484  tc->setMiscReg(MISCREG_CWP, CWP);
485  // Do the stores
487  for (int index = 16; index < 32; index++) {
488  IntReg regVal = tc->readIntReg(index);
489  regVal = htog(regVal);
490  if (!tc->getMemProxy().tryWriteBlob(
491  sp + 2047 + (index - 16) * 8, (uint8_t *)&regVal, 8)) {
492  warn("Failed to save register to the stack when "
493  "flushing windows.\n");
494  }
495  }
496  Canrestore--;
497  Cansave++;
498  CWP = (CWP + 1) % NWindows;
499  }
500  }
501  tc->setIntReg(NumIntArchRegs + 3, Cansave);
502  tc->setIntReg(NumIntArchRegs + 4, Canrestore);
503  tc->setMiscReg(MISCREG_CWP, origCWP);
504 }
505 
506 IntReg
508 {
509  assert(i < 6);
510  return bits(tc->readIntReg(FirstArgumentReg + i++), 31, 0);
511 }
512 
513 void
515 {
516  assert(i < 6);
517  tc->setIntReg(FirstArgumentReg + i, bits(val, 31, 0));
518 }
519 
520 IntReg
522 {
523  assert(i < 6);
524  return tc->readIntReg(FirstArgumentReg + i++);
525 }
526 
527 void
529 {
530  assert(i < 6);
531  tc->setIntReg(FirstArgumentReg + i, val);
532 }
533 
534 void
536 {
537  // check for error condition. SPARC syscall convention is to
538  // indicate success/failure in reg the carry bit of the ccr
539  // and put the return value itself in the standard return value reg ().
540  PSTATE pstate = tc->readMiscRegNoEffect(MISCREG_PSTATE);
541  if (sysret.successful()) {
542  // no error, clear XCC.C
543  tc->setIntReg(NumIntArchRegs + 2,
544  tc->readIntReg(NumIntArchRegs + 2) & 0xEE);
545  IntReg val = sysret.returnValue();
546  if (pstate.am)
547  val = bits(val, 31, 0);
548  tc->setIntReg(ReturnValueReg, val);
549  } else {
550  // got an error, set XCC.C
551  tc->setIntReg(NumIntArchRegs + 2,
552  tc->readIntReg(NumIntArchRegs + 2) | 0x11);
553  IntReg val = sysret.errnoValue();
554  if (pstate.am)
555  val = bits(val, 31, 0);
556  tc->setIntReg(ReturnValueReg, val);
557  }
558 }
#define DPRINTF(x,...)
Definition: trace.hh:212
void setSyscallArg(ThreadContext *tc, int i, SparcISA::IntReg val)
Definition: process.cc:528
ObjectFile * objFile
Definition: process.hh:182
Bitfield< 30, 0 > index
T htog(T value)
Definition: byteswap.hh:177
const int numFillInsts
Definition: handlers.hh:42
Addr programHeaderTable()
Definition: elf_object.hh:129
Bitfield< 7 > i
Definition: miscregs.hh:1378
#define panic(...)
Definition: misc.hh:153
std::vector< ContextID > contextIds
Definition: process.hh:168
void initState()
initState() is called on each SimObject when not restoring from a checkpoint.
Definition: process.cc:107
uint32_t MachInst
Definition: types.hh:41
void argsInit(int pageSize)
Definition: process.cc:186
void allocateMem(Addr vaddr, int64_t size, bool clobber=false)
Definition: process.cc:310
SparcProcess(ProcessParams *params, ObjectFile *objFile, Addr _StackBias)
Definition: process.cc:56
virtual MiscReg readMiscRegNoEffect(int misc_reg) const =0
SETranslatingPortProxy initVirtMem
Definition: process.hh:180
void initState()
initState() is called on each SimObject when not restoring from a checkpoint.
Definition: process.cc:171
uint64_t uid()
Definition: process.hh:83
const MachInst fillHandler64[numFillInsts]
Definition: handlers.hh:45
Bitfield< 0 > sp
Definition: miscregs.hh:1386
virtual void setMiscReg(int misc_reg, const MiscReg &val)=0
virtual void setIntReg(int reg_idx, uint64_t val)=0
SparcISA::IntReg getSyscallArg(ThreadContext *tc, int &i)
Definition: process.cc:507
void initState() override
initState() is called on each SimObject when not restoring from a checkpoint.
Definition: process.cc:288
virtual TheISA::PCState pcState()=0
MMU Internal Registers.
Definition: miscregs.hh:89
const Addr StackBias
Definition: process.hh:49
T roundUp(const T &val, const U &align)
Definition: intmath.hh:205
std::shared_ptr< MemState > memState
Definition: process.hh:206
const Addr PageBytes
Definition: isa_traits.hh:59
ThreadContext is the external interface to all thread state for anything outside of the CPU...
STL vector class.
Definition: stl.hh:40
Bitfield< 63 > val
Definition: misc.hh:770
uint32_t MachInst
Definition: types.hh:40
Addr pc() const
Definition: types.hh:138
#define warn(...)
Definition: misc.hh:219
void flushWindows(ThreadContext *tc)
Definition: process.cc:472
virtual uint64_t readIntReg(int reg_idx)=0
int64_t returnValue() const
The return value.
uint64_t _pid
Definition: process.hh:195
const int numSpillInsts
Definition: handlers.hh:43
void setSyscallReturn(ThreadContext *tc, SyscallReturn return_value)
Definition: process.cc:535
uint64_t euid()
Definition: process.hh:84
int errnoValue() const
The errno value.
virtual void flushWindows(ThreadContext *tc)=0
Addr getStartPC()
Definition: process.cc:482
SparcISA::IntReg getSyscallArg(ThreadContext *tc, int &i)
Definition: process.cc:521
System * system
Definition: process.hh:171
const RegIndex StackPointerReg
Definition: registers.hh:79
T roundDown(const T &val, const U &align)
Definition: intmath.hh:213
Addr entryPoint() const
Definition: object_file.hh:134
virtual SETranslatingPortProxy & getMemProxy()=0
Addr spillStart
Definition: process.hh:52
std::vector< std::string > envp
Definition: process.hh:184
ThreadContext * getThreadContext(ContextID tid)
Definition: system.hh:203
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition: types.hh:142
virtual bool loadSections(PortProxy &mem_proxy, Addr mask=maxAddr, Addr offset=0)
Definition: object_file.cc:93
const MachInst spillHandler32[numSpillInsts]
Definition: handlers.hh:153
void argsInit(int intSize, int pageSize)
Definition: process.cc:426
const MachInst fillHandler32[numFillInsts]
Definition: handlers.hh:81
const Addr PageBytes
Definition: isa_traits.hh:52
Ancillary State Registers.
Definition: miscregs.hh:45
uint16_t programHeaderSize()
Definition: elf_object.hh:130
void copyStringArray(std::vector< std::string > &strings, AddrType array_ptr, AddrType data_ptr, SETranslatingPortProxy &memProxy)
Definition: process_impl.hh:43
virtual MiscReg readMiscReg(int misc_reg)=0
void writeString(Addr addr, const char *str) const
Addr fillStart
Definition: process.hh:52
const int NumIntArchRegs
Definition: registers.hh:91
Declarations of a non-full system Page Table.
uint16_t programHeaderCount()
Definition: elf_object.hh:131
static const int FirstArgumentReg
Definition: process.cc:53
void flushWindows(ThreadContext *tc)
Definition: process.cc:437
void updateBias()
Definition: process.cc:442
virtual void handleTrap(int trapNum, ThreadContext *tc, Fault *fault)
Definition: process.cc:66
const int NWindows
Definition: sparc_traits.hh:43
uint64_t MiscReg
Definition: registers.hh:48
void initState()
initState() is called on each SimObject when not restoring from a checkpoint.
Definition: process.cc:156
uint64_t gid()
Definition: process.hh:85
void argsInit(int intSize, int pageSize)
Definition: process.cc:414
IntReg pc
Definition: remote_gdb.hh:91
const RegIndex ReturnValueReg
Definition: registers.hh:83
uint64_t IntReg
Definition: registers.hh:47
std::vector< std::string > argv
Definition: process.hh:183
This class represents the return value from an emulated system call, including any errno setting...
void setSyscallArg(ThreadContext *tc, int i, SparcISA::IntReg val)
Definition: process.cc:514
T bits(T val, int first, int last)
Extract the bitfield from position 'first' to 'last' (inclusive) from 'val' and right justify it...
Definition: bitfield.hh:67
virtual void setMiscRegNoEffect(int misc_reg, const MiscReg &val)=0
bool successful() const
Was the system call successful?
Bitfield< 1 > x
Definition: types.hh:105
std::shared_ptr< FaultBase > Fault
Definition: types.hh:184
bool tryWriteBlob(Addr addr, const uint8_t *p, int size) const
Addr getBias()
Definition: process.cc:474
const MachInst spillHandler64[numSpillInsts]
Definition: handlers.hh:117
uint64_t egid()
Definition: process.hh:86
virtual void writeBlob(Addr addr, const uint8_t *p, int size) const
Write size bytes from p to address.
Floating Point Status Register.
Definition: miscregs.hh:86

Generated on Fri Jun 9 2017 13:03:35 for gem5 by doxygen 1.8.6