Fix some issues with 32 bit processes.
--HG-- extra : convert_revision : b01b38bbf185f2279134db4976a9bdb3e381a670
This commit is contained in:
parent
4b4b46ea90
commit
477afcaf5b
3 changed files with 41 additions and 49 deletions
|
@ -425,7 +425,9 @@ Sparc32LiveProcess::argsInit(int intSize, int pageSize)
|
||||||
else
|
else
|
||||||
filename = argv[0];
|
filename = argv[0];
|
||||||
|
|
||||||
Addr alignmentMask = ~(intSize - 1);
|
//Even though this is a 32 bit process, the ABI says we still need to
|
||||||
|
//maintain double word alignment of the stack pointer.
|
||||||
|
Addr alignmentMask = ~(8 - 1);
|
||||||
|
|
||||||
// load object file into target memory
|
// load object file into target memory
|
||||||
objFile->loadSections(initVirtMem);
|
objFile->loadSections(initVirtMem);
|
||||||
|
@ -525,21 +527,11 @@ Sparc32LiveProcess::argsInit(int intSize, int pageSize)
|
||||||
arg_data_size += argv[i].size() + 1;
|
arg_data_size += argv[i].size() + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
//The info_block needs to be padded so it's size is a multiple of the
|
//The info_block
|
||||||
//alignment mask. Also, it appears that there needs to be at least some
|
|
||||||
//padding, so if the size is already a multiple, we need to increase it
|
|
||||||
//anyway.
|
|
||||||
int info_block_size =
|
int info_block_size =
|
||||||
(file_name_size +
|
(file_name_size +
|
||||||
env_data_size +
|
env_data_size +
|
||||||
arg_data_size +
|
arg_data_size);
|
||||||
intSize) & alignmentMask;
|
|
||||||
|
|
||||||
int info_block_padding =
|
|
||||||
info_block_size -
|
|
||||||
file_name_size -
|
|
||||||
env_data_size -
|
|
||||||
arg_data_size;
|
|
||||||
|
|
||||||
//Each auxilliary vector is two 8 byte words
|
//Each auxilliary vector is two 8 byte words
|
||||||
int aux_array_size = intSize * 2 * (auxv.size() + 1);
|
int aux_array_size = intSize * 2 * (auxv.size() + 1);
|
||||||
|
@ -552,7 +544,6 @@ Sparc32LiveProcess::argsInit(int intSize, int pageSize)
|
||||||
|
|
||||||
int space_needed =
|
int space_needed =
|
||||||
mysterious_size +
|
mysterious_size +
|
||||||
info_block_size +
|
|
||||||
aux_array_size +
|
aux_array_size +
|
||||||
envp_array_size +
|
envp_array_size +
|
||||||
argv_array_size +
|
argv_array_size +
|
||||||
|
@ -568,18 +559,17 @@ Sparc32LiveProcess::argsInit(int intSize, int pageSize)
|
||||||
roundUp(stack_size, pageSize));
|
roundUp(stack_size, pageSize));
|
||||||
|
|
||||||
// map out initial stack contents
|
// map out initial stack contents
|
||||||
Addr mysterious_base = stack_base - mysterious_size;
|
uint32_t window_save_base = stack_min;
|
||||||
Addr file_name_base = mysterious_base - file_name_size;
|
uint32_t argc_base = window_save_base + window_save_size;
|
||||||
Addr env_data_base = file_name_base - env_data_size;
|
uint32_t argv_array_base = argc_base + argc_size;
|
||||||
Addr arg_data_base = env_data_base - arg_data_size;
|
uint32_t envp_array_base = argv_array_base + argv_array_size;
|
||||||
Addr auxv_array_base = arg_data_base - aux_array_size - info_block_padding;
|
uint32_t auxv_array_base = envp_array_base + envp_array_size;
|
||||||
Addr envp_array_base = auxv_array_base - envp_array_size;
|
//The info block is pushed up against the top of the stack, while
|
||||||
Addr argv_array_base = envp_array_base - argv_array_size;
|
//the rest of the initial stack frame is aligned to an 8 byte boudary.
|
||||||
Addr argc_base = argv_array_base - argc_size;
|
uint32_t arg_data_base = stack_base - info_block_size;
|
||||||
#ifndef NDEBUG
|
uint32_t env_data_base = arg_data_base + arg_data_size;
|
||||||
// only used in DPRINTF
|
uint32_t file_name_base = env_data_base + env_data_size;
|
||||||
Addr window_save_base = argc_base - window_save_size;
|
uint32_t mysterious_base = file_name_base + file_name_size;
|
||||||
#endif
|
|
||||||
|
|
||||||
DPRINTF(Sparc, "The addresses of items on the initial stack:\n");
|
DPRINTF(Sparc, "The addresses of items on the initial stack:\n");
|
||||||
DPRINTF(Sparc, "0x%x - file name\n", file_name_base);
|
DPRINTF(Sparc, "0x%x - file name\n", file_name_base);
|
||||||
|
@ -619,8 +609,8 @@ Sparc32LiveProcess::argsInit(int intSize, int pageSize)
|
||||||
initVirtMem->writeBlob(auxv_array_base + 2 * intSize * auxv.size(),
|
initVirtMem->writeBlob(auxv_array_base + 2 * intSize * auxv.size(),
|
||||||
(uint8_t*)&zero, 2 * intSize);
|
(uint8_t*)&zero, 2 * intSize);
|
||||||
|
|
||||||
copyStringArray(envp, envp_array_base, env_data_base, initVirtMem, intSize);
|
copyStringArray(envp, envp_array_base, env_data_base, initVirtMem);
|
||||||
copyStringArray(argv, argv_array_base, arg_data_base, initVirtMem, intSize);
|
copyStringArray(argv, argv_array_base, arg_data_base, initVirtMem);
|
||||||
|
|
||||||
initVirtMem->writeBlob(argc_base, (uint8_t*)&guestArgc, intSize);
|
initVirtMem->writeBlob(argc_base, (uint8_t*)&guestArgc, intSize);
|
||||||
|
|
||||||
|
@ -639,7 +629,7 @@ Sparc32LiveProcess::argsInit(int intSize, int pageSize)
|
||||||
threadContexts[0]->setIntReg(ArgumentReg1, argv_array_base);
|
threadContexts[0]->setIntReg(ArgumentReg1, argv_array_base);
|
||||||
threadContexts[0]->setIntReg(StackPointerReg, stack_min);
|
threadContexts[0]->setIntReg(StackPointerReg, stack_min);
|
||||||
|
|
||||||
Addr prog_entry = objFile->entryPoint();
|
uint32_t prog_entry = objFile->entryPoint();
|
||||||
threadContexts[0]->setPC(prog_entry);
|
threadContexts[0]->setPC(prog_entry);
|
||||||
threadContexts[0]->setNextPC(prog_entry + sizeof(MachInst));
|
threadContexts[0]->setNextPC(prog_entry + sizeof(MachInst));
|
||||||
threadContexts[0]->setNextNPC(prog_entry + (2 * sizeof(MachInst)));
|
threadContexts[0]->setNextNPC(prog_entry + (2 * sizeof(MachInst)));
|
||||||
|
|
|
@ -300,24 +300,6 @@ DEFINE_SIM_OBJECT_CLASS_NAME("Process", Process)
|
||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
copyStringArray(vector<string> &strings, Addr array_ptr, Addr data_ptr,
|
|
||||||
TranslatingPort* memPort, int ptr_size)
|
|
||||||
{
|
|
||||||
Addr data_ptr_swap;
|
|
||||||
for (int i = 0; i < strings.size(); ++i) {
|
|
||||||
data_ptr_swap = htog(data_ptr);
|
|
||||||
memPort->writeBlob(array_ptr, (uint8_t*)&data_ptr_swap, ptr_size);
|
|
||||||
memPort->writeString(data_ptr, strings[i].c_str());
|
|
||||||
array_ptr += ptr_size;
|
|
||||||
data_ptr += strings[i].size() + 1;
|
|
||||||
}
|
|
||||||
// add NULL terminator
|
|
||||||
data_ptr = 0;
|
|
||||||
|
|
||||||
memPort->writeBlob(array_ptr, (uint8_t*)&data_ptr, ptr_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
LiveProcess::LiveProcess(const string &nm, ObjectFile *_objFile,
|
LiveProcess::LiveProcess(const string &nm, ObjectFile *_objFile,
|
||||||
System *_system,
|
System *_system,
|
||||||
int stdin_fd, int stdout_fd, int stderr_fd,
|
int stdin_fd, int stdout_fd, int stderr_fd,
|
||||||
|
|
|
@ -41,9 +41,11 @@
|
||||||
|
|
||||||
#if !FULL_SYSTEM
|
#if !FULL_SYSTEM
|
||||||
|
|
||||||
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "base/statistics.hh"
|
#include "base/statistics.hh"
|
||||||
|
#include "mem/translating_port.hh"
|
||||||
#include "sim/host.hh"
|
#include "sim/host.hh"
|
||||||
#include "sim/sim_object.hh"
|
#include "sim/sim_object.hh"
|
||||||
|
|
||||||
|
@ -58,9 +60,27 @@ namespace TheISA
|
||||||
class RemoteGDB;
|
class RemoteGDB;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//This needs to be templated for cases where 32 bit pointers are needed.
|
||||||
|
template<class AddrType>
|
||||||
void
|
void
|
||||||
copyStringArray(std::vector<std::string> &strings, Addr array_ptr,
|
copyStringArray(std::vector<std::string> &strings,
|
||||||
Addr data_ptr, TranslatingPort* memPort, int ptr_size = sizeof(Addr));
|
AddrType array_ptr, AddrType data_ptr,
|
||||||
|
TranslatingPort* memPort)
|
||||||
|
{
|
||||||
|
AddrType data_ptr_swap;
|
||||||
|
for (int i = 0; i < strings.size(); ++i) {
|
||||||
|
data_ptr_swap = htog(data_ptr);
|
||||||
|
memPort->writeBlob(array_ptr, (uint8_t*)&data_ptr_swap,
|
||||||
|
sizeof(AddrType));
|
||||||
|
memPort->writeString(data_ptr, strings[i].c_str());
|
||||||
|
array_ptr += sizeof(AddrType);
|
||||||
|
data_ptr += strings[i].size() + 1;
|
||||||
|
}
|
||||||
|
// add NULL terminator
|
||||||
|
data_ptr = 0;
|
||||||
|
|
||||||
|
memPort->writeBlob(array_ptr, (uint8_t*)&data_ptr, sizeof(AddrType));
|
||||||
|
}
|
||||||
|
|
||||||
class Process : public SimObject
|
class Process : public SimObject
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue