80 Addr stack_base = 0xbf000000L;
81 Addr max_stack_size = 8 * 1024 * 1024;
82 Addr next_thread_stack_base = stack_base - max_stack_size;
83 Addr mmap_end = 0x40000000L;
85 memState = std::make_shared<MemState>(
86 this, brk_point, stack_base, max_stack_size,
87 next_thread_stack_base, mmap_end);
96 Addr stack_base = 0x7fffff0000L;
97 Addr max_stack_size = 8 * 1024 * 1024;
98 Addr next_thread_stack_base = stack_base - max_stack_size;
99 Addr mmap_end = 0x4000000000L;
101 memState = std::make_shared<MemState>(
102 this, brk_point, stack_base, max_stack_size,
103 next_thread_stack_base, mmap_end);
185 Arm_Evtstrm = 1 << 2,
191 Arm_Atomics = 1 << 8,
193 Arm_Asimdhp = 1 << 10,
195 Arm_Asimdrdm = 1 << 12,
203 Arm_Asimddp = 1 << 20,
204 Arm_Sha512 = 1 << 21,
206 Arm_Asimdfhm = 1 << 23,
209 Arm_Ilrcpc = 1 << 26,
223 hwcap |= (pf_r0.fp == 0) ? Arm_Fp : 0;
224 hwcap |= (pf_r0.fp == 1) ? Arm_Fphp | Arm_Fp : 0;
225 hwcap |= (pf_r0.advsimd == 0) ? Arm_Asimd : 0;
226 hwcap |= (pf_r0.advsimd == 1) ? Arm_Asimdhp | Arm_Asimd : 0;
227 hwcap |= (pf_r0.sve >= 1) ? Arm_Sve : 0;
228 hwcap |= (pf_r0.dit >= 1) ? Arm_Dit : 0;
232 hwcap |= (isa_r0.aes >= 1) ? Arm_Aes : 0;
233 hwcap |= (isa_r0.aes >= 2) ? Arm_Pmull : 0;
234 hwcap |= (isa_r0.sha1 >= 1) ? Arm_Sha1 : 0;
235 hwcap |= (isa_r0.sha2 >= 1) ? Arm_Sha2 : 0;
236 hwcap |= (isa_r0.sha2 >= 2) ? Arm_Sha512 : 0;
237 hwcap |= (isa_r0.crc32 >= 1) ? Arm_Crc32 : 0;
238 hwcap |= (isa_r0.atomic >= 1) ? Arm_Atomics : 0;
239 hwcap |= (isa_r0.rdm >= 1) ? Arm_Asimdrdm : 0;
240 hwcap |= (isa_r0.sha3 >= 1) ? Arm_Sha3 : 0;
241 hwcap |= (isa_r0.sm3 >= 1) ? Arm_Sm3 : 0;
242 hwcap |= (isa_r0.sm4 >= 1) ? Arm_Sm4 : 0;
243 hwcap |= (isa_r0.dp >= 1) ? Arm_Asimddp : 0;
244 hwcap |= (isa_r0.fhm >= 1) ? Arm_Asimdfhm : 0;
245 hwcap |= (isa_r0.ts >= 1) ? Arm_Flagm : 0;
249 hwcap |= (isa_r1.dpb >= 1) ? Arm_Dcpop : 0;
250 hwcap |= (isa_r1.jscvt >= 1) ? Arm_Jscvt : 0;
251 hwcap |= (isa_r1.fcma >= 1) ? Arm_Fcma : 0;
252 hwcap |= (isa_r1.lrcpc >= 1) ? Arm_Lrcpc : 0;
253 hwcap |= (isa_r1.lrcpc >= 2) ? Arm_Ilrcpc : 0;
254 hwcap |= (isa_r1.apa >= 1 || isa_r1.api >= 1) ? Arm_Paca : 0;
255 hwcap |= (isa_r1.gpa >= 1 || isa_r1.gpi >= 1) ? Arm_Pacg : 0;
259 hwcap |= (mm_fr2.at >= 1) ? Arm_Uscat : 0;
267 enum ArmCpuFeature : uint64_t
270 Arm_Dcpodp = 1ULL << 0,
272 Arm_Sveaes = 1ULL << 2,
273 Arm_Svepmull = 1ULL << 3,
274 Arm_Svebitperm = 1ULL << 4,
275 Arm_Svesha3 = 1ULL << 5,
276 Arm_Svesm4 = 1ULL << 6,
277 Arm_Flagm2 = 1ULL << 7,
278 Arm_Frint = 1ULL << 8,
279 Arm_Svei8mm = 1ULL << 9,
280 Arm_Svef32mm = 1ULL << 10,
281 Arm_Svef64mm = 1ULL << 11,
282 Arm_Svebf16 = 1ULL << 12,
283 Arm_I8mm = 1ULL << 13,
284 Arm_Bf16 = 1ULL << 14,
285 Arm_Dgh = 1ULL << 15,
286 Arm_Rng = 1ULL << 16,
287 Arm_Bti = 1ULL << 17,
288 Arm_Mte = 1ULL << 18,
289 Arm_Ecv = 1ULL << 19,
290 Arm_Afp = 1ULL << 20,
291 Arm_Rpres = 1ULL << 21,
292 Arm_Mte3 = 1ULL << 22,
293 Arm_Sme = 1ULL << 23,
294 Arm_Sme_I16i64 = 1ULL << 24,
295 Arm_Sme_F64f64 = 1ULL << 25,
296 Arm_Sme_I8i32 = 1ULL << 26,
297 Arm_Sme_F16f32 = 1ULL << 27,
298 Arm_Sme_B16f32 = 1ULL << 28,
299 Arm_Sme_F32f32 = 1ULL << 29,
300 Arm_Sme_Fa64 = 1ULL << 30,
301 Arm_Wfxt = 1ULL << 31,
302 Arm_Ebf16 = 1ULL << 32,
303 Arm_Sve_Ebf16 = 1ULL << 33,
304 Arm_Cssc = 1ULL << 34,
305 Arm_Rprfm = 1ULL << 35,
306 Arm_Sve2p1 = 1ULL << 36,
307 Arm_Sme2 = 1ULL << 37,
308 Arm_Sme2p1 = 1ULL << 38,
309 Arm_Sme_I16i32 = 1ULL << 39,
310 Arm_Sme_Bi32i32 = 1ULL << 40,
311 Arm_Sme_B16b16 = 1ULL << 41,
312 Arm_Sme_F16f16 = 1ULL << 42
320 hwcap |= (isa_r0.ts >= 2) ? Arm_Flagm2 : Arm_None;
321 hwcap |= (isa_r0.rndr >= 1) ? Arm_Rng : Arm_None;
324 hwcap |= (isa_r1.i8mm >= 1) ? Arm_I8mm : Arm_None;
327 hwcap |= (zf_r0.f32mm >= 1) ? Arm_Svef32mm : Arm_None;
328 hwcap |= (zf_r0.f64mm >= 1) ? Arm_Svef64mm : Arm_None;
329 hwcap |= (zf_r0.i8mm >= 1) ? Arm_Svei8mm : Arm_None;
338 int intSize =
sizeof(IntType);
342 std::string filename;
400 int sentry_size = intSize;
402 std::string platform =
"v71";
403 int platform_size = platform.size() + 1;
406 int aux_random_size = 16;
412 int aux_data_size = filename.size() + 1;
414 int env_data_size = 0;
415 for (
int i = 0;
i <
envp.size(); ++
i) {
416 env_data_size +=
envp[
i].size() + 1;
418 int arg_data_size = 0;
419 for (
int i = 0;
i <
argv.size(); ++
i) {
420 arg_data_size +=
argv[
i].size() + 1;
423 int info_block_size =
424 sentry_size + env_data_size + arg_data_size +
425 aux_data_size + platform_size + aux_random_size;
428 int aux_array_size = intSize * 2 * (auxv.size() + 1);
430 int envp_array_size = intSize * (
envp.size() + 1);
431 int argv_array_size = intSize * (
argv.size() + 1);
433 int argc_size = intSize;
445 int partial_size = frame_size;
446 int aligned_partial_size =
roundUp(partial_size, align);
447 int aux_padding = aligned_partial_size - partial_size;
449 int space_needed = frame_size + aux_padding;
460 IntType sentry_base =
memState->getStackBase() - sentry_size;
461 IntType aux_data_base = sentry_base - aux_data_size;
462 IntType env_data_base = aux_data_base - env_data_size;
463 IntType arg_data_base = env_data_base - arg_data_size;
464 IntType platform_base = arg_data_base - platform_size;
465 IntType aux_random_base = platform_base - aux_random_size;
466 IntType auxv_array_base = aux_random_base - aux_array_size - aux_padding;
467 IntType envp_array_base = auxv_array_base - envp_array_size;
468 IntType argv_array_base = envp_array_base - argv_array_size;
469 IntType argc_base = argv_array_base - argc_size;
471 DPRINTF(Stack,
"The addresses of items on the initial stack:\n");
472 DPRINTF(Stack,
"0x%x - aux data\n", aux_data_base);
473 DPRINTF(Stack,
"0x%x - env data\n", env_data_base);
474 DPRINTF(Stack,
"0x%x - arg data\n", arg_data_base);
475 DPRINTF(Stack,
"0x%x - random data\n", aux_random_base);
476 DPRINTF(Stack,
"0x%x - platform base\n", platform_base);
477 DPRINTF(Stack,
"0x%x - auxv array\n", auxv_array_base);
478 DPRINTF(Stack,
"0x%x - envp array\n", envp_array_base);
479 DPRINTF(Stack,
"0x%x - argv array\n", argv_array_base);
480 DPRINTF(Stack,
"0x%x - argc \n", argc_base);
486 IntType argc =
argv.size();
487 IntType guestArgc =
htole(argc);
490 IntType sentry_NULL = 0;
491 initVirtMem->writeBlob(sentry_base, &sentry_NULL, sentry_size);
494 for (
int i = auxv.size() - 1;
i >= 0;
i--) {
496 auxv[
i].val = platform_base;
497 initVirtMem->writeString(platform_base, platform.c_str());
499 auxv[
i].val = aux_data_base;
500 initVirtMem->writeString(aux_data_base, filename.c_str());
502 auxv[
i].val = aux_random_base;
508 Addr auxv_array_end = auxv_array_base;
509 for (
const auto &aux: auxv) {
510 initVirtMem->write(auxv_array_end, aux, ByteOrder::little);
511 auxv_array_end +=
sizeof(aux);
516 auxv_array_end +=
sizeof(zero);
523 initVirtMem->writeBlob(argc_base, &guestArgc, intSize);
532 if (
argv.size() > 0) {
538 if (
envp.size() > 0) {
547 pc.nextThumb(
pc.thumb());
549 pc.nextAArch64(
pc.aarch64());
ThreadContext is the external interface to all thread state for anything outside of the CPU.
virtual RegVal readMiscReg(RegIndex misc_reg)=0
virtual void setMiscReg(RegIndex misc_reg, RegVal val)=0
virtual void setReg(const RegId ®, RegVal val)
virtual const PCStateBase & pcState() const =0
Declarations of a non-full system Page Table.