process.cc (4164:c4a2eeafec9e) process.cc (4172:141705d83494)
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;

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

83void
84Sparc32LiveProcess::startup()
85{
86 argsInit(32 / 8, VMPageSize);
87
88 //From the SPARC ABI
89
90 //The process runs in user mode
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;

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

83void
84Sparc32LiveProcess::startup()
85{
86 argsInit(32 / 8, VMPageSize);
87
88 //From the SPARC ABI
89
90 //The process runs in user mode
91 threadContexts[0]->setMiscRegWithEffect(MISCREG_PSTATE, 0x02);
91 threadContexts[0]->setMiscReg(MISCREG_PSTATE, 0x02);
92
93 //Setup default FP state
92
93 //Setup default FP state
94 threadContexts[0]->setMiscReg(MISCREG_FSR, 0);
94 threadContexts[0]->setMiscRegNoEffect(MISCREG_FSR, 0);
95
95
96 threadContexts[0]->setMiscReg(MISCREG_TICK, 0);
96 threadContexts[0]->setMiscRegNoEffect(MISCREG_TICK, 0);
97 //
98 /*
99 * Register window management registers
100 */
101
102 //No windows contain info from other programs
97 //
98 /*
99 * Register window management registers
100 */
101
102 //No windows contain info from other programs
103 //threadContexts[0]->setMiscReg(MISCREG_OTHERWIN, 0);
103 //threadContexts[0]->setMiscRegNoEffect(MISCREG_OTHERWIN, 0);
104 threadContexts[0]->setIntReg(NumIntArchRegs + 6, 0);
105 //There are no windows to pop
104 threadContexts[0]->setIntReg(NumIntArchRegs + 6, 0);
105 //There are no windows to pop
106 //threadContexts[0]->setMiscReg(MISCREG_CANRESTORE, 0);
106 //threadContexts[0]->setMiscRegNoEffect(MISCREG_CANRESTORE, 0);
107 threadContexts[0]->setIntReg(NumIntArchRegs + 4, 0);
108 //All windows are available to save into
107 threadContexts[0]->setIntReg(NumIntArchRegs + 4, 0);
108 //All windows are available to save into
109 //threadContexts[0]->setMiscReg(MISCREG_CANSAVE, NWindows - 2);
109 //threadContexts[0]->setMiscRegNoEffect(MISCREG_CANSAVE, NWindows - 2);
110 threadContexts[0]->setIntReg(NumIntArchRegs + 3, NWindows - 2);
111 //All windows are "clean"
110 threadContexts[0]->setIntReg(NumIntArchRegs + 3, NWindows - 2);
111 //All windows are "clean"
112 //threadContexts[0]->setMiscReg(MISCREG_CLEANWIN, NWindows);
112 //threadContexts[0]->setMiscRegNoEffect(MISCREG_CLEANWIN, NWindows);
113 threadContexts[0]->setIntReg(NumIntArchRegs + 5, NWindows);
114 //Start with register window 0
113 threadContexts[0]->setIntReg(NumIntArchRegs + 5, NWindows);
114 //Start with register window 0
115 threadContexts[0]->setMiscReg(MISCREG_CWP, 0);
115 threadContexts[0]->setMiscRegNoEffect(MISCREG_CWP, 0);
116 //Always use spill and fill traps 0
116 //Always use spill and fill traps 0
117 //threadContexts[0]->setMiscReg(MISCREG_WSTATE, 0);
117 //threadContexts[0]->setMiscRegNoEffect(MISCREG_WSTATE, 0);
118 threadContexts[0]->setIntReg(NumIntArchRegs + 7, 0);
119 //Set the trap level to 0
118 threadContexts[0]->setIntReg(NumIntArchRegs + 7, 0);
119 //Set the trap level to 0
120 threadContexts[0]->setMiscReg(MISCREG_TL, 0);
120 threadContexts[0]->setMiscRegNoEffect(MISCREG_TL, 0);
121 //Set the ASI register to something fixed
121 //Set the ASI register to something fixed
122 threadContexts[0]->setMiscReg(MISCREG_ASI, ASI_PRIMARY);
122 threadContexts[0]->setMiscRegNoEffect(MISCREG_ASI, ASI_PRIMARY);
123}
124
125void
126Sparc64LiveProcess::startup()
127{
128 argsInit(sizeof(IntReg), VMPageSize);
129
130 //From the SPARC ABI
131
132 //The process runs in user mode
123}
124
125void
126Sparc64LiveProcess::startup()
127{
128 argsInit(sizeof(IntReg), VMPageSize);
129
130 //From the SPARC ABI
131
132 //The process runs in user mode
133 threadContexts[0]->setMiscRegWithEffect(MISCREG_PSTATE, 0x02);
133 threadContexts[0]->setMiscReg(MISCREG_PSTATE, 0x02);
134
135 //Setup default FP state
134
135 //Setup default FP state
136 threadContexts[0]->setMiscReg(MISCREG_FSR, 0);
136 threadContexts[0]->setMiscRegNoEffect(MISCREG_FSR, 0);
137
137
138 threadContexts[0]->setMiscReg(MISCREG_TICK, 0);
138 threadContexts[0]->setMiscRegNoEffect(MISCREG_TICK, 0);
139 //
140 /*
141 * Register window management registers
142 */
143
144 //No windows contain info from other programs
139 //
140 /*
141 * Register window management registers
142 */
143
144 //No windows contain info from other programs
145 //threadContexts[0]->setMiscReg(MISCREG_OTHERWIN, 0);
145 //threadContexts[0]->setMiscRegNoEffect(MISCREG_OTHERWIN, 0);
146 threadContexts[0]->setIntReg(NumIntArchRegs + 6, 0);
147 //There are no windows to pop
146 threadContexts[0]->setIntReg(NumIntArchRegs + 6, 0);
147 //There are no windows to pop
148 //threadContexts[0]->setMiscReg(MISCREG_CANRESTORE, 0);
148 //threadContexts[0]->setMiscRegNoEffect(MISCREG_CANRESTORE, 0);
149 threadContexts[0]->setIntReg(NumIntArchRegs + 4, 0);
150 //All windows are available to save into
149 threadContexts[0]->setIntReg(NumIntArchRegs + 4, 0);
150 //All windows are available to save into
151 //threadContexts[0]->setMiscReg(MISCREG_CANSAVE, NWindows - 2);
151 //threadContexts[0]->setMiscRegNoEffect(MISCREG_CANSAVE, NWindows - 2);
152 threadContexts[0]->setIntReg(NumIntArchRegs + 3, NWindows - 2);
153 //All windows are "clean"
152 threadContexts[0]->setIntReg(NumIntArchRegs + 3, NWindows - 2);
153 //All windows are "clean"
154 //threadContexts[0]->setMiscReg(MISCREG_CLEANWIN, NWindows);
154 //threadContexts[0]->setMiscRegNoEffect(MISCREG_CLEANWIN, NWindows);
155 threadContexts[0]->setIntReg(NumIntArchRegs + 5, NWindows);
156 //Start with register window 0
155 threadContexts[0]->setIntReg(NumIntArchRegs + 5, NWindows);
156 //Start with register window 0
157 threadContexts[0]->setMiscReg(MISCREG_CWP, 0);
157 threadContexts[0]->setMiscRegNoEffect(MISCREG_CWP, 0);
158 //Always use spill and fill traps 0
158 //Always use spill and fill traps 0
159 //threadContexts[0]->setMiscReg(MISCREG_WSTATE, 0);
159 //threadContexts[0]->setMiscRegNoEffect(MISCREG_WSTATE, 0);
160 threadContexts[0]->setIntReg(NumIntArchRegs + 7, 0);
161 //Set the trap level to 0
160 threadContexts[0]->setIntReg(NumIntArchRegs + 7, 0);
161 //Set the trap level to 0
162 threadContexts[0]->setMiscReg(MISCREG_TL, 0);
162 threadContexts[0]->setMiscRegNoEffect(MISCREG_TL, 0);
163 //Set the ASI register to something fixed
163 //Set the ASI register to something fixed
164 threadContexts[0]->setMiscReg(MISCREG_ASI, ASI_PRIMARY);
164 threadContexts[0]->setMiscRegNoEffect(MISCREG_ASI, ASI_PRIMARY);
165}
166
167M5_32_auxv_t::M5_32_auxv_t(int32_t type, int32_t val)
168{
169 a_type = TheISA::htog(type);
170 a_val = TheISA::htog(val);
171}
172

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

506 auxv.push_back(auxv_t(SPARC_AT_GID, gid()));
507 auxv.push_back(auxv_t(SPARC_AT_EGID, egid()));
508 //Whether to enable "secure mode" in the executable
509 auxv.push_back(auxv_t(SPARC_AT_SECURE, 0));
510 }
511
512 //Figure out how big the initial stack needs to be
513
165}
166
167M5_32_auxv_t::M5_32_auxv_t(int32_t type, int32_t val)
168{
169 a_type = TheISA::htog(type);
170 a_val = TheISA::htog(val);
171}
172

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

506 auxv.push_back(auxv_t(SPARC_AT_GID, gid()));
507 auxv.push_back(auxv_t(SPARC_AT_EGID, egid()));
508 //Whether to enable "secure mode" in the executable
509 auxv.push_back(auxv_t(SPARC_AT_SECURE, 0));
510 }
511
512 //Figure out how big the initial stack needs to be
513
514 // The unaccounted for 8 byte 0 at the top of the stack
515 int mysterious_size = 8;
514 // The unaccounted for 0 at the top of the stack
515 int mysterious_size = intSize;
516
517 //This is the name of the file which is present on the initial stack
518 //It's purpose is to let the user space linker examine the original file.
519 int file_name_size = filename.size() + 1;
520
521 int env_data_size = 0;
522 for (int i = 0; i < envp.size(); ++i) {
523 env_data_size += envp[i].size() + 1;
524 }
525 int arg_data_size = 0;
526 for (int i = 0; i < argv.size(); ++i) {
527 arg_data_size += argv[i].size() + 1;
528 }
529
516
517 //This is the name of the file which is present on the initial stack
518 //It's purpose is to let the user space linker examine the original file.
519 int file_name_size = filename.size() + 1;
520
521 int env_data_size = 0;
522 for (int i = 0; i < envp.size(); ++i) {
523 env_data_size += envp[i].size() + 1;
524 }
525 int arg_data_size = 0;
526 for (int i = 0; i < argv.size(); ++i) {
527 arg_data_size += argv[i].size() + 1;
528 }
529
530 //The info_block - This seems to need an pad for some reason.
530 //The info_block
531 int info_block_size =
531 int info_block_size =
532 (mysterious_size +
533 file_name_size +
532 (file_name_size +
534 env_data_size +
533 env_data_size +
535 arg_data_size + intSize);
534 arg_data_size);
536
535
537 //Each auxilliary vector is two 4 byte words
536 //Each auxilliary vector is two 8 byte words
538 int aux_array_size = intSize * 2 * (auxv.size() + 1);
539
540 int envp_array_size = intSize * (envp.size() + 1);
541 int argv_array_size = intSize * (argv.size() + 1);
542
543 int argc_size = intSize;
544 int window_save_size = intSize * 16;
545
546 int space_needed =
537 int aux_array_size = intSize * 2 * (auxv.size() + 1);
538
539 int envp_array_size = intSize * (envp.size() + 1);
540 int argv_array_size = intSize * (argv.size() + 1);
541
542 int argc_size = intSize;
543 int window_save_size = intSize * 16;
544
545 int space_needed =
547 info_block_size +
546 mysterious_size +
548 aux_array_size +
549 envp_array_size +
550 argv_array_size +
551 argc_size +
552 window_save_size;
553
554 stack_min = stack_base - space_needed;
555 stack_min &= alignmentMask;

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

562 // map out initial stack contents
563 uint32_t window_save_base = stack_min;
564 uint32_t argc_base = window_save_base + window_save_size;
565 uint32_t argv_array_base = argc_base + argc_size;
566 uint32_t envp_array_base = argv_array_base + argv_array_size;
567 uint32_t auxv_array_base = envp_array_base + envp_array_size;
568 //The info block is pushed up against the top of the stack, while
569 //the rest of the initial stack frame is aligned to an 8 byte boudary.
547 aux_array_size +
548 envp_array_size +
549 argv_array_size +
550 argc_size +
551 window_save_size;
552
553 stack_min = stack_base - space_needed;
554 stack_min &= alignmentMask;

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

561 // map out initial stack contents
562 uint32_t window_save_base = stack_min;
563 uint32_t argc_base = window_save_base + window_save_size;
564 uint32_t argv_array_base = argc_base + argc_size;
565 uint32_t envp_array_base = argv_array_base + argv_array_size;
566 uint32_t auxv_array_base = envp_array_base + envp_array_size;
567 //The info block is pushed up against the top of the stack, while
568 //the rest of the initial stack frame is aligned to an 8 byte boudary.
570 uint32_t arg_data_base = stack_base - info_block_size + intSize;
569 uint32_t arg_data_base = stack_base - info_block_size;
571 uint32_t env_data_base = arg_data_base + arg_data_size;
572 uint32_t file_name_base = env_data_base + env_data_size;
573 uint32_t mysterious_base = file_name_base + file_name_size;
574
575 DPRINTF(Sparc, "The addresses of items on the initial stack:\n");
576 DPRINTF(Sparc, "0x%x - file name\n", file_name_base);
577 DPRINTF(Sparc, "0x%x - env data\n", env_data_base);
578 DPRINTF(Sparc, "0x%x - arg data\n", arg_data_base);

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

621 int fillSize = sizeof(MachInst) * numFillInsts;
622 int spillSize = sizeof(MachInst) * numSpillInsts;
623 fillStart = stack_base;
624 spillStart = fillStart + fillSize;
625 initVirtMem->writeBlob(fillStart, (uint8_t*)fillHandler32, fillSize);
626 initVirtMem->writeBlob(spillStart, (uint8_t*)spillHandler32, spillSize);
627
628 //Set up the thread context to start running the process
570 uint32_t env_data_base = arg_data_base + arg_data_size;
571 uint32_t file_name_base = env_data_base + env_data_size;
572 uint32_t mysterious_base = file_name_base + file_name_size;
573
574 DPRINTF(Sparc, "The addresses of items on the initial stack:\n");
575 DPRINTF(Sparc, "0x%x - file name\n", file_name_base);
576 DPRINTF(Sparc, "0x%x - env data\n", env_data_base);
577 DPRINTF(Sparc, "0x%x - arg data\n", arg_data_base);

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

620 int fillSize = sizeof(MachInst) * numFillInsts;
621 int spillSize = sizeof(MachInst) * numSpillInsts;
622 fillStart = stack_base;
623 spillStart = fillStart + fillSize;
624 initVirtMem->writeBlob(fillStart, (uint8_t*)fillHandler32, fillSize);
625 initVirtMem->writeBlob(spillStart, (uint8_t*)spillHandler32, spillSize);
626
627 //Set up the thread context to start running the process
629 //threadContexts[0]->setIntReg(ArgumentReg0, argc);
630 //threadContexts[0]->setIntReg(ArgumentReg1, argv_array_base);
628 threadContexts[0]->setIntReg(ArgumentReg0, argc);
629 threadContexts[0]->setIntReg(ArgumentReg1, argv_array_base);
631 threadContexts[0]->setIntReg(StackPointerReg, stack_min);
632
633 uint32_t prog_entry = objFile->entryPoint();
634 threadContexts[0]->setPC(prog_entry);
635 threadContexts[0]->setNextPC(prog_entry + sizeof(MachInst));
636 threadContexts[0]->setNextNPC(prog_entry + (2 * sizeof(MachInst)));
637
638 //Align the "stack_min" to a page boundary.
639 stack_min = roundDown(stack_min, pageSize);
640
641// num_processes++;
642}
630 threadContexts[0]->setIntReg(StackPointerReg, stack_min);
631
632 uint32_t prog_entry = objFile->entryPoint();
633 threadContexts[0]->setPC(prog_entry);
634 threadContexts[0]->setNextPC(prog_entry + sizeof(MachInst));
635 threadContexts[0]->setNextNPC(prog_entry + (2 * sizeof(MachInst)));
636
637 //Align the "stack_min" to a page boundary.
638 stack_min = roundDown(stack_min, pageSize);
639
640// num_processes++;
641}