|
From: <sv...@va...> - 2006-01-12 21:15:40
|
Author: sewardj
Date: 2006-01-12 21:15:35 +0000 (Thu, 12 Jan 2006)
New Revision: 5523
Log:
Fix more ppc64-linux function wrapping and symbol-table bits and pieces.
Modified:
trunk/coregrind/m_debuginfo/symtab.c
trunk/coregrind/m_dispatch/dispatch-ppc32-linux.S
trunk/coregrind/m_dispatch/dispatch-ppc64-linux.S
trunk/coregrind/m_main.c
trunk/coregrind/m_redir.c
trunk/coregrind/m_scheduler/scheduler.c
trunk/coregrind/m_stacktrace.c
trunk/coregrind/m_trampoline.S
trunk/coregrind/pub_core_trampoline.h
trunk/include/valgrind.h
Modified: trunk/coregrind/m_debuginfo/symtab.c
=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
--- trunk/coregrind/m_debuginfo/symtab.c 2006-01-12 14:04:46 UTC (rev 552=
2)
+++ trunk/coregrind/m_debuginfo/symtab.c 2006-01-12 21:15:35 UTC (rev 552=
3)
@@ -1106,20 +1106,38 @@
(ppc64-linux=
only) */
/*OUT*/Addr* sym_addr_really )
{
+ Bool plausible;
+
/* Set default real address for the symbol. */
*sym_addr_really =3D sym_addr;
=20
- /* Figure out if we're interested in the symbol.
- Firstly, is it of the right flavour? */
- if ( ! ( (ELFXX_ST_BIND(sym->st_info) =3D=3D STB_GLOBAL ||
- ELFXX_ST_BIND(sym->st_info) =3D=3D STB_LOCAL ||
- ELFXX_ST_BIND(sym->st_info) =3D=3D STB_WEAK)
- &&
- (ELFXX_ST_TYPE(sym->st_info) =3D=3D STT_FUNC ||
- (VG_(needs).data_syms=20
- && ELFXX_ST_TYPE(sym->st_info) =3D=3D STT_OBJECT))
- )
- )
+ /* Figure out if we're interested in the symbol. Firstly, is it of
+ the right flavour? */
+ plausible=20
+ =3D (ELFXX_ST_BIND(sym->st_info) =3D=3D STB_GLOBAL=20
+ || ELFXX_ST_BIND(sym->st_info) =3D=3D STB_LOCAL=20
+ || ELFXX_ST_BIND(sym->st_info) =3D=3D STB_WEAK
+ )
+ &&
+ (ELFXX_ST_TYPE(sym->st_info) =3D=3D STT_FUNC=20
+ || (VG_(needs).data_syms=20
+ && ELFXX_ST_TYPE(sym->st_info) =3D=3D STT_OBJECT)
+ );
+
+# if defined(VGP_ppc64_linux)
+ /* Allow STT_NOTYPE in the very special case where we're running on
+ ppc64-linux and the symbol is one which the .opd-chasing hack
+ below will chase. */
+ if (!plausible
+ && ELFXX_ST_TYPE(sym->st_info) =3D=3D STT_NOTYPE
+ && sym->st_size > 0
+ && si->opd_start_vma !=3D 0
+ && sym_addr >=3D si->opd_start_vma
+ && sym_addr < si->opd_start_vma + si->opd_size)
+ plausible =3D True;
+# endif
+
+ if (!plausible)
return False;
=20
/* Secondly, if it's apparently in a GOT or PLT, it's really
@@ -1287,7 +1305,8 @@
} =20
=20
// Record interesting symbols in our symtab.
- if ( is_interesting_symbol(si, sym, sym_name, sym_addr, opd_filea,=
&sym_addr_really) ) {
+ if ( is_interesting_symbol(si, sym, sym_name, sym_addr,=20
+ opd_filea, &sym_addr_really) ) {
vg_assert(sym->st_name !=3D 0);
vg_assert(sym_name[0] !=3D 0);
# if defined(VGP_ppc64_linux)
@@ -1299,12 +1318,30 @@
vg_assert(sym_addr_really + sym->st_size <=3D si->opd_start_vma
|| sym_addr_really >=3D si->opd_start_vma + si->opd_s=
ize);
# endif
+# if defined(VGP_ppc64_linux)
+ /* Another ppc64-linux kludge, for the pre-"dotless" ABI
+ (prior to gcc 4.0.0). If the symbol to be added has a
+ leading dot and it wasn't derived via an indirect through
+ .opd, remove the dot before adding it. */
+ if (sym_addr_really =3D=3D sym_addr && sym_name[0] =3D=3D '.')
+ sym_name++;
+# endif
+
name =3D ML_(addStr) ( si, sym_name, -1 );
vg_assert(name !=3D NULL);
+
risym.addr =3D sym_addr_really;
risym.size =3D sym->st_size;
risym.name =3D name;
addSym ( si, &risym );
+
+ if (VG_(clo_trace_symtab))
+ VG_(printf)(" record [%d]: "
+ " value %p, size %d, name %s\n",
+ i, (void*)risym.addr, (Int)risym.size,=20
+ (HChar*)risym.name
+ );
+
}
}
}
Modified: trunk/coregrind/m_dispatch/dispatch-ppc32-linux.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
--- trunk/coregrind/m_dispatch/dispatch-ppc32-linux.S 2006-01-12 14:04:46=
UTC (rev 5522)
+++ trunk/coregrind/m_dispatch/dispatch-ppc32-linux.S 2006-01-12 21:15:35=
UTC (rev 5523)
@@ -562,7 +562,6 @@
2: output: next guest PC
3: output: guest state pointer afterwards (=3D=3D thread return co=
de)
*/
-.align 16
.global VG_(run_a_noredir_translation)
VG_(run_a_noredir_translation):
/* save callee-save int regs, & lr */
Modified: trunk/coregrind/m_dispatch/dispatch-ppc64-linux.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
--- trunk/coregrind/m_dispatch/dispatch-ppc64-linux.S 2006-01-12 14:04:46=
UTC (rev 5522)
+++ trunk/coregrind/m_dispatch/dispatch-ppc64-linux.S 2006-01-12 21:15:35=
UTC (rev 5523)
@@ -52,7 +52,10 @@
.tc vgPlain_machine_ppc64_has_VMX[TC],vgPlain_machine_ppc64_has_=
VMX
=20
/*------------------------------------------------------------*/
-/*--- The dispatch loop. ---*/
+/*--- ---*/
+/*--- The dispatch loop. VG_(run_innerloop) is used to ---*/
+/*--- run all translations except no-redir ones. ---*/
+/*--- ---*/
/*------------------------------------------------------------*/
=20
/*----------------------------------------------------*/
@@ -570,6 +573,95 @@
blr
=20
=20
+/*------------------------------------------------------------*/
+/*--- ---*/
+/*--- A special dispatcher, for running no-redir ---*/
+/*--- translations. Just runs the given translation once. ---*/
+/*--- ---*/
+/*------------------------------------------------------------*/
+
+/* signature:
+void VG_(run_a_noredir_translation) ( UWord* argblock );
+*/
+
+/* Run a no-redir translation. argblock points to 4 UWords, 2 to carry =
args
+ and 2 to carry results:
+ 0: input: ptr to translation
+ 1: input: ptr to guest state
+ 2: output: next guest PC
+ 3: output: guest state pointer afterwards (=3D=3D thread return co=
de)
+*/
+.section ".text"
+.align 2
+.globl VG_(run_a_noredir_translation)
+.section ".opd","aw"
+.align 3
+VG_(run_a_noredir_translation):
+.quad .VG_(run_a_noredir_translation),.TOC.@tocbase,0
+.previous
+.type .VG_(run_a_noredir_translation),@function
+.globl .VG_(run_a_noredir_translation)
+.VG_(run_a_noredir_translation):
+ /* save callee-save int regs, & lr */
+ stdu 1,-512(1)
+ std 14,256(1)
+ std 15,264(1)
+ std 16,272(1)
+ std 17,280(1)
+ std 18,288(1)
+ std 19,296(1)
+ std 20,304(1)
+ std 21,312(1)
+ std 22,320(1)
+ std 23,328(1)
+ std 24,336(1)
+ std 25,344(1)
+ std 26,352(1)
+ std 27,360(1)
+ std 28,368(1)
+ std 29,376(1)
+ std 30,384(1)
+ std 31,392(1)
+ mflr 31
+ std 31,400(1)
+ std 2,408(1) /* also preserve R2, just in case .. */
+
+ stw 3,416(1)
+ lwz 31,8(3)
+ lwz 30,0(3)
+ mtlr 30
+ blrl
+
+ lwz 4,416(1)
+ stw 3, 16(4)
+ stw 31,24(4)
+
+ ld 14,256(1)
+ ld 15,264(1)
+ ld 16,272(1)
+ ld 17,280(1)
+ ld 18,288(1)
+ ld 19,296(1)
+ ld 20,304(1)
+ ld 21,312(1)
+ ld 22,320(1)
+ ld 23,328(1)
+ ld 24,336(1)
+ ld 25,344(1)
+ ld 26,352(1)
+ ld 27,360(1)
+ ld 28,368(1)
+ ld 29,376(1)
+ ld 30,384(1)
+ ld 31,400(1)
+ mtlr 31
+ ld 31,392(1)
+ ld 2,408(1) /* also preserve R2, just in case .. */
+
+ addi 1,1,512
+ blr
+
+
/* Let the linker know we don't need an executable stack */
.section .note.GNU-stack,"",@progbits
=20
Modified: trunk/coregrind/m_main.c
=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
--- trunk/coregrind/m_main.c 2006-01-12 14:04:46 UTC (rev 5522)
+++ trunk/coregrind/m_main.c 2006-01-12 21:15:35 UTC (rev 5523)
@@ -2399,12 +2399,8 @@
// p: aspacem
//--------------------------------------------------------------
{ Bool change_ownership_v_c_OK;
- Addr co_start =3D VG_PGROUNDDN(=20
- (Addr)VG_(fnptr_to_fnentry)(=20
- &VG_(trampoline_stuff_start) ) );
- Addr co_endPlus =3D VG_PGROUNDUP(=20
- (Addr)VG_(fnptr_to_fnentry)(=20
- &VG_(trampoline_stuff_end) ) );
+ Addr co_start =3D VG_PGROUNDDN( (Addr)&VG_(trampoline_stuff_start=
) );
+ Addr co_endPlus =3D VG_PGROUNDUP( (Addr)&VG_(trampoline_stuff_end) =
);
VG_(debugLog)(1,"redir",
"transfer ownership V -> C of 0x%llx .. 0x%llx\n",
(ULong)co_start, (ULong)co_endPlus-1 );
@@ -2703,8 +2699,11 @@
"Caught __NR_exit; running __libc_freeres()");
=20
/* set thread context to point to libc_freeres_wrapper */
+ /* ppc64-linux note: __libc_freeres_wrapper gives us the real
+ function entry point, not a fn descriptor, so can use it
+ directly. However, we need to set R2 (the toc pointer)
+ appropriately. */
VG_(set_IP)(tid, __libc_freeres_wrapper);
- // XXX should we use a special stack?
=20
/* Block all blockable signals by copying the real block state into
the thread's block state*/
Modified: trunk/coregrind/m_redir.c
=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
--- trunk/coregrind/m_redir.c 2006-01-12 14:04:46 UTC (rev 5522)
+++ trunk/coregrind/m_redir.c 2006-01-12 21:15:35 UTC (rev 5523)
@@ -767,11 +767,16 @@
the start, otherwise ld.so makes a lot of noise. */
if (0=3D=3DVG_(strcmp)("Memcheck", VG_(details).name)) {
=20
- add_redirect_sym_to_addr(
- "soname:ld64.so.1", "strlen",
+ add_hardwired_spec(
+ "ld64.so.1", "strlen",
(Addr)VG_(fnptr_to_fnentry)( &VG_(ppc64_linux_REDIR_FOR_strlen)=
)
); =20
=20
+ add_hardwired_spec(
+ "ld64.so.1", "index",
+ (Addr)VG_(fnptr_to_fnentry)( &VG_(ppc64_linux_REDIR_FOR_strchr)=
)
+ ); =20
+
}
=20
# else
Modified: trunk/coregrind/m_scheduler/scheduler.c
=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
--- trunk/coregrind/m_scheduler/scheduler.c 2006-01-12 14:04:46 UTC (rev =
5522)
+++ trunk/coregrind/m_scheduler/scheduler.c 2006-01-12 21:15:35 UTC (rev =
5523)
@@ -522,7 +522,7 @@
static UInt run_thread_for_a_while ( ThreadId tid )
{
volatile Int jumped;
- volatile ThreadState* tst;=20
+ volatile ThreadState* tst =3D NULL; /* stop gcc complaining */
volatile UInt trc;
volatile Int dispatch_ctr_SAVED;
volatile Int done_this_time;
Modified: trunk/coregrind/m_stacktrace.c
=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
--- trunk/coregrind/m_stacktrace.c 2006-01-12 14:04:46 UTC (rev 5522)
+++ trunk/coregrind/m_stacktrace.c 2006-01-12 21:15:35 UTC (rev 5523)
@@ -389,8 +389,10 @@
mybuf[MYBUF_LEN-1] =3D 0; // paranoia
if ( VG_STREQ("main", mybuf)
# if defined(VGO_linux)
- || VG_STREQ("__libc_start_main", mybuf) // glibc glibness
- || VG_STREQ("generic_start_main", mybuf) // Yellow Dog dog=
gedness
+ || VG_STREQ("__libc_start_main", mybuf) // glibc glibnes=
s
+ || VG_STREQ("generic_start_main", mybuf) // Yellow Dog do=
ggedness
+ || VG_STREQ(".__libc_start_main", mybuf) // ppc64 dottyne=
ss
+ || VG_STREQ(".generic_start_main", mybuf) // ditto
# endif
)
main_done =3D True;
Modified: trunk/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
--- trunk/coregrind/m_trampoline.S 2006-01-12 14:04:46 UTC (rev 5522)
+++ trunk/coregrind/m_trampoline.S 2006-01-12 21:15:35 UTC (rev 5523)
@@ -299,25 +299,21 @@
/* a leading page of unexecutable code */
UD2_PAGE
=20
-.align 2
.global VG_(trampoline_stuff_start)
-.section ".opd","aw"
-.align 3
VG_(trampoline_stuff_start):
-.quad .VG_(trampoline_stuff_start),.TOC.@tocbase,0
-.previous
-.type .VG_(trampoline_stuff_start),@function
-.global .VG_(trampoline_stuff_start)
-.VG_(trampoline_stuff_start):
=20
-.align 2
-.globl VG_(ppc64_linux_REDIR_FOR_strlen)
-.section ".opd","aw"
-.align 3
+ /* this function is written using the "dotless" ABI convention */
+ .align 2
+ .globl VG_(ppc64_linux_REDIR_FOR_strlen)
+ .section ".opd","aw"
+ .align 3
VG_(ppc64_linux_REDIR_FOR_strlen):
-.quad .L.VG_(ppc64_linux_REDIR_FOR_strlen),.TOC.@tocbase
-.previous
-.type VG_(ppc64_linux_REDIR_FOR_strlen), @function
+ .quad .L.VG_(ppc64_linux_REDIR_FOR_strlen),.TOC.@tocbase,0
+ .previous
+ .size VG_(ppc64_linux_REDIR_FOR_strlen), \
+ .L0end-.L.VG_(ppc64_linux_REDIR_FOR_strlen)
+ .type VG_(ppc64_linux_REDIR_FOR_strlen), @function
+
.L.VG_(ppc64_linux_REDIR_FOR_strlen):
mr 9,3
lbz 0,0(3)
@@ -325,27 +321,51 @@
cmpwi 7,0,0
beqlr 7
li 3,0
-.L5:
+.L01:
addi 0,3,1
extsw 3,0
lbzx 0,9,3
cmpwi 7,0,0
- bne 7,.L5
+ bne 7,.L01
blr
.long 0
.byte 0,0,0,0,0,0,0,0
- .size VG_(ppc64_linux_REDIR_FOR_strlen),.-.L.VG_(ppc64_linux_R=
EDIR_FOR_strlen)
+.L0end:
=20
-.align 2
+ /* this function is written using the "dotless" ABI convention *=
/
+ .align 2
+ .globl VG_(ppc64_linux_REDIR_FOR_strchr)
+ .section ".opd","aw"
+ .align 3
+VG_(ppc64_linux_REDIR_FOR_strchr):
+ .quad .L.VG_(ppc64_linux_REDIR_FOR_strchr),.TOC.@tocbase,0
+ .previous
+ .size VG_(ppc64_linux_REDIR_FOR_strchr), \
+ .L1end-.L.VG_(ppc64_linux_REDIR_FOR_strchr)
+ .type VG_(ppc64_linux_REDIR_FOR_strchr),@function
+=09
+.L.VG_(ppc64_linux_REDIR_FOR_strchr):
+ rldicl 4,4,0,56
+ li 9,0
+.L11:
+ lbz 0,0(3)
+ cmpw 7,0,4
+ bne+ 7,.L12
+ mr 9,3
+.L12:
+ lbz 0,0(3)
+ addi 3,3,1
+ cmpwi 7,0,0
+ bne+ 7,.L11
+ mr 3,9
+ blr
+ .long 0
+ .byte 0,0,0,0,0,0,0,0
+.L1end:
+
+=09
.global VG_(trampoline_stuff_end)
-.section ".opd","aw"
-.align 3
VG_(trampoline_stuff_end):
-.quad .VG_(trampoline_stuff_end),.TOC.@tocbase,0
-.previous
-.type .VG_(trampoline_stuff_end),@function
-.global .VG_(trampoline_stuff_end)
-.VG_(trampoline_stuff_end):
=20
/* and a trailing page of unexecutable code */
UD2_PAGE
Modified: trunk/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
--- trunk/coregrind/pub_core_trampoline.h 2006-01-12 14:04:46 UTC (rev 55=
22)
+++ trunk/coregrind/pub_core_trampoline.h 2006-01-12 21:15:35 UTC (rev 55=
23)
@@ -68,6 +68,7 @@
=20
#if defined(VGP_ppc64_linux)
extern UInt VG_(ppc64_linux_REDIR_FOR_strlen)( void* );
+extern void* VG_(ppc64_linux_REDIR_FOR_strchr)( void*, Int );
#endif
=20
#endif // __PUB_CORE_TRAMPOLINE_H
Modified: trunk/include/valgrind.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
--- trunk/include/valgrind.h 2006-01-12 14:04:46 UTC (rev 5522)
+++ trunk/include/valgrind.h 2006-01-12 21:15:35 UTC (rev 5523)
@@ -163,7 +163,7 @@
#if defined(ARCH_x86)
#define __SPECIAL_INSTRUCTION_PREAMBLE \
"roll $3, %%edi ; roll $13, %%edi\n\t" \
- "roll $29, %%edi ; roll $19, %%edi\n\t" \
+ "roll $29, %%edi ; roll $19, %%edi\n\t"
=20
#define VALGRIND_DO_CLIENT_REQUEST( \
_zzq_rlval, _zzq_default, _zzq_request, \
@@ -208,7 +208,7 @@
#if defined(ARCH_amd64)
#define __SPECIAL_INSTRUCTION_PREAMBLE \
"rolq $3, %%rdi ; rolq $13, %%rdi\n\t" \
- "rolq $61, %%rdi ; rolq $51, %%rdi\n\t" \
+ "rolq $61, %%rdi ; rolq $51, %%rdi\n\t"
=20
#define VALGRIND_DO_CLIENT_REQUEST( \
_zzq_rlval, _zzq_default, _zzq_request, \
@@ -253,15 +253,15 @@
#if defined(ARCH_ppc32)
#define __SPECIAL_INSTRUCTION_PREAMBLE \
"rlwinm 0,0,3,0,0 ; rlwinm 0,0,13,0,0\n\t" \
- "rlwinm 0,0,29,0,0 ; rlwinm 0,0,19,0,0\n\t" \
+ "rlwinm 0,0,29,0,0 ; rlwinm 0,0,19,0,0\n\t"
=20
#define VALGRIND_DO_CLIENT_REQUEST( \
_zzq_rlval, _zzq_default, _zzq_request, \
_zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4) \
\
- { volatile unsigned int _zzq_args[5]; \
- register unsigned int _zzq_result __asm__("r3"); \
- register volatile unsigned int *_zzq_ptr __asm__("r4"); \
+ { unsigned int _zzq_args[5]; \
+ register unsigned int _zzq_result __asm__("r3"); \
+ register unsigned int* _zzq_ptr __asm__("r4"); \
_zzq_args[0] =3D (unsigned int)(_zzq_request); \
_zzq_args[1] =3D (unsigned int)(_zzq_arg1); \
_zzq_args[2] =3D (unsigned int)(_zzq_arg2); \
@@ -298,30 +298,49 @@
/* --------------------------- ppc64 --------------------------- */
=20
#if defined(ARCH_ppc64)
+#define __SPECIAL_INSTRUCTION_PREAMBLE \
+ "rotldi 0,0,3 ; rotldi 0,0,13\n\t" \
+ "rotldi 0,0,61 ; rotldi 0,0,51\n\t"
+
#define VALGRIND_DO_CLIENT_REQUEST( \
_zzq_rlval, _zzq_default, _zzq_request, \
_zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4) \
\
- { volatile unsigned long long int _zzq_args[5]; \
- register unsigned long long int _zzq_tmp __asm__("r3"); \
- register volatile unsigned long long int *_zzq_ptr __asm__("r4"); \
- _zzq_args[0] =3D (volatile unsigned long long int)(_zzq_request); =
\
- _zzq_args[1] =3D (volatile unsigned long long int)(_zzq_arg1); \
- _zzq_args[2] =3D (volatile unsigned long long int)(_zzq_arg2); \
- _zzq_args[3] =3D (volatile unsigned long long int)(_zzq_arg3); \
- _zzq_args[4] =3D (volatile unsigned long long int)(_zzq_arg4); \
+ { unsigned long long int _zzq_args[5]; \
+ register unsigned long long int _zzq_result __asm__("r3"); \
+ register unsigned long long int* _zzq_ptr __asm__("r4"); \
+ _zzq_args[0] =3D (unsigned long long int)(_zzq_request); \
+ _zzq_args[1] =3D (unsigned long long int)(_zzq_arg1); \
+ _zzq_args[2] =3D (unsigned long long int)(_zzq_arg2); \
+ _zzq_args[3] =3D (unsigned long long int)(_zzq_arg3); \
+ _zzq_args[4] =3D (unsigned long long int)(_zzq_arg4); \
_zzq_ptr =3D _zzq_args; \
- __asm__ volatile("tw 0,3,27\n\t" \
- "rotldi 0,0,61\n\t" \
- "rotldi 0,0,3\n\t" \
- "rotldi 0,0,13\n\t" \
- "rotldi 0,0,51\n\t" \
- "nop\n\t" \
- : "=3Dr" (_zzq_tmp) \
+ __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
+ /* %R3 =3D client_request ( %R4 ) */ \
+ "or 1,1,1" \
+ : "=3Dr" (_zzq_result) \
: "0" (_zzq_default), "r" (_zzq_ptr) \
- : "memory"); \
- _zzq_rlval =3D (__typeof__(_zzq_rlval)) _zzq_tmp; \
+ : "cc", "memory"); \
+ _zzq_rlval =3D _zzq_result; \
}
+
+#define VALGRIND_GET_NRADDR(_zzq_rlval) \
+ { register unsigned long long int __addr __asm__("r3"); \
+ __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
+ /* %R3 =3D guest_NRADDR */ \
+ "or 2,2,2" \
+ : "=3Dr" (__addr) \
+ : \
+ : "cc", "memory" \
+ ); \
+ _zzq_rlval =3D (void*)__addr; \
+ }
+
+#define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
+ __SPECIAL_INSTRUCTION_PREAMBLE \
+ /* branch-and-link-to-noredir *%R11 */ \
+ "or 3,3,3\n\t"
+
#endif /* ARCH_ppc64 */
=20
/* Insert assembly code for other architectures here... */
|