1/* 2 * Copyright (c) 2004-2005 The Regents of The University of Michigan 3 * Copyright (c) 2016 The University of Virginia 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 --- 125 unchanged lines hidden (view full) --- 134 Addr stack_top = memState->getStackMin(); 135 stack_top -= RandomBytes; 136 for (const string& arg: argv) 137 stack_top -= arg.size() + 1; 138 for (const string& env: envp) 139 stack_top -= env.size() + 1; 140 stack_top &= -addrSize; 141 |
142 vector<AuxVector<IntType>> auxv; |
143 if (elfObject != nullptr) { |
144 auxv.emplace_back(M5_AT_ENTRY, objFile->entryPoint()); 145 auxv.emplace_back(M5_AT_PHNUM, elfObject->programHeaderCount()); 146 auxv.emplace_back(M5_AT_PHENT, elfObject->programHeaderSize()); 147 auxv.emplace_back(M5_AT_PHDR, elfObject->programHeaderTable()); 148 auxv.emplace_back(M5_AT_PAGESZ, PageBytes); 149 auxv.emplace_back(M5_AT_SECURE, 0); 150 auxv.emplace_back(M5_AT_RANDOM, stack_top); 151 auxv.emplace_back(M5_AT_NULL, 0); |
152 } 153 stack_top -= (1 + argv.size()) * addrSize + 154 (1 + envp.size()) * addrSize + 155 addrSize + 2 * sizeof(IntType) * auxv.size(); 156 stack_top &= -2*addrSize; 157 memState->setStackSize(memState->getStackBase() - stack_top); 158 allocateMem(roundDown(stack_top, pageSize), 159 roundUp(memState->getStackSize(), pageSize)); --- 34 unchanged lines hidden (view full) --- 194 // Align stack 195 memState->setStackMin(memState->getStackMin() & -addrSize); 196 197 // Calculate bottom of stack 198 memState->setStackMin(memState->getStackMin() - 199 ((1 + argv.size()) * addrSize + 200 (1 + envp.size()) * addrSize + 201 addrSize + 2 * sizeof(IntType) * auxv.size())); |
202 memState->setStackMin(memState->getStackMin() & (-2 * addrSize)); |
203 Addr sp = memState->getStackMin(); 204 const auto pushOntoStack = |
205 [this, &sp](IntType data) { 206 initVirtMem.write(sp, data, GuestByteOrder); 207 sp += sizeof(data); |
208 }; 209 210 // Push argc and argv pointers onto stack |
211 IntType argc = argv.size(); 212 DPRINTF(Stack, "Wrote argc %d to address %#x\n", argc, sp); 213 pushOntoStack(argc); 214 |
215 for (const Addr& argPointer: argPointers) { |
216 DPRINTF(Stack, "Wrote argv pointer %#x to address %#x\n", 217 argPointer, sp); 218 pushOntoStack(argPointer); |
219 } 220 221 // Push env pointers onto stack 222 for (const Addr& envPointer: envPointers) { |
223 DPRINTF(Stack, "Wrote envp pointer %#x to address %#x\n", 224 envPointer, sp); 225 pushOntoStack(envPointer); |
226 } 227 228 // Push aux vector onto stack 229 std::map<IntType, string> aux_keys = { 230 {M5_AT_ENTRY, "M5_AT_ENTRY"}, 231 {M5_AT_PHNUM, "M5_AT_PHNUM"}, 232 {M5_AT_PHENT, "M5_AT_PHENT"}, 233 {M5_AT_PHDR, "M5_AT_PHDR"}, 234 {M5_AT_PAGESZ, "M5_AT_PAGESZ"}, 235 {M5_AT_SECURE, "M5_AT_SECURE"}, 236 {M5_AT_RANDOM, "M5_AT_RANDOM"}, 237 {M5_AT_NULL, "M5_AT_NULL"} 238 }; |
239 for (const auto &aux: auxv) { 240 DPRINTF(Stack, "Wrote aux key %s to address %#x\n", 241 aux_keys[aux.type], sp); 242 pushOntoStack(aux.type); 243 DPRINTF(Stack, "Wrote aux value %x to address %#x\n", aux.val, sp); 244 pushOntoStack(aux.val); |
245 } 246 247 ThreadContext *tc = system->getThreadContext(contextIds[0]); 248 tc->setIntReg(StackPointerReg, memState->getStackMin()); 249 tc->pcState(getStartPC()); 250 251 memState->setStackMin(roundDown(memState->getStackMin(), pageSize)); 252} --- 30 unchanged lines hidden --- |