process.cc (11886:43b882cada33) process.cc (11905:4a771f8756ad)
1/*
2 * Copyright (c) 2007-2008 The Florida State University
3 * Copyright (c) 2009 The University of Edinburgh
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are
8 * met: redistributions of source code must retain the above copyright

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

46#include "sim/system.hh"
47
48using namespace std;
49using namespace PowerISA;
50
51PowerProcess::PowerProcess(ProcessParams *params, ObjectFile *objFile)
52 : Process(params, objFile)
53{
1/*
2 * Copyright (c) 2007-2008 The Florida State University
3 * Copyright (c) 2009 The University of Edinburgh
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are
8 * met: redistributions of source code must retain the above copyright

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

46#include "sim/system.hh"
47
48using namespace std;
49using namespace PowerISA;
50
51PowerProcess::PowerProcess(ProcessParams *params, ObjectFile *objFile)
52 : Process(params, objFile)
53{
54 memState->stackBase = 0xbf000000L;
54 // Set up break point (Top of Heap)
55 Addr brk_point = objFile->dataBase() + objFile->dataSize() +
56 objFile->bssSize();
57 brk_point = roundUp(brk_point, PageBytes);
55
58
56 // Set pointer for next thread stack. Reserve 8M for main stack.
57 memState->nextThreadStackBase = memState->stackBase - (8 * 1024 * 1024);
59 Addr stack_base = 0xbf000000L;
58
60
59 // Set up break point (Top of Heap)
60 memState->brkPoint = objFile->dataBase() + objFile->dataSize() +
61 objFile->bssSize();
62 memState->brkPoint = roundUp(memState->brkPoint, PageBytes);
61 Addr max_stack_size = 8 * 1024 * 1024;
63
62
63 // Set pointer for next thread stack. Reserve 8M for main stack.
64 Addr next_thread_stack_base = stack_base - max_stack_size;
65
64 // Set up region for mmaps. For now, start at bottom of kuseg space.
66 // Set up region for mmaps. For now, start at bottom of kuseg space.
65 memState->mmapEnd = 0x70000000L;
67 Addr mmap_end = 0x70000000L;
68
69 memState = make_shared<MemState>(brk_point, stack_base, max_stack_size,
70 next_thread_stack_base, mmap_end);
66}
67
68void
69PowerProcess::initState()
70{
71 Process::initState();
72
73 argsInit(MachineBytes, PageBytes);

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

181 //There needs to be padding after the auxiliary vector data so that the
182 //very bottom of the stack is aligned properly.
183 int partial_size = frame_size;
184 int aligned_partial_size = roundUp(partial_size, align);
185 int aux_padding = aligned_partial_size - partial_size;
186
187 int space_needed = frame_size + aux_padding;
188
71}
72
73void
74PowerProcess::initState()
75{
76 Process::initState();
77
78 argsInit(MachineBytes, PageBytes);

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

186 //There needs to be padding after the auxiliary vector data so that the
187 //very bottom of the stack is aligned properly.
188 int partial_size = frame_size;
189 int aligned_partial_size = roundUp(partial_size, align);
190 int aux_padding = aligned_partial_size - partial_size;
191
192 int space_needed = frame_size + aux_padding;
193
189 memState->stackMin = memState->stackBase - space_needed;
190 memState->stackMin = roundDown(memState->stackMin, align);
191 memState->stackSize = memState->stackBase - memState->stackMin;
194 Addr stack_min = memState->getStackBase() - space_needed;
195 stack_min = roundDown(stack_min, align);
192
196
197 memState->setStackSize(memState->getStackBase() - stack_min);
198
193 // map memory
199 // map memory
194 allocateMem(roundDown(memState->stackMin, pageSize),
195 roundUp(memState->stackSize, pageSize));
200 allocateMem(roundDown(stack_min, pageSize),
201 roundUp(memState->getStackSize(), pageSize));
196
197 // map out initial stack contents
202
203 // map out initial stack contents
198 uint32_t sentry_base = memState->stackBase - sentry_size;
204 uint32_t sentry_base = memState->getStackBase() - sentry_size;
199 uint32_t aux_data_base = sentry_base - aux_data_size;
200 uint32_t env_data_base = aux_data_base - env_data_size;
201 uint32_t arg_data_base = env_data_base - arg_data_size;
202 uint32_t platform_base = arg_data_base - platform_size;
203 uint32_t auxv_array_base = platform_base - aux_array_size - aux_padding;
204 uint32_t envp_array_base = auxv_array_base - envp_array_size;
205 uint32_t argv_array_base = envp_array_base - argv_array_size;
206 uint32_t argc_base = argv_array_base - argc_size;
207
208 DPRINTF(Stack, "The addresses of items on the initial stack:\n");
209 DPRINTF(Stack, "0x%x - aux data\n", aux_data_base);
210 DPRINTF(Stack, "0x%x - env data\n", env_data_base);
211 DPRINTF(Stack, "0x%x - arg data\n", arg_data_base);
212 DPRINTF(Stack, "0x%x - platform base\n", platform_base);
213 DPRINTF(Stack, "0x%x - auxv array\n", auxv_array_base);
214 DPRINTF(Stack, "0x%x - envp array\n", envp_array_base);
215 DPRINTF(Stack, "0x%x - argv array\n", argv_array_base);
216 DPRINTF(Stack, "0x%x - argc \n", argc_base);
205 uint32_t aux_data_base = sentry_base - aux_data_size;
206 uint32_t env_data_base = aux_data_base - env_data_size;
207 uint32_t arg_data_base = env_data_base - arg_data_size;
208 uint32_t platform_base = arg_data_base - platform_size;
209 uint32_t auxv_array_base = platform_base - aux_array_size - aux_padding;
210 uint32_t envp_array_base = auxv_array_base - envp_array_size;
211 uint32_t argv_array_base = envp_array_base - argv_array_size;
212 uint32_t argc_base = argv_array_base - argc_size;
213
214 DPRINTF(Stack, "The addresses of items on the initial stack:\n");
215 DPRINTF(Stack, "0x%x - aux data\n", aux_data_base);
216 DPRINTF(Stack, "0x%x - env data\n", env_data_base);
217 DPRINTF(Stack, "0x%x - arg data\n", arg_data_base);
218 DPRINTF(Stack, "0x%x - platform base\n", platform_base);
219 DPRINTF(Stack, "0x%x - auxv array\n", auxv_array_base);
220 DPRINTF(Stack, "0x%x - envp array\n", envp_array_base);
221 DPRINTF(Stack, "0x%x - argv array\n", argv_array_base);
222 DPRINTF(Stack, "0x%x - argc \n", argc_base);
217 DPRINTF(Stack, "0x%x - stack min\n", memState->stackMin);
223 DPRINTF(Stack, "0x%x - stack min\n", stack_min);
218
219 // write contents to stack
220
221 // figure out argc
222 uint32_t argc = argv.size();
223 uint32_t guestArgc = PowerISA::htog(argc);
224
225 //Write out the sentry void *

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

254 copyStringArray(envp, envp_array_base, env_data_base, initVirtMem);
255 copyStringArray(argv, argv_array_base, arg_data_base, initVirtMem);
256
257 initVirtMem.writeBlob(argc_base, (uint8_t*)&guestArgc, intSize);
258
259 ThreadContext *tc = system->getThreadContext(contextIds[0]);
260
261 //Set the stack pointer register
224
225 // write contents to stack
226
227 // figure out argc
228 uint32_t argc = argv.size();
229 uint32_t guestArgc = PowerISA::htog(argc);
230
231 //Write out the sentry void *

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

260 copyStringArray(envp, envp_array_base, env_data_base, initVirtMem);
261 copyStringArray(argv, argv_array_base, arg_data_base, initVirtMem);
262
263 initVirtMem.writeBlob(argc_base, (uint8_t*)&guestArgc, intSize);
264
265 ThreadContext *tc = system->getThreadContext(contextIds[0]);
266
267 //Set the stack pointer register
262 tc->setIntReg(StackPointerReg, memState->stackMin);
268 tc->setIntReg(StackPointerReg, stack_min);
263
264 tc->pcState(getStartPC());
265
266 //Align the "stack_min" to a page boundary.
269
270 tc->pcState(getStartPC());
271
272 //Align the "stack_min" to a page boundary.
267 memState->stackMin = roundDown(memState->stackMin, pageSize);
273 memState->setStackMin(roundDown(stack_min, pageSize));
268}
269
270PowerISA::IntReg
271PowerProcess::getSyscallArg(ThreadContext *tc, int &i)
272{
273 assert(i < 5);
274 return tc->readIntReg(ArgumentReg0 + i++);
275}

--- 20 unchanged lines hidden ---
274}
275
276PowerISA::IntReg
277PowerProcess::getSyscallArg(ThreadContext *tc, int &i)
278{
279 assert(i < 5);
280 return tc->readIntReg(ArgumentReg0 + i++);
281}

--- 20 unchanged lines hidden ---