|
From: <sv...@va...> - 2006-10-03 20:12:02
|
Author: sewardj
Date: 2006-10-03 21:11:58 +0100 (Tue, 03 Oct 2006)
New Revision: 6153
Log:
Add client startup code for AIX5.
Modified:
branches/AIX5/coregrind/m_trampoline.S
branches/AIX5/coregrind/pub_core_trampoline.h
Modified: branches/AIX5/coregrind/m_trampoline.S
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- branches/AIX5/coregrind/m_trampoline.S 2006-10-03 20:09:55 UTC (rev 6=
152)
+++ branches/AIX5/coregrind/m_trampoline.S 2006-10-03 20:11:58 UTC (rev 6=
153)
@@ -29,8 +29,14 @@
*/
=20
#include "pub_core_basics_asm.h"
-#include "vki_unistd.h"
=20
+/* We need pub_core_vkiscnums.h, but the AIX5 formulation
+ brings in a load of C declarations. Defining this macro
+ makes them invisible. Yes, a nasty hack. */
+#define VG_IN_ASSEMBLY_SOURCE
+# include "pub_core_vkiscnums.h"
+#undef VG_IN_ASSEMBLY_SOURCE
+
/* ------------------ SIMULATED CPU HELPERS ------------------ */
/*=20
Replacements for some functions to do with vsyscalls and signals.
@@ -299,8 +305,8 @@
VG_(trampoline_stuff_start):
=20
/* See comment in pub_core_trampoline.h for what this is for */
-.global VG_(ppc64_linux_magic_redirect_return_stub)
-VG_(ppc64_linux_magic_redirect_return_stub):
+.global VG_(ppctoc_magic_redirect_return_stub)
+VG_(ppctoc_magic_redirect_return_stub):
trap
=20
/* this function is written using the "dotless" ABI convention */
@@ -377,6 +383,279 @@
# undef UD2_1024
# undef UD2_PAGE
=20
+/*---------------- ppc32-aix5 ----------------*/
+#else
+#if defined(VGP_ppc32_aix5)
+
+# define UD2_16 trap ; trap ; trap; trap
+# define UD2_64 UD2_16 ; UD2_16 ; UD2_16 ; UD2_16
+# define UD2_256 UD2_64 ; UD2_64 ; UD2_64 ; UD2_64
+# define UD2_1024 UD2_256 ; UD2_256 ; UD2_256 ; UD2_256
+# define UD2_PAGE UD2_1024 ; UD2_1024 ; UD2_1024 ; UD2_1024 =20
+
+ .csect .text[PR]
+
+ /* a leading page of unexecutable code */
+ UD2_PAGE
+
+.globl VG_(trampoline_stuff_start)
+VG_(trampoline_stuff_start):
+
+/* See pub_core_trampoline.h for an explaination of this. Also
+ see pub_core_initimg.h, struct AIX5PreloadPage. On entry, r3
+ points to an AIX5PreloadPage structure. Note we can only=20
+ use r2-r10 as scratch registers here since those are the
+ only ones restored from the preload page when finally
+ starting the client. */
+.globl VG_(ppc32_aix5_do_preloads_then_start_client)
+VG_(ppc32_aix5_do_preloads_then_start_client):
+ stwu 1,-1024(1)
+ stw 3,512(1) /* stash r3 512 bytes up stack */
+
+ /* Try to load .../vgpreload_core.so */
+ lwz 2,0(3) /* r2 =3D __NR___loadx */
+ lwz 5,20(3) /* r5 =3D off_preloadcorename */
+ add 6,3,5 /* r6 =3D preloadcorename */
+ bl do___loadx
+ cmpwi 0,3,0
+ beq .Lfailed
+
+ /* Try to load .../vgpreload_tool.so, if it exists */
+ lwz 3,512(1) /* restore r3 */
+ lwz 2,0(3) /* r2 =3D __NR___loadx */
+ lwz 5,24(3) /* r5 =3D off_preloadtoolname */
+ cmpwi 0,5,0 /* skip tool preload if */
+ beq .Ltry_preload /* name not present */
+ add 6,3,5 /* r6 =3D preloadtoolname */
+ bl do___loadx
+ cmpwi 0,3,0
+ beq .Lfailed
+
+.Ltry_preload:
+ /* Try to load the LD_PRELOAD=3D file, if it exists */
+ lwz 3,512(1) /* restore r3 */
+ lwz 2,0(3) /* r2 =3D __NR___loadx */
+ lwz 5,28(3) /* r5 =3D off_ld_preloadname */
+ cmpwi 0,5,0 /* skip ld_preload if */
+ beq .Lstart_client /* name not present */
+ add 6,3,5 /* r6 =3D ld_preloadname */
+ bl do___loadx
+ cmpwi 0,3,0
+ beq .Lfailed
+=09
+.Lstart_client:
+ /* Success. Restore r2-r10 from preloadpage-> and start
+ the client. */
+ lwz 3,512(1) /* restore r3 */
+ addi 1,1,1024
+ lwz 2,32+4(3) /* preloadpage->client_start */
+ mtctr 2
+ lwz 2,40+4(3) /* preloadpage->r2 */
+ lwz 4,56+4(3) /* preloadpage->r4 */
+ lwz 5,64+4(3) /* preloadpage->r5 */
+ lwz 6,72+4(3) /* preloadpage->r6 */
+ lwz 7,80+4(3) /* preloadpage->r7 */
+ lwz 8,88+4(3) /* preloadpage->r8 */
+ lwz 9,96+4(3) /* preloadpage->r9 */
+ lwz 10,104+4(3) /* preloadpage->r10 */
+ lwz 3,48+4(3) /* preloadpage->r3 */
+ bctr
+ /*NOTREACHED*/
+ trap
+
+.Lfailed:
+ /* __loadx barfed for some reason. Print the error
+ message and get out. */
+ /* First the error msg */
+ lwz 3,512(1) /* restore r3 */
+ lwz 2,4(3) /* r2 =3D __NR_kwrite */
+ lwz 4,12(3) /* r4 =3D offset of err msg */
+ add 4,4,3 /* r4 =3D err msg */
+ lwz 5,16(3) /* r5 =3D length err msg */
+ li 3,2 /* r3 =3D stderr */
+ bl do_syscall
+ /* now call the diagnosis fn */
+ lwz 3,512(1) /* restore r3 */
+ lwz 4,112(3) /* preloadpage->p_diagnose_load_failure */
+ lwz 2,4(4) /* get its TOC ptr */
+ lwz 4,0(4) /* get its entry point */
+ mtlr 4
+ blrl
+ /* Now do _exit(1) */
+ lwz 3,512(1) /* restore r3 */
+ lwz 2,8(3) /* r2 =3D __NR_exit */
+ li 3,1 /* doing _exit(1) */
+ addi 1,1,1024 /* fix stack pointer */
+ bl do_syscall
+ /*NOTREACHED*/
+ trap
+=09
+do___loadx:
+ /* On entry: r2 =3D __NR___loadx, r6 =3D name of module */
+ li 3,1
+ slwi 3,3,24 /* r3 =3D 0x1000000 =3D VKI_DL_LOAD */
+ li 4,0
+ li 5,0
+ li 7,0
+ li 8,0
+ li 9,0
+ li 10,0
+do_syscall:
+ sc
+ /* sc continues at 'lr', hence this=20
+ constitutes an automatic return */
+
+
+ /* See comment in pub_core_trampoline.h for what this is for */
+.globl VG_(ppctoc_magic_redirect_return_stub)
+VG_(ppctoc_magic_redirect_return_stub):
+ trap
+=09
+.globl VG_(trampoline_stuff_end)
+VG_(trampoline_stuff_end):
+
+ /* and a trailing page of unexecutable code */
+ UD2_PAGE
+
+# undef UD2_16
+# undef UD2_64
+# undef UD2_256
+# undef UD2_1024
+# undef UD2_PAGE
+
+/*---------------- ppc64-aix5 ----------------*/
+#else
+#if defined(VGP_ppc64_aix5)
+
+# define UD2_16 trap ; trap ; trap; trap
+# define UD2_64 UD2_16 ; UD2_16 ; UD2_16 ; UD2_16
+# define UD2_256 UD2_64 ; UD2_64 ; UD2_64 ; UD2_64
+# define UD2_1024 UD2_256 ; UD2_256 ; UD2_256 ; UD2_256
+# define UD2_PAGE UD2_1024 ; UD2_1024 ; UD2_1024 ; UD2_1024 =20
+
+.globl VG_(trampoline_stuff_start)
+VG_(trampoline_stuff_start):
+/* See pub_core_trampoline.h for an explaination of this. Also
+ see pub_core_initimg.h, struct AIX5PreloadPage. On entry, r3
+ points to an AIX5PreloadPage structure. Note we can only=20
+ use r2-r10 as scratch registers here since those are the
+ only ones restored from the preload page when finally
+ starting the client. */
+.globl VG_(ppc64_aix5_do_preloads_then_start_client)
+VG_(ppc64_aix5_do_preloads_then_start_client):
+ stdu 1,-1024(1)
+ std 3,512(1) /* stash r3 512 bytes up stack */
+
+ /* Try to load .../vgpreload_core.so */
+ lwz 2,0(3) /* r2 =3D __NR_kload */
+ lwz 5,20(3) /* r5 =3D off_preloadcorename */
+ add 3,3,5 /* r6 =3D preloadcorename */
+ bl do_kload
+ cmpdi 0,3,0
+ beq .Lfailed
+
+ /* Try to load .../vgpreload_tool.so, if it exists */
+ ld 3,512(1) /* restore r3 */
+ lwz 2,0(3) /* r2 =3D __NR_kload */
+ lwz 5,24(3) /* r5 =3D off_preloadtoolname */
+ cmpwi 0,5,0 /* skip tool preload if */
+ beq .Ltry_preload /* name not present */
+ add 3,3,5 /* r6 =3D preloadtoolname */
+ bl do_kload
+ cmpdi 0,3,0
+ beq .Lfailed
+
+.Ltry_preload:
+ /* Try to load the LD_PRELOAD=3D file, if it exists */
+ ld 3,512(1) /* restore r3 */
+ lwz 2,0(3) /* r2 =3D __NR_kload */
+ lwz 5,28(3) /* r5 =3D off_ld_preloadname */
+ cmpwi 0,5,0 /* skip ld_preload if */
+ beq .Lstart_client /* name not present */
+ add 3,3,5 /* r6 =3D ld_preloadname */
+ bl do_kload
+ cmpdi 0,3,0
+ beq .Lfailed
+=09
+.Lstart_client:
+ /* Success. Restore r2-r10 from preloadpage-> and start
+ the client. */
+ ld 3,512(1) /* restore r3 */
+ addi 1,1,1024
+ ld 2,32+0(3) /* preloadpage->client_start */
+ mtctr 2
+ ld 2,40+0(3) /* preloadpage->r2 */
+ ld 4,56+0(3) /* preloadpage->r4 */
+ ld 5,64+0(3) /* preloadpage->r5 */
+ ld 6,72+0(3) /* preloadpage->r6 */
+ ld 7,80+0(3) /* preloadpage->r7 */
+ ld 8,88+0(3) /* preloadpage->r8 */
+ ld 9,96+0(3) /* preloadpage->r9 */
+ ld 10,104+0(3) /* preloadpage->r10 */
+ ld 3,48+0(3) /* preloadpage->r3 */
+ bctr
+ /*NOTREACHED*/
+ trap
+
+.Lfailed:
+ /* __loadx barfed for some reason. Print the error
+ message and get out. */
+ /* First the error msg */
+ ld 3,512(1) /* restore r3 */
+ lwz 2,4(3) /* r2 =3D __NR_kwrite */
+ lwz 4,12(3) /* r4 =3D offset of err msg */
+ add 4,4,3 /* r4 =3D err msg */
+ lwz 5,16(3) /* r5 =3D length err msg */
+ li 3,2 /* r3 =3D stderr */
+ bl do_syscall
+ /* now call the diagnosis fn */
+ ld 3,512(1) /* restore r3 */
+ ld 4,112(3) /* preloadpage->p_diagnose_load_failure */
+ ld 11,16(4)
+ ld 2,8(4) /* get its TOC ptr */
+ ld 4,0(4) /* get its entry point */
+ mtlr 4
+ blrl
+ /* Now do _exit(1) */
+ lwz 3,512(1) /* restore r3 */
+ lwz 2,8(3) /* r2 =3D __NR_exit */
+ li 3,1 /* doing _exit(1) */
+ addi 1,1,1024 /* fix stack pointer */
+ bl do_syscall
+ /*NOTREACHED*/
+ trap
+=09
+do_kload:
+ /* On entry: r2 =3D __NR_kload, r3 =3D name of module */
+ li 4,0
+ li 5,0
+ li 6,0
+ li 7,0
+ li 8,0
+ li 9,0
+ li 10,0
+do_syscall:
+ sc
+ /* sc continues at 'lr', hence this=20
+ constitutes an automatic return */
+
+ /* See comment in pub_core_trampoline.h for what this is for */
+.globl VG_(ppctoc_magic_redirect_return_stub)
+VG_(ppctoc_magic_redirect_return_stub):
+ trap
+=09
+.globl VG_(trampoline_stuff_end)
+VG_(trampoline_stuff_end):
+
+ /* and a trailing page of unexecutable code */
+ UD2_PAGE
+
+# undef UD2_16
+# undef UD2_64
+# undef UD2_256
+# undef UD2_1024
+# undef UD2_PAGE
+=09
/*---------------- unknown ----------------*/
#else
# error Unknown platform
@@ -385,11 +664,14 @@
#endif
#endif
#endif
+#endif
+#endif
=20
-
+#if defined(VGO_linux)
/* Let the linker know we don't need an executable stack */
.section .note.GNU-stack,"",@progbits
- =09
+#endif
+
/*--------------------------------------------------------------------*/
/*--- end ---*/
/*--------------------------------------------------------------------*/
Modified: branches/AIX5/coregrind/pub_core_trampoline.h
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- branches/AIX5/coregrind/pub_core_trampoline.h 2006-10-03 20:09:55 UTC=
(rev 6152)
+++ branches/AIX5/coregrind/pub_core_trampoline.h 2006-10-03 20:11:58 UTC=
(rev 6153)
@@ -79,13 +79,35 @@
extern void* VG_(ppc64_linux_REDIR_FOR_strchr)( void*, Int );
/* A label (sans dot) marking the ultra-magical return stub via which
all redirected and wrapped functions are made to "return" on
- ppc64-linux. The one insn at this label is never really
- translated. Instead, m_translate generates IR to restore the
- thread's LR and R2 registers from a small stack in the ppc64 guest
- state structure, and then branch to LR. Convoluted? Confusing?
- You betcha. Could I think of anything simpler? No. */
-extern void VG_(ppc64_linux_magic_redirect_return_stub);
+ ppc64-linux/ppc64-aix5/ppc32-aix5. The one insn at this label is
+ never really translated. Instead, m_translate generates IR to
+ restore the thread's LR and R2 registers from a small stack in the
+ ppc64 guest state structure, and then branch to LR. Convoluted?
+ Confusing? You betcha. Could I think of anything simpler? No. */
+extern void VG_(ppctoc_magic_redirect_return_stub);
#endif
+
+#if defined(VGP_ppc32_aix5)
+/* A label (sans dot) marking the client start point for ppc32_aix5.
+ This function is entered with r3 holding a pointer to the
+ AIX5PreloadPage struct set up by m_initimg. It first tries to
+ __loadx the _core.so and _tool.so preloads mentioned in the struct;
+ then it cleans up the register state to be more what it really
+ should be at client startup, and finally it jumps to the client's
+ real entry point. */
+extern void VG_(ppc32_aix5_do_preloads_then_start_client);
+
+/* See comment for VG_(ppctoc_magic_redirect_return_stub) above. */
+extern void VG_(ppctoc_magic_redirect_return_stub);
+#endif
+
+#if defined(VGP_ppc64_aix5)
+/* See comment for VG_(ppctoc_magic_redirect_return_stub) above. */
+extern void VG_(ppctoc_magic_redirect_return_stub);
+
+/* See comment for ppc32_aix5 equivalent above. */
+extern void VG_(ppc64_aix5_do_preloads_then_start_client);
+#endif
=20
#endif // __PUB_CORE_TRAMPOLINE_H
=20
|