2 /*--------------------------------------------------------------------*/
3 /*--- Startup: create initial process image on Linux ---*/
4 /*--- initimg-linux.c ---*/
5 /*--------------------------------------------------------------------*/
8 This file is part of Valgrind, a dynamic binary instrumentation
11 Copyright (C) 2000-2017 Julian Seward
14 This program is free software; you can redistribute it and/or
15 modify it under the terms of the GNU General Public License as
16 published by the Free Software Foundation; either version 2 of the
17 License, or (at your option) any later version.
19 This program is distributed in the hope that it will be useful, but
20 WITHOUT ANY WARRANTY; without even the implied warranty of
21 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22 General Public License for more details.
24 You should have received a copy of the GNU General Public License
25 along with this program; if not, write to the Free Software
26 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
29 The GNU General Public License is contained in the file COPYING.
32 #if defined(VGO_linux)
34 #include "pub_core_basics.h"
35 #include "pub_core_vki.h"
36 #include "pub_core_debuglog.h"
37 #include "pub_core_libcbase.h"
38 #include "pub_core_libcassert.h"
39 #include "pub_core_libcfile.h"
40 #include "pub_core_libcproc.h"
41 #include "pub_core_libcprint.h"
42 #include "pub_core_xarray.h"
43 #include "pub_core_clientstate.h"
44 #include "pub_core_aspacemgr.h"
45 #include "pub_core_mallocfree.h"
46 #include "pub_core_machine.h"
47 #include "pub_core_ume.h"
48 #include "pub_core_options.h"
49 #include "pub_core_syscall.h"
50 #include "pub_core_tooliface.h" /* VG_TRACK */
51 #include "pub_core_threadstate.h" /* ThreadArchState */
52 #include "priv_initimg_pathscan.h"
53 #include "pub_core_initimg.h" /* self */
55 /* --- !!! --- EXTERNAL HEADERS start --- !!! --- */
57 #define _FILE_OFFSET_BITS 64
58 /* This is for ELF types etc, and also the AT_ constants. */
60 /* --- !!! --- EXTERNAL HEADERS end --- !!! --- */
63 /*====================================================================*/
64 /*=== Loading the client ===*/
65 /*====================================================================*/
67 /* Load the client whose name is VG_(argv_the_exename). */
69 static void load_client ( /*MOD*/ExeInfo
* info
,
70 /*OUT*/Addr
* client_ip
,
71 /*OUT*/Addr
* client_toc
)
73 const HChar
* exe_name
;
77 vg_assert( VG_(args_the_exename
) != NULL
);
78 exe_name
= ML_(find_executable
)( VG_(args_the_exename
) );
81 VG_(printf
)("valgrind: %s: command not found\n", VG_(args_the_exename
));
82 VG_(exit
)(127); // 127 is Posix NOTFOUND
85 ret
= VG_(do_exec
)(exe_name
, info
);
87 VG_(printf
)("valgrind: could not execute '%s'\n", exe_name
);
91 // The client was successfully loaded! Continue.
93 /* Get hold of a file descriptor which refers to the client
94 executable. This is needed for attaching to GDB. */
95 res
= VG_(open
)(exe_name
, VKI_O_RDONLY
, VKI_S_IRUSR
);
97 VG_(cl_exec_fd
) = sr_Res(res
);
99 /* Copy necessary bits of 'info' that were filled in */
100 *client_ip
= info
->init_ip
;
101 *client_toc
= info
->init_toc
;
102 VG_(brk_base
) = VG_(brk_limit
) = VG_PGROUNDUP(info
->brkbase
);
106 /*====================================================================*/
107 /*=== Setting up the client's environment ===*/
108 /*====================================================================*/
110 /* Prepare the client's environment. This is basically a copy of our
113 LD_PRELOAD=$VALGRIND_LIB/vgpreload_core-PLATFORM.so:
114 ($VALGRIND_LIB/vgpreload_TOOL-PLATFORM.so:)?
117 If this is missing, then it is added.
119 Also, remove any binding for VALGRIND_LAUNCHER=. The client should
120 not be able to see this.
122 If this needs to handle any more variables it should be hacked
123 into something table driven. The copy is VG_(malloc)'d space.
125 static HChar
** setup_client_env ( HChar
** origenv
, const HChar
* toolname
)
130 const HChar
* preload_core
= "vgpreload_core";
131 const HChar
* ld_preload
= "LD_PRELOAD=";
132 const HChar
* v_launcher
= VALGRIND_LAUNCHER
"=";
133 Int ld_preload_len
= VG_(strlen
)( ld_preload
);
134 Int v_launcher_len
= VG_(strlen
)( v_launcher
);
135 Bool ld_preload_done
= False
;
136 Int vglib_len
= VG_(strlen
)(VG_(libdir
));
141 HChar
* preload_tool_path
;
144 /* Alloc space for the vgpreload_core.so path and vgpreload_<tool>.so
145 paths. We might not need the space for vgpreload_<tool>.so, but it
146 doesn't hurt to over-allocate briefly. The 16s are just cautious
148 Int preload_core_path_len
= vglib_len
+ sizeof(preload_core
)
149 + sizeof(VG_PLATFORM
) + 16;
150 Int preload_tool_path_len
= vglib_len
+ VG_(strlen
)(toolname
)
151 + sizeof(VG_PLATFORM
) + 16;
152 Int preload_string_len
= preload_core_path_len
+ preload_tool_path_len
;
153 HChar
* preload_string
= VG_(malloc
)("initimg-linux.sce.1",
155 /* Determine if there's a vgpreload_<tool>_<platform>.so file, and setup
157 preload_tool_path
= VG_(malloc
)("initimg-linux.sce.2", preload_tool_path_len
);
158 VG_(snprintf
)(preload_tool_path
, preload_tool_path_len
,
159 "%s/vgpreload_%s-%s.so", VG_(libdir
), toolname
, VG_PLATFORM
);
160 if (VG_(access
)(preload_tool_path
, True
/*r*/, False
/*w*/, False
/*x*/) == 0) {
161 VG_(snprintf
)(preload_string
, preload_string_len
, "%s/%s-%s.so:%s",
162 VG_(libdir
), preload_core
, VG_PLATFORM
, preload_tool_path
);
164 VG_(snprintf
)(preload_string
, preload_string_len
, "%s/%s-%s.so",
165 VG_(libdir
), preload_core
, VG_PLATFORM
);
167 VG_(free
)(preload_tool_path
);
169 VG_(debugLog
)(2, "initimg", "preload_string:\n");
170 VG_(debugLog
)(2, "initimg", " \"%s\"\n", preload_string
);
172 /* Count the original size of the env */
173 if (debug
) VG_(printf
)("\n\n");
175 for (cpp
= origenv
; cpp
&& *cpp
; cpp
++) {
177 if (debug
) VG_(printf
)("XXXXXXXXX: BEFORE %s\n", *cpp
);
180 /* Allocate a new space */
181 ret
= VG_(malloc
) ("initimg-linux.sce.3",
182 sizeof(HChar
*) * (envc
+1+1)); /* 1 new entry + NULL */
185 for (cpp
= ret
; *origenv
; ) {
186 if (debug
) VG_(printf
)("XXXXXXXXX: COPY %s\n", *origenv
);
191 vg_assert(envc
== (cpp
- ret
));
193 /* Walk over the new environment, mashing as we go */
194 for (cpp
= ret
; cpp
&& *cpp
; cpp
++) {
195 if (VG_(memcmp
)(*cpp
, ld_preload
, ld_preload_len
) == 0) {
196 Int len
= VG_(strlen
)(*cpp
) + preload_string_len
;
197 HChar
*cp
= VG_(malloc
)("initimg-linux.sce.4", len
);
199 VG_(snprintf
)(cp
, len
, "%s%s:%s",
200 ld_preload
, preload_string
, (*cpp
)+ld_preload_len
);
204 ld_preload_done
= True
;
206 if (debug
) VG_(printf
)("XXXXXXXXX: MASH %s\n", *cpp
);
209 /* Add the missing bits */
210 if (!ld_preload_done
) {
211 Int len
= ld_preload_len
+ preload_string_len
;
212 HChar
*cp
= VG_(malloc
) ("initimg-linux.sce.5", len
);
214 VG_(snprintf
)(cp
, len
, "%s%s", ld_preload
, preload_string
);
217 if (debug
) VG_(printf
)("XXXXXXXXX: ADD %s\n", cp
);
220 /* ret[0 .. envc-1] is live now. */
221 /* Find and remove a binding for VALGRIND_LAUNCHER. */
222 for (i
= 0; i
< envc
; i
++)
223 if (0 == VG_(memcmp
)(ret
[i
], v_launcher
, v_launcher_len
))
227 for (; i
< envc
-1; i
++)
232 VG_(free
)(preload_string
);
235 for (i
= 0; i
< envc
; i
++) {
236 if (debug
) VG_(printf
)("XXXXXXXXX: FINAL %s\n", ret
[i
]);
243 /*====================================================================*/
244 /*=== Setting up the client's stack ===*/
245 /*====================================================================*/
247 #ifndef AT_DCACHEBSIZE
248 #define AT_DCACHEBSIZE 19
249 #endif /* AT_DCACHEBSIZE */
251 #ifndef AT_ICACHEBSIZE
252 #define AT_ICACHEBSIZE 20
253 #endif /* AT_ICACHEBSIZE */
255 #ifndef AT_UCACHEBSIZE
256 #define AT_UCACHEBSIZE 21
257 #endif /* AT_UCACHEBSIZE */
259 #ifndef AT_BASE_PLATFORM
260 #define AT_BASE_PLATFORM 24
261 #endif /* AT_BASE_PLATFORM */
265 #endif /* AT_RANDOM */
269 #endif /* AT_HWCAP2 */
273 #endif /* AT_EXECFN */
276 #define AT_SYSINFO 32
277 #endif /* AT_SYSINFO */
279 #ifndef AT_SYSINFO_EHDR
280 #define AT_SYSINFO_EHDR 33
281 #endif /* AT_SYSINFO_EHDR */
284 #define AT_SECURE 23 /* secure mode boolean */
285 #endif /* AT_SECURE */
287 /* Add a string onto the string table, and return its address */
288 static HChar
*copy_str(HChar
**tab
, const HChar
*str
)
298 VG_(printf
)("copied %p \"%s\" len %lld\n", orig
, orig
, (Long
)(cp
-orig
));
306 /* ----------------------------------------------------------------
308 This sets up the client's initial stack, containing the args,
309 environment and aux vector.
311 The format of the stack is:
313 higher address +-----------------+ <- clstack_end
331 lower address +-----------------+ <- sp
335 Allocate and create the initial client stack. It is allocated down
336 from clstack_end, which was previously determined by the address
337 space manager. The returned value is the SP value for the client.
339 The client's auxv is created by copying and modifying our own one.
340 As a side effect of scanning our own auxv, some important bits of
343 VG_(cache_line_size_ppc32) // ppc32 only -- cache line size
344 VG_(have_altivec_ppc32) // ppc32 only -- is Altivec supported?
346 ---------------------------------------------------------------- */
358 struct auxv
*find_auxv(UWord
* sp
)
360 sp
++; // skip argc (Nb: is word-sized, not int-sized!)
362 while (*sp
!= 0) // skip argv
366 while (*sp
!= 0) // skip env
370 #if defined(VGA_ppc32) || defined(VGA_ppc64be) || defined(VGA_ppc64le)
371 # if defined AT_IGNOREPPC
372 while (*sp
== AT_IGNOREPPC
) // skip AT_IGNOREPPC entries
377 return (struct auxv
*)sp
;
381 Addr
setup_client_stack( void* init_sp
,
386 SizeT clstack_max_size
,
387 const VexArchInfo
* vex_archinfo
)
389 /* The HW configuration setting (hwcaps) of the target can be
390 * checked against the Vex settings of the host platform as given
391 * by the values in vex_archinfo.
396 HChar
*strtab
; /* string table */
400 const struct auxv
*orig_auxv
;
401 const struct auxv
*cauxv
;
402 unsigned stringsize
; /* total size of strings in bytes */
403 unsigned auxsize
; /* total size of auxv in bytes */
404 Int argc
; /* total argc */
405 Int envc
; /* total number of env vars */
406 unsigned stacksize
; /* total client stack size */
407 Addr client_SP
; /* client stack base (initial SP) */
411 vg_assert(VG_IS_PAGE_ALIGNED(clstack_end
+1));
412 vg_assert( VG_(args_for_client
) );
414 /* use our own auxv as a prototype */
415 orig_auxv
= find_auxv(init_sp
);
417 /* ==================== compute sizes ==================== */
419 /* first of all, work out how big the client stack will be */
422 /* paste on the extra args if the loader needs them (ie, the #!
423 interpreter and its argument) */
425 if (info
->interp_name
!= NULL
) {
427 stringsize
+= VG_(strlen
)(info
->interp_name
) + 1;
429 if (info
->interp_args
!= NULL
) {
431 stringsize
+= VG_(strlen
)(info
->interp_args
) + 1;
434 /* now scan the args we're given... */
435 stringsize
+= VG_(strlen
)( VG_(args_the_exename
) ) + 1;
437 for (i
= 0; i
< VG_(sizeXA
)( VG_(args_for_client
) ); i
++) {
439 stringsize
+= VG_(strlen
)( * (HChar
**)
440 VG_(indexXA
)( VG_(args_for_client
), i
))
444 /* ...and the environment */
446 for (cpp
= orig_envp
; cpp
&& *cpp
; cpp
++) {
448 stringsize
+= VG_(strlen
)(*cpp
) + 1;
451 /* now, how big is the auxv? */
452 auxsize
= sizeof(*auxv
); /* there's always at least one entry: AT_NULL */
453 for (cauxv
= orig_auxv
; cauxv
->a_type
!= AT_NULL
; cauxv
++) {
454 if (cauxv
->a_type
== AT_PLATFORM
||
455 cauxv
->a_type
== AT_BASE_PLATFORM
)
456 stringsize
+= VG_(strlen
)(cauxv
->u
.a_ptr
) + 1;
457 else if (cauxv
->a_type
== AT_RANDOM
)
459 else if (cauxv
->a_type
== AT_EXECFN
)
460 stringsize
+= VG_(strlen
)(VG_(args_the_exename
)) + 1;
461 auxsize
+= sizeof(*cauxv
);
464 # if defined(VGP_ppc32_linux) || defined(VGP_ppc64be_linux) \
465 || defined(VGP_ppc64le_linux)
466 auxsize
+= 2 * sizeof(*cauxv
);
469 /* OK, now we know how big the client stack is */
471 sizeof(Word
) + /* argc */
472 sizeof(HChar
**) + /* argc[0] == exename */
473 sizeof(HChar
**)*argc
+ /* argv */
474 sizeof(HChar
**) + /* terminal NULL */
475 sizeof(HChar
**)*envc
+ /* envp */
476 sizeof(HChar
**) + /* terminal NULL */
478 VG_ROUNDUP(stringsize
, sizeof(Word
)); /* strings (aligned) */
480 if (0) VG_(printf
)("stacksize = %u\n", stacksize
);
482 /* client_SP is the client's stack pointer */
483 client_SP
= clstack_end
- stacksize
;
484 client_SP
= VG_ROUNDDN(client_SP
, 16); /* make stack 16 byte aligned */
486 /* base of the string table (aligned) */
487 stringbase
= strtab
= (HChar
*)clstack_end
488 - VG_ROUNDUP(stringsize
, sizeof(int));
490 clstack_start
= VG_PGROUNDDN(client_SP
);
492 /* The max stack size */
493 clstack_max_size
= VG_PGROUNDUP(clstack_max_size
);
496 VG_(printf
)("stringsize=%u auxsize=%u stacksize=%u maxsize=0x%lx\n"
499 stringsize
, auxsize
, stacksize
, clstack_max_size
,
500 (void*)clstack_start
, (void*)clstack_end
);
502 /* ==================== allocate space ==================== */
504 { SizeT anon_size
= clstack_end
- clstack_start
+ 1;
505 SizeT resvn_size
= clstack_max_size
- anon_size
;
506 Addr anon_start
= clstack_start
;
507 Addr resvn_start
= anon_start
- resvn_size
;
508 SizeT inner_HACK
= 0;
511 /* So far we've only accounted for space requirements down to the
512 stack pointer. If this target's ABI requires a redzone below
513 the stack pointer, we need to allocate an extra page, to
514 handle the worst case in which the stack pointer is almost at
515 the bottom of a page, and so there is insufficient room left
516 over to put the redzone in. In this case the simple thing to
517 do is allocate an extra page, by shrinking the reservation by
518 one page and growing the anonymous area by a corresponding
520 vg_assert(VG_STACK_REDZONE_SZB
>= 0);
521 vg_assert(VG_STACK_REDZONE_SZB
< VKI_PAGE_SIZE
);
522 if (VG_STACK_REDZONE_SZB
> 0) {
523 vg_assert(resvn_size
> VKI_PAGE_SIZE
);
524 resvn_size
-= VKI_PAGE_SIZE
;
525 anon_start
-= VKI_PAGE_SIZE
;
526 anon_size
+= VKI_PAGE_SIZE
;
529 vg_assert(VG_IS_PAGE_ALIGNED(anon_size
));
530 vg_assert(VG_IS_PAGE_ALIGNED(resvn_size
));
531 vg_assert(VG_IS_PAGE_ALIGNED(anon_start
));
532 vg_assert(VG_IS_PAGE_ALIGNED(resvn_start
));
533 vg_assert(resvn_start
== clstack_end
+ 1 - clstack_max_size
);
536 inner_HACK
= 1024*1024; // create 1M non-fault-extending stack
540 VG_(printf
)("%#lx 0x%lx %#lx 0x%lx\n",
541 resvn_start
, resvn_size
, anon_start
, anon_size
);
543 /* Create a shrinkable reservation followed by an anonymous
544 segment. Together these constitute a growdown stack. */
545 res
= VG_(mk_SysRes_Error
)(0);
546 ok
= VG_(am_create_reservation
)(
548 resvn_size
-inner_HACK
,
550 anon_size
+inner_HACK
553 /* allocate a stack - mmap enough space for the stack */
554 res
= VG_(am_mmap_anon_fixed_client
)(
555 anon_start
-inner_HACK
,
556 anon_size
+inner_HACK
,
560 if ((!ok
) || sr_isError(res
)) {
561 /* Allocation of the stack failed. We have to stop. */
562 VG_(printf
)("valgrind: "
563 "I failed to allocate space for the application's stack.\n");
564 VG_(printf
)("valgrind: "
565 "This may be the result of a very large --main-stacksize=\n");
566 VG_(printf
)("valgrind: setting. Cannot continue. Sorry.\n\n");
571 vg_assert(!sr_isError(res
));
573 /* Record stack extent -- needed for stack-change code. */
574 VG_(clstk_start_base
) = anon_start
-inner_HACK
;
575 VG_(clstk_end
) = VG_(clstk_start_base
) + anon_size
+inner_HACK
-1;
579 /* ==================== create client stack ==================== */
581 ptr
= (Addr
*)client_SP
;
583 /* --- client argc --- */
586 /* --- client argv --- */
587 if (info
->interp_name
)
588 *ptr
++ = (Addr
)copy_str(&strtab
, info
->interp_name
);
589 if (info
->interp_args
)
590 *ptr
++ = (Addr
)copy_str(&strtab
, info
->interp_args
);
592 *ptr
++ = (Addr
)copy_str(&strtab
, VG_(args_the_exename
));
594 for (i
= 0; i
< VG_(sizeXA
)( VG_(args_for_client
) ); i
++) {
595 *ptr
++ = (Addr
)copy_str(
597 * (HChar
**) VG_(indexXA
)( VG_(args_for_client
), i
)
603 VG_(client_envp
) = (HChar
**)ptr
;
604 for (cpp
= orig_envp
; cpp
&& *cpp
; ptr
++, cpp
++)
605 *ptr
= (Addr
)copy_str(&strtab
, *cpp
);
609 auxv
= (struct auxv
*)ptr
;
610 *client_auxv
= (UInt
*)auxv
;
611 VG_(client_auxv
) = (UWord
*)*client_auxv
;
612 // ??? According to 'man proc', auxv is a array of unsigned long
613 // terminated by two zeros. Why is valgrind working with UInt ?
614 // We do not take ULong* (as ULong 8 bytes on a 32 bits),
617 # if defined(VGP_ppc32_linux) || defined(VGP_ppc64be_linux) \
618 || defined(VGP_ppc64le_linux)
619 auxv
[0].a_type
= AT_IGNOREPPC
;
620 auxv
[0].u
.a_val
= AT_IGNOREPPC
;
621 auxv
[1].a_type
= AT_IGNOREPPC
;
622 auxv
[1].u
.a_val
= AT_IGNOREPPC
;
626 for (; orig_auxv
->a_type
!= AT_NULL
; auxv
++, orig_auxv
++) {
628 /* copy the entry... */
631 /* ...and fix up / examine the copy */
632 switch(auxv
->a_type
) {
644 # if !defined(VGPV_arm_linux_android) \
645 && !defined(VGPV_x86_linux_android) \
646 && !defined(VGPV_mips32_linux_android) \
647 && !defined(VGPV_arm64_linux_android)
648 case AT_FPUCW
: /* missing on android */
650 /* All these are pointerless, so we don't need to do
651 anything about them. */
656 auxv
->a_type
= AT_IGNORE
;
658 auxv
->u
.a_val
= info
->phdr
;
663 auxv
->a_type
= AT_IGNORE
;
665 auxv
->u
.a_val
= info
->phnum
;
669 auxv
->u
.a_val
= info
->interp_offset
;
673 case AT_BASE_PLATFORM
:
674 /* points to a platform description string */
675 auxv
->u
.a_ptr
= copy_str(&strtab
, orig_auxv
->u
.a_ptr
);
679 auxv
->u
.a_val
= info
->entry
;
683 # if defined(VGP_arm_linux)
684 { Bool has_neon
= (auxv
->u
.a_val
& VKI_HWCAP_NEON
) > 0;
685 VG_(debugLog
)(2, "initimg",
686 "ARM has-neon from-auxv: %s\n",
687 has_neon
? "YES" : "NO");
688 VG_(machine_arm_set_has_NEON
)( has_neon
);
689 # define VKI_HWCAP_TLS 32768
690 Bool has_tls
= (auxv
->u
.a_val
& VKI_HWCAP_TLS
) > 0;
691 # undef VKI_HWCAP_TLS
692 VG_(debugLog
)(2, "initimg",
693 "ARM has-tls from-auxv: %s\n",
694 has_tls
? "YES" : "NO");
695 /* If real hw sets properly HWCAP_TLS, we might
696 use this info to decide to really execute set_tls syscall
697 in syswrap-arm-linux.c rather than to base this on
698 conditional compilation. */
700 # elif defined(VGP_s390x_linux)
702 /* Advertise hardware features "below" TE only. TE and VXRS
703 (and anything above) are not supported by Valgrind. */
704 auxv
->u
.a_val
&= VKI_HWCAP_S390_TE
- 1;
708 # if defined(VGP_ppc64be_linux) || defined(VGP_ppc64le_linux)
710 Bool auxv_2_07
, hw_caps_2_07
;
711 /* The HWCAP2 field may contain an arch_2_07 entry that indicates
712 * if the processor is compliant with the 2.07 ISA. (i.e. Power 8
713 * or beyond). The Valgrind vai.hwcaps value
714 * (coregrind/m_machine.c) has the VEX_HWCAPS_PPC64_ISA2_07
715 * flag set so Valgrind knows about Power8. Need to pass the
716 * HWCAP2 value along so the user level programs can detect that
717 * the processor supports ISA 2.07 and beyond.
719 /* Power Architecture 64-Bit ELF V2 ABI Specification
720 July 21, 2014, version 1.0, Page 124
721 www-03.ibm.com/technologyconnect/tgcm/TGCMServlet.wss?alias=OpenPOWER&linkid=1n0000
724 The a_val member of this entry is a bit map of hardware
725 capabilities. Some bit mask values include:
727 PPC_FEATURE2_ARCH_2_07 0x80000000
728 PPC_FEATURE2_HAS_HTM 0x40000000
729 PPC_FEATURE2_HAS_DSCR 0x20000000
730 PPC_FEATURE2_HAS_EBB 0x10000000
731 PPC_FEATURE2_HAS_ISEL 0x08000000
732 PPC_FEATURE2_HAS_TAR 0x04000000
733 PPC_FEATURE2_HAS_VCRYPTO 0x02000000
735 auxv_2_07
= (auxv
->u
.a_val
& 0x80000000ULL
) == 0x80000000ULL
;
736 hw_caps_2_07
= (vex_archinfo
->hwcaps
& VEX_HWCAPS_PPC64_ISA2_07
)
737 == VEX_HWCAPS_PPC64_ISA2_07
;
739 /* Verify the PPC_FEATURE2_ARCH_2_07 setting in HWCAP2
740 * matches the setting in VEX HWCAPS.
742 vg_assert(auxv_2_07
== hw_caps_2_07
);
751 # if defined(VGP_ppc32_linux)
752 /* acquire cache info */
753 if (auxv
->u
.a_val
> 0) {
754 VG_(machine_ppc32_set_clszB
)( auxv
->u
.a_val
);
755 VG_(debugLog
)(2, "initimg",
756 "PPC32 icache line size %u (type %u)\n",
757 (UInt
)auxv
->u
.a_val
, (UInt
)auxv
->a_type
);
759 # elif defined(VGP_ppc64be_linux) || defined(VGP_ppc64le_linux)
760 /* acquire cache info */
761 if (auxv
->u
.a_val
> 0) {
762 VG_(machine_ppc64_set_clszB
)( auxv
->u
.a_val
);
763 VG_(debugLog
)(2, "initimg",
764 "PPC64 icache line size %u (type %u)\n",
765 (UInt
)auxv
->u
.a_val
, (UInt
)auxv
->a_type
);
770 # if defined(VGP_ppc32_linux) || defined(VGP_ppc64be_linux) \
771 || defined(VGP_ppc64le_linux)
777 /* If this is 1, then it means that this program is
778 running suid, and therefore the dynamic linker should
779 be careful about LD_PRELOAD, etc. However, since
780 stage1 (the thing the kernel actually execve's) should
781 never be SUID, and we need LD_PRELOAD to work for the
782 client, we set AT_SECURE to 0. */
787 /* Trash this, because we don't reproduce it */
788 auxv
->a_type
= AT_IGNORE
;
791 # if !defined(VGP_ppc32_linux) && !defined(VGP_ppc64be_linux) \
792 && !defined(VGP_ppc64le_linux) \
793 && !defined(VGP_mips32_linux) && !defined(VGP_mips64_linux)
794 case AT_SYSINFO_EHDR
: {
795 /* Trash this, because we don't reproduce it */
796 const NSegment
* ehdrseg
= VG_(am_find_nsegment
)((Addr
)auxv
->u
.a_ptr
);
798 VG_(am_munmap_valgrind
)(ehdrseg
->start
, ehdrseg
->end
- ehdrseg
->start
);
799 auxv
->a_type
= AT_IGNORE
;
805 /* points to 16 random bytes - we need to ensure this is
806 propagated to the client as glibc will assume it is
807 present if it is built for kernel 2.6.29 or later */
808 auxv
->u
.a_ptr
= strtab
;
809 VG_(memcpy
)(strtab
, orig_auxv
->u
.a_ptr
, 16);
814 /* points to the executable filename */
815 auxv
->u
.a_ptr
= copy_str(&strtab
, VG_(args_the_exename
));
819 /* stomp out anything we don't know about */
820 VG_(debugLog
)(2, "initimg",
821 "stomping auxv entry %llu\n",
822 (ULong
)auxv
->a_type
);
823 auxv
->a_type
= AT_IGNORE
;
828 vg_assert(auxv
->a_type
== AT_NULL
);
830 vg_assert((strtab
-stringbase
) == stringsize
);
832 /* client_SP is pointing at client's argc/argv */
834 if (0) VG_(printf
)("startup SP = %#lx\n", client_SP
);
839 /* Allocate the client data segment. It is an expandable anonymous
840 mapping abutting a shrinkable reservation of size max_dseg_size.
841 The data segment starts at VG_(brk_base), which is page-aligned,
842 and runs up to VG_(brk_limit), which isn't. */
844 static void setup_client_dataseg ( SizeT max_size
)
848 Addr anon_start
= VG_(brk_base
);
849 SizeT anon_size
= VKI_PAGE_SIZE
;
850 Addr resvn_start
= anon_start
+ anon_size
;
851 SizeT resvn_size
= max_size
- anon_size
;
853 vg_assert(VG_IS_PAGE_ALIGNED(anon_size
));
854 vg_assert(VG_IS_PAGE_ALIGNED(resvn_size
));
855 vg_assert(VG_IS_PAGE_ALIGNED(anon_start
));
856 vg_assert(VG_IS_PAGE_ALIGNED(resvn_start
));
858 /* Because there's been no brk activity yet: */
859 vg_assert(VG_(brk_base
) == VG_(brk_limit
));
861 /* Try to create the data seg and associated reservation where
862 VG_(brk_base) says. */
863 ok
= VG_(am_create_reservation
)(
871 /* Hmm, that didn't work. Well, let aspacem suggest an address
872 it likes better, and try again with that. */
873 anon_start
= VG_(am_get_advisory_client_simple
)
874 ( 0/*floating*/, anon_size
+resvn_size
, &ok
);
876 resvn_start
= anon_start
+ anon_size
;
877 ok
= VG_(am_create_reservation
)(
884 VG_(brk_base
) = VG_(brk_limit
) = anon_start
;
886 /* that too might have failed, but if it has, we're hosed: there
891 /* We make the data segment (heap) executable because LinuxThreads on
892 ppc32 creates trampolines in this area. Also, on x86/Linux the data
893 segment is RWX natively, at least according to /proc/self/maps.
894 Also, having a non-executable data seg would kill any program which
895 tried to create code in the data seg and then run it. */
896 sres
= VG_(am_mmap_anon_fixed_client
)(
899 VKI_PROT_READ
|VKI_PROT_WRITE
|VKI_PROT_EXEC
901 vg_assert(!sr_isError(sres
));
902 vg_assert(sr_Res(sres
) == anon_start
);
906 /*====================================================================*/
907 /*=== TOP-LEVEL: VG_(setup_client_initial_image) ===*/
908 /*====================================================================*/
910 /* Create the client's initial memory image. */
911 IIFinaliseImageInfo
VG_(ii_create_image
)( IICreateImageInfo iicii
,
912 const VexArchInfo
* vex_archinfo
)
917 IIFinaliseImageInfo iifii
= {
918 .clstack_max_size
= 0,
919 .initial_client_SP
= 0,
920 .initial_client_IP
= 0,
921 .initial_client_TOC
= 0,
923 .arch_elf_state
= VKI_INIT_ARCH_ELF_STATE
,
926 //--------------------------------------------------------------
927 // Load client executable, finding in $PATH if necessary
928 // p: get_helprequest_and_toolname() [for 'exec', 'need_help']
929 // p: layout_remaining_space [so there's space]
930 //--------------------------------------------------------------
931 VG_(debugLog
)(1, "initimg", "Loading client\n");
933 if (VG_(args_the_exename
) == NULL
)
934 VG_(err_missing_prog
)();
936 VG_(memset
)(&info
, 0, sizeof(info
));
937 info
.arch_elf_state
= &iifii
.arch_elf_state
;
939 load_client(&info
, &iifii
.initial_client_IP
, &iifii
.initial_client_TOC
);
941 //--------------------------------------------------------------
942 // Set up client's environment
943 // p: set-libdir [for VG_(libdir)]
944 // p: get_helprequest_and_toolname [for toolname]
945 //--------------------------------------------------------------
946 VG_(debugLog
)(1, "initimg", "Setup client env\n");
947 env
= setup_client_env(iicii
.envp
, iicii
.toolname
);
949 //--------------------------------------------------------------
950 // Setup client stack, eip, and VG_(client_arg[cv])
951 // p: load_client() [for 'info']
952 // p: fix_environment() [for 'env']
953 //--------------------------------------------------------------
955 /* When allocating space for the client stack on Linux, take
956 notice of the --main-stacksize value. This makes it possible
957 to run programs with very large (primary) stack requirements
958 simply by specifying --main-stacksize. */
959 /* Logic is as follows:
960 - by default, use the client's current stack rlimit
961 - if that exceeds 16M, clamp to 16M
962 - if a larger --main-stacksize value is specified, use that instead
963 - in all situations, the minimum allowed stack size is 1M
965 void* init_sp
= iicii
.argv
- 1;
966 SizeT m1
= 1024 * 1024;
968 SizeT szB
= (SizeT
)VG_(client_rlimit_stack
).rlim_cur
;
969 if (szB
< m1
) szB
= m1
;
970 if (szB
> m16
) szB
= m16
;
971 if (VG_(clo_main_stacksize
) > 0) szB
= VG_(clo_main_stacksize
);
972 if (szB
< m1
) szB
= m1
;
973 szB
= VG_PGROUNDUP(szB
);
974 VG_(debugLog
)(1, "initimg",
975 "Setup client stack: size will be %lu\n", szB
);
977 iifii
.clstack_max_size
= szB
;
979 iifii
.initial_client_SP
980 = setup_client_stack( init_sp
, env
,
981 &info
, &iifii
.client_auxv
,
982 iicii
.clstack_end
, iifii
.clstack_max_size
,
987 VG_(debugLog
)(2, "initimg",
989 "initial_IP=%p initial_TOC=%p brk_base=%p\n",
990 (void*)(iifii
.initial_client_IP
),
991 (void*)(iifii
.initial_client_TOC
),
992 (void*)VG_(brk_base
) );
993 VG_(debugLog
)(2, "initimg",
995 "initial_SP=%p max_stack_size=%lu\n",
996 (void*)(iifii
.initial_client_SP
),
997 iifii
.clstack_max_size
);
1000 //--------------------------------------------------------------
1001 // Setup client data (brk) segment. Initially a 1-page segment
1002 // which abuts a shrinkable reservation.
1003 // p: load_client() [for 'info' and hence VG_(brk_base)]
1004 //--------------------------------------------------------------
1006 SizeT m1
= 1024 * 1024;
1008 SizeT dseg_max_size
= (SizeT
)VG_(client_rlimit_data
).rlim_cur
;
1009 VG_(debugLog
)(1, "initimg", "Setup client data (brk) segment\n");
1010 if (dseg_max_size
< m1
) dseg_max_size
= m1
;
1011 if (dseg_max_size
> m8
) dseg_max_size
= m8
;
1012 dseg_max_size
= VG_PGROUNDUP(dseg_max_size
);
1014 setup_client_dataseg( dseg_max_size
);
1017 VG_(free
)(info
.interp_name
); info
.interp_name
= NULL
;
1018 VG_(free
)(info
.interp_args
); info
.interp_args
= NULL
;
1023 /*====================================================================*/
1024 /*=== TOP-LEVEL: VG_(finalise_thread1state) ===*/
1025 /*====================================================================*/
1027 /* Just before starting the client, we may need to make final
1028 adjustments to its initial image. Also we need to set up the VEX
1029 guest state for thread 1 (the root thread) and copy in essential
1030 starting values. This is handed the IIFinaliseImageInfo created by
1031 VG_(ii_create_image).
1033 void VG_(ii_finalise_image
)( IIFinaliseImageInfo iifii
)
1035 ThreadArchState
* arch
= &VG_(threads
)[1].arch
;
1037 /* On Linux we get client_{ip/sp/toc}, and start the client with
1038 all other registers zeroed. */
1040 # if defined(VGP_x86_linux)
1041 vg_assert(0 == sizeof(VexGuestX86State
) % LibVEX_GUEST_STATE_ALIGN
);
1043 /* Zero out the initial state, and set up the simulated FPU in a
1045 LibVEX_GuestX86_initialise(&arch
->vex
);
1047 /* Zero out the shadow areas. */
1048 VG_(memset
)(&arch
->vex_shadow1
, 0, sizeof(VexGuestX86State
));
1049 VG_(memset
)(&arch
->vex_shadow2
, 0, sizeof(VexGuestX86State
));
1051 /* Put essential stuff into the new state. */
1052 arch
->vex
.guest_ESP
= iifii
.initial_client_SP
;
1053 arch
->vex
.guest_EIP
= iifii
.initial_client_IP
;
1055 /* initialise %cs, %ds and %ss to point at the operating systems
1056 default code, data and stack segments. Also %es (see #291253). */
1057 asm volatile("movw %%cs, %0" : : "m" (arch
->vex
.guest_CS
));
1058 asm volatile("movw %%ds, %0" : : "m" (arch
->vex
.guest_DS
));
1059 asm volatile("movw %%ss, %0" : : "m" (arch
->vex
.guest_SS
));
1060 asm volatile("movw %%es, %0" : : "m" (arch
->vex
.guest_ES
));
1062 # elif defined(VGP_amd64_linux)
1063 vg_assert(0 == sizeof(VexGuestAMD64State
) % LibVEX_GUEST_STATE_ALIGN
);
1065 /* Zero out the initial state, and set up the simulated FPU in a
1067 LibVEX_GuestAMD64_initialise(&arch
->vex
);
1069 /* Zero out the shadow areas. */
1070 VG_(memset
)(&arch
->vex_shadow1
, 0, sizeof(VexGuestAMD64State
));
1071 VG_(memset
)(&arch
->vex_shadow2
, 0, sizeof(VexGuestAMD64State
));
1073 /* Put essential stuff into the new state. */
1074 arch
->vex
.guest_RSP
= iifii
.initial_client_SP
;
1075 arch
->vex
.guest_RIP
= iifii
.initial_client_IP
;
1077 # elif defined(VGP_ppc32_linux)
1078 vg_assert(0 == sizeof(VexGuestPPC32State
) % LibVEX_GUEST_STATE_ALIGN
);
1080 /* Zero out the initial state, and set up the simulated FPU in a
1082 LibVEX_GuestPPC32_initialise(&arch
->vex
);
1084 /* Zero out the shadow areas. */
1085 VG_(memset
)(&arch
->vex_shadow1
, 0, sizeof(VexGuestPPC32State
));
1086 VG_(memset
)(&arch
->vex_shadow2
, 0, sizeof(VexGuestPPC32State
));
1088 /* Put essential stuff into the new state. */
1089 arch
->vex
.guest_GPR1
= iifii
.initial_client_SP
;
1090 arch
->vex
.guest_CIA
= iifii
.initial_client_IP
;
1092 # elif defined(VGP_ppc64be_linux) || defined(VGP_ppc64le_linux)
1093 vg_assert(0 == sizeof(VexGuestPPC64State
) % LibVEX_GUEST_STATE_ALIGN
);
1095 /* Zero out the initial state, and set up the simulated FPU in a
1097 LibVEX_GuestPPC64_initialise(&arch
->vex
);
1099 /* Zero out the shadow areas. */
1100 VG_(memset
)(&arch
->vex_shadow1
, 0, sizeof(VexGuestPPC64State
));
1101 VG_(memset
)(&arch
->vex_shadow2
, 0, sizeof(VexGuestPPC64State
));
1103 /* Put essential stuff into the new state. */
1104 arch
->vex
.guest_GPR1
= iifii
.initial_client_SP
;
1105 arch
->vex
.guest_GPR2
= iifii
.initial_client_TOC
;
1106 arch
->vex
.guest_CIA
= iifii
.initial_client_IP
;
1107 #if defined(VGP_ppc64le_linux)
1108 arch
->vex
.guest_GPR12
= iifii
.initial_client_IP
;
1111 # elif defined(VGP_arm_linux)
1112 /* Zero out the initial state, and set up the simulated FPU in a
1114 LibVEX_GuestARM_initialise(&arch
->vex
);
1116 /* Zero out the shadow areas. */
1117 VG_(memset
)(&arch
->vex_shadow1
, 0, sizeof(VexGuestARMState
));
1118 VG_(memset
)(&arch
->vex_shadow2
, 0, sizeof(VexGuestARMState
));
1120 arch
->vex
.guest_R13
= iifii
.initial_client_SP
;
1121 arch
->vex
.guest_R15T
= iifii
.initial_client_IP
;
1123 /* This is just EABI stuff. */
1124 // FIXME jrs: what's this for?
1125 arch
->vex
.guest_R1
= iifii
.initial_client_SP
;
1127 # elif defined(VGP_arm64_linux)
1128 /* Zero out the initial state. */
1129 LibVEX_GuestARM64_initialise(&arch
->vex
);
1131 /* Zero out the shadow areas. */
1132 VG_(memset
)(&arch
->vex_shadow1
, 0, sizeof(VexGuestARM64State
));
1133 VG_(memset
)(&arch
->vex_shadow2
, 0, sizeof(VexGuestARM64State
));
1135 arch
->vex
.guest_XSP
= iifii
.initial_client_SP
;
1136 arch
->vex
.guest_PC
= iifii
.initial_client_IP
;
1138 # elif defined(VGP_s390x_linux)
1139 vg_assert(0 == sizeof(VexGuestS390XState
) % LibVEX_GUEST_STATE_ALIGN
);
1141 /* Zero out the initial state. This also sets the guest_fpc to 0, which
1142 is also done by the kernel for the fpc during execve. */
1143 LibVEX_GuestS390X_initialise(&arch
->vex
);
1145 /* Mark all registers as undefined ... */
1146 VG_(memset
)(&arch
->vex_shadow1
, 0xFF, sizeof(VexGuestS390XState
));
1147 VG_(memset
)(&arch
->vex_shadow2
, 0x00, sizeof(VexGuestS390XState
));
1148 /* ... except SP, FPC, and IA */
1149 arch
->vex_shadow1
.guest_SP
= 0;
1150 arch
->vex_shadow1
.guest_fpc
= 0;
1151 arch
->vex_shadow1
.guest_IA
= 0;
1153 /* Put essential stuff into the new state. */
1154 arch
->vex
.guest_SP
= iifii
.initial_client_SP
;
1155 arch
->vex
.guest_IA
= iifii
.initial_client_IP
;
1156 /* See sys_execve in <linux>/arch/s390/kernel/process.c */
1157 arch
->vex
.guest_fpc
= 0;
1159 /* Tell the tool about the registers we just wrote */
1160 VG_TRACK(post_reg_write
, Vg_CoreStartup
, /*tid*/1, VG_O_STACK_PTR
, 8);
1161 VG_TRACK(post_reg_write
, Vg_CoreStartup
, /*tid*/1, VG_O_FPC_REG
, 4);
1162 VG_TRACK(post_reg_write
, Vg_CoreStartup
, /*tid*/1, VG_O_INSTR_PTR
, 8);
1164 /* At the end of this function there is code to mark all guest state
1165 registers as defined. For s390 that would be wrong, because the ABI
1166 says that all registers except SP, IA, and FPC are undefined upon
1168 #define PRECISE_GUEST_REG_DEFINEDNESS_AT_STARTUP 1
1170 # elif defined(VGP_mips32_linux)
1171 vg_assert(0 == sizeof(VexGuestMIPS32State
) % LibVEX_GUEST_STATE_ALIGN
);
1172 /* Zero out the initial state, and set up the simulated FPU in a
1174 LibVEX_GuestMIPS32_initialise(&arch
->vex
);
1176 /* Zero out the shadow areas. */
1177 VG_(memset
)(&arch
->vex_shadow1
, 0, sizeof(VexGuestMIPS32State
));
1178 VG_(memset
)(&arch
->vex_shadow2
, 0, sizeof(VexGuestMIPS32State
));
1180 arch
->vex
.guest_r29
= iifii
.initial_client_SP
;
1181 arch
->vex
.guest_PC
= iifii
.initial_client_IP
;
1182 arch
->vex
.guest_r31
= iifii
.initial_client_SP
;
1184 if (iifii
.arch_elf_state
.overall_fp_mode
== VKI_FP_FR1
) {
1185 arch
->vex
.guest_CP0_status
|= MIPS_CP0_STATUS_FR
;
1188 # elif defined(VGP_mips64_linux)
1189 vg_assert(0 == sizeof(VexGuestMIPS64State
) % LibVEX_GUEST_STATE_ALIGN
);
1190 /* Zero out the initial state, and set up the simulated FPU in a
1192 LibVEX_GuestMIPS64_initialise(&arch
->vex
);
1194 /* Zero out the shadow areas. */
1195 VG_(memset
)(&arch
->vex_shadow1
, 0, sizeof(VexGuestMIPS64State
));
1196 VG_(memset
)(&arch
->vex_shadow2
, 0, sizeof(VexGuestMIPS64State
));
1198 arch
->vex
.guest_r29
= iifii
.initial_client_SP
;
1199 arch
->vex
.guest_PC
= iifii
.initial_client_IP
;
1200 arch
->vex
.guest_r31
= iifii
.initial_client_SP
;
1203 # error Unknown platform
1206 # if !defined(PRECISE_GUEST_REG_DEFINEDNESS_AT_STARTUP)
1207 /* Tell the tool that we just wrote to the registers. */
1208 VG_TRACK( post_reg_write
, Vg_CoreStartup
, /*tid*/1, /*offset*/0,
1209 sizeof(VexGuestArchState
));
1212 /* Tell the tool about the client data segment and then kill it which will
1213 make it inaccessible/unaddressable. */
1214 const NSegment
*seg
= VG_(am_find_nsegment
)(VG_(brk_base
));
1216 vg_assert(seg
->kind
== SkAnonC
);
1217 VG_TRACK(new_mem_brk
, VG_(brk_base
), seg
->end
+ 1 - VG_(brk_base
),
1219 VG_TRACK(die_mem_brk
, VG_(brk_base
), seg
->end
+ 1 - VG_(brk_base
));
1222 #endif // defined(VGO_linux)
1224 /*--------------------------------------------------------------------*/
1226 /*--------------------------------------------------------------------*/