You can subscribe to this list here.
| 2002 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
(1) |
Oct
(122) |
Nov
(152) |
Dec
(69) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2003 |
Jan
(6) |
Feb
(25) |
Mar
(73) |
Apr
(82) |
May
(24) |
Jun
(25) |
Jul
(10) |
Aug
(11) |
Sep
(10) |
Oct
(54) |
Nov
(203) |
Dec
(182) |
| 2004 |
Jan
(307) |
Feb
(305) |
Mar
(430) |
Apr
(312) |
May
(187) |
Jun
(342) |
Jul
(487) |
Aug
(637) |
Sep
(336) |
Oct
(373) |
Nov
(441) |
Dec
(210) |
| 2005 |
Jan
(385) |
Feb
(480) |
Mar
(636) |
Apr
(544) |
May
(679) |
Jun
(625) |
Jul
(810) |
Aug
(838) |
Sep
(634) |
Oct
(521) |
Nov
(965) |
Dec
(543) |
| 2006 |
Jan
(494) |
Feb
(431) |
Mar
(546) |
Apr
(411) |
May
(406) |
Jun
(322) |
Jul
(256) |
Aug
(401) |
Sep
(345) |
Oct
(542) |
Nov
(308) |
Dec
(481) |
| 2007 |
Jan
(427) |
Feb
(326) |
Mar
(367) |
Apr
(255) |
May
(244) |
Jun
(204) |
Jul
(223) |
Aug
(231) |
Sep
(354) |
Oct
(374) |
Nov
(497) |
Dec
(362) |
| 2008 |
Jan
(322) |
Feb
(482) |
Mar
(658) |
Apr
(422) |
May
(476) |
Jun
(396) |
Jul
(455) |
Aug
(267) |
Sep
(280) |
Oct
(253) |
Nov
(232) |
Dec
(304) |
| 2009 |
Jan
(486) |
Feb
(470) |
Mar
(458) |
Apr
(423) |
May
(696) |
Jun
(461) |
Jul
(551) |
Aug
(575) |
Sep
(134) |
Oct
(110) |
Nov
(157) |
Dec
(102) |
| 2010 |
Jan
(226) |
Feb
(86) |
Mar
(147) |
Apr
(117) |
May
(107) |
Jun
(203) |
Jul
(193) |
Aug
(238) |
Sep
(300) |
Oct
(246) |
Nov
(23) |
Dec
(75) |
| 2011 |
Jan
(133) |
Feb
(195) |
Mar
(315) |
Apr
(200) |
May
(267) |
Jun
(293) |
Jul
(353) |
Aug
(237) |
Sep
(278) |
Oct
(611) |
Nov
(274) |
Dec
(260) |
| 2012 |
Jan
(303) |
Feb
(391) |
Mar
(417) |
Apr
(441) |
May
(488) |
Jun
(655) |
Jul
(590) |
Aug
(610) |
Sep
(526) |
Oct
(478) |
Nov
(359) |
Dec
(372) |
| 2013 |
Jan
(467) |
Feb
(226) |
Mar
(391) |
Apr
(281) |
May
(299) |
Jun
(252) |
Jul
(311) |
Aug
(352) |
Sep
(481) |
Oct
(571) |
Nov
(222) |
Dec
(231) |
| 2014 |
Jan
(185) |
Feb
(329) |
Mar
(245) |
Apr
(238) |
May
(281) |
Jun
(399) |
Jul
(382) |
Aug
(500) |
Sep
(579) |
Oct
(435) |
Nov
(487) |
Dec
(256) |
| 2015 |
Jan
(338) |
Feb
(357) |
Mar
(330) |
Apr
(294) |
May
(191) |
Jun
(108) |
Jul
(142) |
Aug
(261) |
Sep
(190) |
Oct
(54) |
Nov
(83) |
Dec
(22) |
| 2016 |
Jan
(49) |
Feb
(89) |
Mar
(33) |
Apr
(50) |
May
(27) |
Jun
(34) |
Jul
(53) |
Aug
(53) |
Sep
(98) |
Oct
(206) |
Nov
(93) |
Dec
(53) |
| 2017 |
Jan
(65) |
Feb
(82) |
Mar
(102) |
Apr
(86) |
May
(187) |
Jun
(67) |
Jul
(23) |
Aug
(93) |
Sep
(65) |
Oct
(45) |
Nov
(35) |
Dec
(17) |
| 2018 |
Jan
(26) |
Feb
(35) |
Mar
(38) |
Apr
(32) |
May
(8) |
Jun
(43) |
Jul
(27) |
Aug
(30) |
Sep
(43) |
Oct
(42) |
Nov
(38) |
Dec
(67) |
| 2019 |
Jan
(32) |
Feb
(37) |
Mar
(53) |
Apr
(64) |
May
(49) |
Jun
(18) |
Jul
(14) |
Aug
(53) |
Sep
(25) |
Oct
(30) |
Nov
(49) |
Dec
(31) |
| 2020 |
Jan
(87) |
Feb
(45) |
Mar
(37) |
Apr
(51) |
May
(99) |
Jun
(36) |
Jul
(11) |
Aug
(14) |
Sep
(20) |
Oct
(24) |
Nov
(40) |
Dec
(23) |
| 2021 |
Jan
(14) |
Feb
(53) |
Mar
(85) |
Apr
(15) |
May
(19) |
Jun
(3) |
Jul
(14) |
Aug
(1) |
Sep
(57) |
Oct
(73) |
Nov
(56) |
Dec
(22) |
| 2022 |
Jan
(3) |
Feb
(22) |
Mar
(6) |
Apr
(55) |
May
(46) |
Jun
(39) |
Jul
(15) |
Aug
(9) |
Sep
(11) |
Oct
(34) |
Nov
(20) |
Dec
(36) |
| 2023 |
Jan
(79) |
Feb
(41) |
Mar
(99) |
Apr
(169) |
May
(48) |
Jun
(16) |
Jul
(16) |
Aug
(57) |
Sep
(19) |
Oct
|
Nov
|
Dec
|
| S | M | T | W | T | F | S |
|---|---|---|---|---|---|---|
|
1
(10) |
2
(22) |
3
(15) |
4
(14) |
5
(8) |
6
(10) |
7
(14) |
|
8
(9) |
9
(10) |
10
(21) |
11
(16) |
12
(17) |
13
(15) |
14
(8) |
|
15
(12) |
16
(8) |
17
(44) |
18
(24) |
19
(29) |
20
(29) |
21
(17) |
|
22
(17) |
23
(16) |
24
(18) |
25
(16) |
26
(15) |
27
(16) |
28
(11) |
|
29
(11) |
30
(10) |
31
(12) |
|
|
|
|
|
From: <sv...@va...> - 2006-01-03 18:04:42
|
Author: dirk
Date: 2006-01-03 18:04:32 +0000 (Tue, 03 Jan 2006)
New Revision: 5491
Log:
update suppression for newer versions of Xorg
Modified:
trunk/xfree-4.supp
Modified: trunk/xfree-4.supp
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=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/xfree-4.supp 2006-01-03 14:28:02 UTC (rev 5490)
+++ trunk/xfree-4.supp 2006-01-03 18:04:32 UTC (rev 5491)
@@ -183,5 +183,16 @@
fun:_XSend
}
=20
+{
+ Xorg 6.9.0 writev uninit padding
+ Memcheck:Param
+ writev(vector[...])
+ fun:do_writev
+ fun:writev
+ obj:/usr/X11R6/lib*/libX11.so.6.2
+ fun:_X11TransWritev
+ fun:_XSend
+}
+
##----------------------------------------------------------------------=
##
=20
|
|
From: <sv...@va...> - 2006-01-03 14:28:08
|
Author: cerion
Date: 2006-01-03 14:28:02 +0000 (Tue, 03 Jan 2006)
New Revision: 5490
Log:
Tidy up some ppc64 assembly & comments a little.
Modified:
trunk/coregrind/m_syswrap/syswrap-ppc64-linux.c
Modified: trunk/coregrind/m_syswrap/syswrap-ppc64-linux.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_syswrap/syswrap-ppc64-linux.c 2006-01-03 14:20:36 U=
TC (rev 5489)
+++ trunk/coregrind/m_syswrap/syswrap-ppc64-linux.c 2006-01-03 14:28:02 U=
TC (rev 5490)
@@ -140,7 +140,7 @@
pid_t* parent_tid in r8
void* ??? in r9
=20
- Note: r3 contains fn ptr, not fn entry ptr -- needs toc deref
+ Note: r3 contains fn desc ptr, not fn ptr -- p_fn =3D p_fn_desc[=
0]
System call requires:
=20
int $__NR_clone in r0 (sc number)
@@ -185,7 +185,8 @@
=20
// setup child stack
" rldicr 4,4, 0,59\n" // trim sp to multiple of 16 bytes
-" li 0,0\n" // (r4 &=3D ~0xF)
+ // (r4 &=3D ~0xF)
+" li 0,0\n"
" stdu 0,-32(4)\n" // make initial stack frame
" mr 29,4\n" // preserve sp
=20
@@ -202,13 +203,10 @@
" sc\n" // clone()
=20
" mfcr 4\n" // CR now in low half r4
-" sldi 4,4,16\n"
-" sldi 4,4,16\n" // CR now in hi half r4
+" sldi 4,4,32\n" // CR now in hi half r4
=20
-" sldi 3,3,16\n"
-" sldi 3,3,16\n"
-" srdi 3,3,16\n"
-" srdi 3,3,16\n" // zero out hi half r3
+" sldi 3,3,32\n"
+" srdi 3,3,32\n" // zero out hi half r3
=20
" or 3,3,4\n" // r3 =3D CR : syscall-retval
" cmpwi 3,0\n" // child if retval =3D=3D 0 (note, =
cmpw)
@@ -220,7 +218,7 @@
That does leave a small window for a signal to be delivered
on the wrong stack, unfortunately. */
" mr 1,29\n"
-" ld 30, 0(30)\n" // convert fn ptr to fn entry
+" ld 30, 0(30)\n" // convert fn desc ptr to fn ptr
" mtctr 30\n" // ctr reg =3D fn
" mr 3,31\n" // r3 =3D arg
" bctrl\n" // call fn()
|
|
From: <sv...@va...> - 2006-01-03 14:20:41
|
Author: cerion Date: 2006-01-03 14:20:36 +0000 (Tue, 03 Jan 2006) New Revision: 5489 Log: couple more svn:ignore's Modified: trunk/perf/ Property changes on: trunk/perf ___________________________________________________________________ Name: svn:ignore - .deps Makefile Makefile.in fbench vg_perf ffbench bz2 sarp bigcode + .deps Makefile Makefile.in fbench vg_perf ffbench bz2 sarp bigcode tinycc heap |
|
From: <sv...@va...> - 2006-01-03 14:08:37
|
Author: cerion Date: 2006-01-03 14:08:26 +0000 (Tue, 03 Jan 2006) New Revision: 5488 Log: Add ppc64 int,fp,vmx regtest: jm-insns (test code is a symlink to ppc32/jm-insns.c) Added: trunk/none/tests/ppc64/filter_stderr trunk/none/tests/ppc64/jm-fp.stderr.exp trunk/none/tests/ppc64/jm-fp.stdout.exp trunk/none/tests/ppc64/jm-fp.vgtest trunk/none/tests/ppc64/jm-insns.c trunk/none/tests/ppc64/jm-int.stderr.exp trunk/none/tests/ppc64/jm-int.stdout.exp trunk/none/tests/ppc64/jm-int.vgtest trunk/none/tests/ppc64/jm-vmx.stderr.exp trunk/none/tests/ppc64/jm-vmx.stdout.exp trunk/none/tests/ppc64/jm-vmx.vgtest Modified: trunk/none/tests/ppc64/Makefile.am [... diff too large to include ...] |
|
From: <sv...@va...> - 2006-01-03 12:55:51
|
Author: cerion
Date: 2006-01-03 12:55:40 +0000 (Tue, 03 Jan 2006)
New Revision: 5487
Log:
Update ppc32 jm-insns regtest to test ppc64 insns, if built with -m64.
Modified:
trunk/none/tests/ppc32/jm-insns.c
Modified: trunk/none/tests/ppc32/jm-insns.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/none/tests/ppc32/jm-insns.c 2006-01-03 11:47:38 UTC (rev 5486)
+++ trunk/none/tests/ppc32/jm-insns.c 2006-01-03 12:55:40 UTC (rev 5487)
@@ -1,7 +1,10 @@
=20
/* HOW TO COMPILE:
=20
-gcc -Winline -Wall -O -mregnames -DHAS_ALTIVEC -maltivec=20
+* 32bit build:
+ gcc -Winline -Wall -g -O -mregnames -DHAS_ALTIVEC -maltivec
+* 64bit build:
+ gcc -Winline -Wall -g -O -mregnames -DHAS_ALTIVEC -maltivec -m64
=20
This program is useful, but the register usage conventions in
it are a complete dog. In particular, _patch_op_imm has to
@@ -167,7 +170,11 @@
=20
/* Something of the same size as void*, so can be safely be coerced
to/from a pointer type. Also same size as the host's gp registers. */
+#ifndef __powerpc64__
typedef uint32_t HWord_t;
+#else
+typedef uint64_t HWord_t;
+#endif // #ifndef __powerpc64__
=20
=20
register double f14 __asm__ ("f14");
@@ -197,6 +204,7 @@
=20
=20
=20
+#ifndef __powerpc64__
#define ASSEMBLY_FUNC(__fname, __insn) \
asm(".section \".text\"\n" \
"\t.align 2\n" \
@@ -206,6 +214,23 @@
"\tblr\n" \
"\t.previous\n" \
)
+#else
+#define ASSEMBLY_FUNC(__fname, __insn) \
+asm(".section \".text\"\n" \
+ "\t.align 2\n" \
+ "\t.global "__fname"\n" \
+ "\t.section \".opd\",\"aw\"\n" \
+ "\t.align 3\n" \
+ ""__fname":\n" \
+ "\t.quad ."__fname",.TOC.@tocbase,0\n" \
+ "\t.previous\n" \
+ "\t.type ."__fname",@function\n" \
+ "\t.global ."__fname"\n" \
+ "."__fname":\n" \
+ "\t"__insn"\n" \
+ "\tblr\n" \
+ )
+#endif // #ifndef __powerpc64__
=20
=20
=20
@@ -432,6 +457,33 @@
__asm__ __volatile__ ("subfco 17, 14, 15");
}
=20
+#ifdef __powerpc64__
+static void test_mulld (void)
+{
+ __asm__ __volatile__ ("mulld 17, 14, 15");
+}
+
+static void test_mulhd (void)
+{
+ __asm__ __volatile__ ("mulhd 17, 14, 15");
+}
+
+static void test_mulhdu (void)
+{
+ __asm__ __volatile__ ("mulhdu 17, 14, 15");
+}
+
+static void test_divd (void)
+{
+ __asm__ __volatile__ ("divd 17, 14, 15");
+}
+
+static void test_divdu (void)
+{
+ __asm__ __volatile__ ("divdu 17, 14, 15");
+}
+#endif // #ifdef __powerpc64__
+
static test_t tests_ia_ops_two[] =3D {
{ &test_add , " add", },
{ &test_addo , " addo", },
@@ -449,6 +501,13 @@
{ &test_subfo , " subfo", },
{ &test_subfc , " subfc", },
{ &test_subfco , " subfco", },
+#ifdef __powerpc64__
+ { &test_mulhd , " mulhd", },
+ { &test_mulhdu , " mulhdu", },
+ { &test_mulld , " mulld", },
+ { &test_divd , " divd", },
+ { &test_divdu , " divdu", },
+#endif // #ifdef __powerpc64__
{ NULL, NULL, },
};
=20
@@ -532,6 +591,33 @@
__asm__ __volatile__ ("subfco. 17, 14, 15");
}
=20
+#ifdef __powerpc64__
+static void test_mulhd_ (void)
+{
+ __asm__ __volatile__ ("mulhd. 17, 14, 15");
+}
+
+static void test_mulhdu_ (void)
+{
+ __asm__ __volatile__ ("mulhdu. 17, 14, 15");
+}
+
+static void test_mulld_ (void)
+{
+ __asm__ __volatile__ ("mulld. 17, 14, 15");
+}
+
+static void test_divd_ (void)
+{
+ __asm__ __volatile__ ("divd. 17, 14, 15");
+}
+
+static void test_divdu_ (void)
+{
+ __asm__ __volatile__ ("divdu. 17, 14, 15");
+}
+#endif // #ifdef __powerpc64__
+
static test_t tests_iar_ops_two[] =3D {
{ &test_add_ , " add.", },
{ &test_addo_ , " addo.", },
@@ -549,6 +635,13 @@
{ &test_subfo_ , " subfo.", },
{ &test_subfc_ , " subfc.", },
{ &test_subfco_ , " subfco.", },
+#ifdef __powerpc64__
+ { &test_mulhd_ , " mulhd.", },
+ { &test_mulhdu_ , " mulhdu.", },
+ { &test_mulld_ , " mulld.", },
+ { &test_divd_ , " divd.", },
+ { &test_divdu_ , " divdu.", },
+#endif // #ifdef __powerpc64__
{ NULL, NULL, },
};
=20
@@ -663,6 +756,23 @@
__asm__ __volatile__ ("srw 17, 14, 15");
}
=20
+#ifdef __powerpc64__
+static void test_sld (void)
+{
+ __asm__ __volatile__ ("sld 17, 14, 15");
+}
+
+static void test_srad (void)
+{
+ __asm__ __volatile__ ("srad 17, 14, 15");
+}
+
+static void test_srd (void)
+{
+ __asm__ __volatile__ ("srd 17, 14, 15");
+}
+#endif // #ifdef __powerpc64__
+
static test_t tests_il_ops_two[] =3D {
{ &test_and , " and", },
{ &test_andc , " andc", },
@@ -675,6 +785,11 @@
{ &test_slw , " slw", },
{ &test_sraw , " sraw", },
{ &test_srw , " srw", },
+#ifdef __powerpc64__
+ { &test_sld , " sld", },
+ { &test_srad , " srad", },
+ { &test_srd , " srd", },
+#endif // #ifdef __powerpc64__
{ NULL, NULL, },
};
=20
@@ -733,6 +848,23 @@
__asm__ __volatile__ ("srw. 17, 14, 15");
}
=20
+#ifdef __powerpc64__
+static void test_sld_ (void)
+{
+ __asm__ __volatile__ ("sld. 17, 14, 15");
+}
+
+static void test_srad_ (void)
+{
+ __asm__ __volatile__ ("srad. 17, 14, 15");
+}
+
+static void test_srd_ (void)
+{
+ __asm__ __volatile__ ("srd. 17, 14, 15");
+}
+#endif // #ifdef __powerpc64__
+
static test_t tests_ilr_ops_two[] =3D {
{ &test_and_ , " and.", },
{ &test_andc_ , " andc.", },
@@ -745,6 +877,11 @@
{ &test_slw_ , " slw.", },
{ &test_sraw_ , " sraw.", },
{ &test_srw_ , " srw.", },
+#ifdef __powerpc64__
+ { &test_sld_ , " sld.", },
+ { &test_srad_ , " srad.", },
+ { &test_srd_ , " srd.", },
+#endif // #ifdef __powerpc64__
{ NULL, NULL, },
};
=20
@@ -758,9 +895,25 @@
__asm__ __volatile__ ("cmplw 2, 14, 15");
}
=20
+#ifdef __powerpc64__
+static void test_cmpd (void)
+{
+ __asm__ __volatile__ ("cmpd 2, 14, 15");
+}
+
+static void test_cmpld (void)
+{
+ __asm__ __volatile__ ("cmpld 2, 14, 15");
+}
+#endif // #ifdef __powerpc64__
+
static test_t tests_icr_ops_two[] =3D {
{ &test_cmpw , " cmpw", },
{ &test_cmplw , " cmplw", },
+#ifdef __powerpc64__
+ { &test_cmpd , " cmpd", },
+ { &test_cmpld , " cmpld", },
+#endif // #ifdef __powerpc64__
{ NULL, NULL, },
};
=20
@@ -770,9 +923,21 @@
extern void test_cmplwi (void);
ASSEMBLY_FUNC("test_cmplwi", "cmplwi 2, 14, 0");
=20
+#ifdef __powerpc64__
+extern void test_cmpdi (void);
+ASSEMBLY_FUNC("test_cmpdi", "cmpdi 2, 14, 0");
+
+extern void test_cmpldi (void);
+ASSEMBLY_FUNC("test_cmpldi", "cmpldi 2, 14, 0");
+#endif // #ifdef __powerpc64__
+
static test_t tests_icr_ops_two_i16[] =3D {
{ &test_cmpwi , " cmpwi", },
{ &test_cmplwi , " cmplwi", },
+#ifdef __powerpc64__
+ { &test_cmpdi , " cmpdi", },
+ { &test_cmpldi , " cmpldi", },
+#endif // #ifdef __powerpc64__
{ NULL, NULL, },
};
=20
@@ -1021,12 +1186,28 @@
__asm__ __volatile__ ("nego 17, 14");
}
=20
+#ifdef __powerpc64__
+static void test_cntlzd (void)
+{
+ __asm__ __volatile__ ("cntlzd 17, 14");
+}
+
+static void test_extsw (void)
+{
+ __asm__ __volatile__ ("extsw 17, 14");
+}
+#endif // #ifdef __powerpc64__
+
static test_t tests_il_ops_one[] =3D {
{ &test_cntlzw , " cntlzw", },
{ &test_extsb , " extsb", },
{ &test_extsh , " extsh", },
{ &test_neg , " neg", },
{ &test_nego , " nego", },
+#ifdef __powerpc64__
+ { &test_cntlzd , " cntlzd", },
+ { &test_extsw , " extsw", },
+#endif // #ifdef __powerpc64__
{ NULL, NULL, },
};
=20
@@ -1055,12 +1236,28 @@
__asm__ __volatile__ ("nego. 17, 14");
}
=20
+#ifdef __powerpc64__
+static void test_cntlzd_ (void)
+{
+ __asm__ __volatile__ ("cntlzd. 17, 14");
+}
+
+static void test_extsw_ (void)
+{
+ __asm__ __volatile__ ("extsw. 17, 14");
+}
+#endif // #ifdef __powerpc64__
+
static test_t tests_ilr_ops_one[] =3D {
{ &test_cntlzw_ , " cntlzw.", },
{ &test_extsb_ , " extsb.", },
{ &test_extsh_ , " extsh.", },
{ &test_neg_ , " neg.", },
{ &test_nego_ , " nego.", },
+#ifdef __powerpc64__
+ { &test_cntlzd_ , " cntlzd.", },
+ { &test_extsw_ , " extsw.", },
+#endif // #ifdef __powerpc64__
{ NULL, NULL, },
};
=20
@@ -1091,6 +1288,29 @@
__asm__ __volatile__ ("mtspr 1, 14");
}
=20
+#ifdef __powerpc64__
+extern void test_rldcl (void);
+ASSEMBLY_FUNC("test_rldcl", "rldcl 17, 14, 15, 0");
+
+extern void test_rldcr (void);
+ASSEMBLY_FUNC("test_rldcr", "rldcr 17, 14, 15, 0");
+
+extern void test_rldic (void);
+ASSEMBLY_FUNC("test_rldic", "rldic 17, 14, 0, 0");
+
+extern void test_rldicl (void);
+ASSEMBLY_FUNC("test_rldicl", "rldicl 17, 14, 0, 0");
+
+extern void test_rldicr (void);
+ASSEMBLY_FUNC("test_rldicr", "rldicr 17, 14, 0, 0");
+
+extern void test_rldimi (void);
+ASSEMBLY_FUNC("test_rldimi", "rldimi 17, 14, 0, 0");
+
+extern void test_sradi (void);
+ASSEMBLY_FUNC("test_sradi", "sradi 17, 14, 0");
+#endif // #ifdef __powerpc64__
+
static test_t tests_il_ops_spe[] =3D {
{ &test_rlwimi , " rlwimi", },
{ &test_rlwinm , " rlwinm", },
@@ -1099,6 +1319,15 @@
{ &test_mfcr , " mfcr", },
{ &test_mfspr , " mfspr", },
{ &test_mtspr , " mtspr", },
+#ifdef __powerpc64__
+ { &test_rldcl , " rldcl", },
+ { &test_rldcr , " rldcr", },
+ { &test_rldic , " rldic", },
+ { &test_rldicl , " rldicl", },
+ { &test_rldicr , " rldicr", },
+ { &test_rldimi , " rldimi", },
+ { &test_sradi , " sradi", },
+#endif // #ifdef __powerpc64__
{ NULL, NULL, },
};
=20
@@ -1123,6 +1352,29 @@
extern void test_mtcrf (void);
ASSEMBLY_FUNC("test_mtcrf", "mtcrf 0, 14");
=20
+#ifdef __powerpc64__
+extern void test_rldcl_ (void);
+ASSEMBLY_FUNC("test_rldcl_", "rldcl. 17, 14, 15, 0");
+
+extern void test_rldcr_ (void);
+ASSEMBLY_FUNC("test_rldcr_", "rldcr. 17, 14, 15, 0");
+
+extern void test_rldic_ (void);
+ASSEMBLY_FUNC("test_rldic_", "rldic. 17, 14, 0, 0");
+
+extern void test_rldicl_ (void);
+ASSEMBLY_FUNC("test_rldicl_", "rldicl. 17, 14, 0, 0");
+
+extern void test_rldicr_ (void);
+ASSEMBLY_FUNC("test_rldicr_", "rldicr. 17, 14, 0, 0");
+
+extern void test_rldimi_ (void);
+ASSEMBLY_FUNC("test_rldimi_", "rldimi. 17, 14, 0, 0");
+
+extern void test_sradi_ (void);
+ASSEMBLY_FUNC("test_sradi_", "sradi. 17, 14, 0");
+#endif // #ifdef __powerpc64__
+
static test_t tests_ilr_ops_spe[] =3D {
{ &test_rlwimi_ , " rlwimi.", },
{ &test_rlwinm_ , " rlwinm.", },
@@ -1131,6 +1383,15 @@
{ &test_mcrf , " mcrf", },
{ &test_mcrxr , " mcrxr", },
{ &test_mtcrf , " mtcrf", },
+#ifdef __powerpc64__
+ { &test_rldcl_ , " rldcl.", },
+ { &test_rldcr_ , " rldcr.", },
+ { &test_rldic_ , " rldic.", },
+ { &test_rldicl_ , " rldicl.", },
+ { &test_rldicr_ , " rldicr.", },
+ { &test_rldimi_ , " rldimi.", },
+ { &test_sradi_ , " sradi.", },
+#endif // #ifdef __powerpc64__
{ NULL, NULL, },
};
=20
@@ -1158,6 +1419,17 @@
extern void test_lwzu (void);
ASSEMBLY_FUNC("test_lwzu", "lwzu 17,0(14)");
=20
+#ifdef __powerpc64__
+extern void test_ld (void);
+ASSEMBLY_FUNC("test_ld", "ld 17,0(14)");
+
+extern void test_ldu (void);
+ASSEMBLY_FUNC("test_ldu", "ldu 17,0(14)");
+
+extern void test_lwa (void);
+ASSEMBLY_FUNC("test_lwa", "lwa 17,0(14)");
+#endif // #ifdef __powerpc64__
+
static test_t tests_ild_ops_two_i16[] =3D {
{ &test_lbz , " lbz", },
{ &test_lbzu , " lbzu", },
@@ -1167,6 +1439,11 @@
{ &test_lhzu , " lhzu", },
{ &test_lwz , " lwz", },
{ &test_lwzu , " lwzu", },
+#ifdef __powerpc64__
+ { &test_ld , " ld", },
+ { &test_ldu , " ldu", },
+ { &test_lwa , " lwa", },
+#endif // #ifdef __powerpc64__
{ NULL, NULL, },
};
=20
@@ -1210,6 +1487,28 @@
__asm__ __volatile__ ("lwzux 17,14,15");
}
=20
+#ifdef __powerpc64__
+static void test_ldx (void)
+{
+ __asm__ __volatile__ ("ldx 17,14,15");
+}
+
+static void test_ldux (void)
+{
+ __asm__ __volatile__ ("ldux 17,14,15");
+}
+
+static void test_lwax (void)
+{
+ __asm__ __volatile__ ("lwax 17,14,15");
+}
+
+static void test_lwaux (void)
+{
+ __asm__ __volatile__ ("lwaux 17,14,15");
+}
+#endif // #ifdef __powerpc64__
+
static test_t tests_ild_ops_two[] =3D {
{ &test_lbzx , " lbzx", },
{ &test_lbzux , " lbzux", },
@@ -1219,6 +1518,12 @@
{ &test_lhzux , " lhzux", },
{ &test_lwzx , " lwzx", },
{ &test_lwzux , " lwzux", },
+#ifdef __powerpc64__
+ { &test_ldx , " ldx", },
+ { &test_ldux , " ldux", },
+ { &test_lwax , " lwax", },
+ { &test_lwaux , " lwaux", },
+#endif // #ifdef __powerpc64__
{ NULL, NULL, },
};
=20
@@ -1240,6 +1545,14 @@
extern void test_stwu (void);
ASSEMBLY_FUNC("test_stwu", "stwu 14,0(15)");
=20
+#ifdef __powerpc64__
+extern void test_std (void);
+ASSEMBLY_FUNC("test_std", "std 14,0(15)");
+
+extern void test_stdu (void);
+ASSEMBLY_FUNC("test_stdu", "stdu 14,0(15)");
+#endif // #ifdef __powerpc64__
+
static test_t tests_ist_ops_three_i16[] =3D {
{ &test_stb , " stb", },
{ &test_stbu , " stbu", },
@@ -1247,6 +1560,10 @@
{ &test_sthu , " sthu", },
{ &test_stw , " stw", },
{ &test_stwu , " stwu", },
+#ifdef __powerpc64__
+ { &test_std , " std", },
+ { &test_stdu , " stdu", },
+#endif // #ifdef __powerpc64__
{ NULL, NULL, },
};
=20
@@ -1280,6 +1597,18 @@
__asm__ __volatile__ ("stwux 14,15,16");
}
=20
+#ifdef __powerpc64__
+static void test_stdx (void)
+{
+ __asm__ __volatile__ ("stdx 14,15,16");
+}
+
+static void test_stdux (void)
+{
+ __asm__ __volatile__ ("stdux 14,15,16");
+}
+#endif // #ifdef __powerpc64__
+
static test_t tests_ist_ops_three[] =3D {
{ &test_stbx , " stbx", },
{ &test_stbux , " stbux", },
@@ -1287,6 +1616,10 @@
{ &test_sthux , " sthux", },
{ &test_stwx , " stwx", },
{ &test_stwux , " stwux", },
+#ifdef __powerpc64__
+ { &test_stdx , " stdx", },
+ { &test_stdux , " stdux", },
+#endif // #ifdef __powerpc64__
{ NULL, NULL, },
};
=20
@@ -1590,6 +1923,23 @@
__asm__ __volatile__ ("fsqrt 17, 14");
}
=20
+#ifdef __powerpc64__
+static void test_fcfid (void)
+{
+ __asm__ __volatile__ ("fcfid 17, 14");
+}
+
+static void test_fctid (void)
+{
+ __asm__ __volatile__ ("fctid 17, 14");
+}
+
+static void test_fctidz (void)
+{
+ __asm__ __volatile__ ("fctidz 17, 14");
+}
+#endif // #ifdef __powerpc64__
+
static test_t tests_fa_ops_one[] =3D {
// { &test_fres , " fres", }, // TODO: Not yet=
supported
// { &test_frsqrte , " frsqrte", }, // TODO: Not yet=
supported
@@ -1601,6 +1951,11 @@
{ &test_fabs , " fabs", },
{ &test_fnabs , " fnabs", },
{ &test_fsqrt , " fsqrt", },
+#ifdef __powerpc64__
+ { &test_fcfid , " fcfid", },
+ { &test_fctid , " fctid", },
+ { &test_fctidz , " fctidz", },
+#endif // #ifdef __powerpc64__
{ NULL, NULL, },
};
#endif /* !defined (NO_FLOAT) */
@@ -1654,6 +2009,23 @@
__asm__ __volatile__ ("fnabs. 17, 14");
}
=20
+#ifdef __powerpc64__
+static void test_fcfid_ (void)
+{
+ __asm__ __volatile__ ("fcfid. 17, 14");
+}
+
+static void test_fctid_ (void)
+{
+ __asm__ __volatile__ ("fctid. 17, 14");
+}
+
+static void test_fctidz_ (void)
+{
+ __asm__ __volatile__ ("fctidz. 17, 14");
+}
+#endif // #ifdef __powerpc64__
+
static test_t tests_far_ops_one[] =3D {
// { &test_fres_ , " fres.", }, // TODO: Not yet=
supported
// { &test_frsqrte_ , " frsqrte.", }, // TODO: Not ye=
t supported
@@ -1664,6 +2036,11 @@
{ &test_fneg_ , " fneg.", },
{ &test_fabs_ , " fabs.", },
{ &test_fnabs_ , " fnabs.", },
+#ifdef __powerpc64__
+ { &test_fcfid_ , " fcfid.", },
+ { &test_fctid_ , " fctid.", },
+ { &test_fctidz_ , " fctidz.", },
+#endif // #ifdef __powerpc64__
{ NULL, NULL, },
};
#endif /* !defined (NO_FLOAT) */
@@ -3734,7 +4111,11 @@
=20
tmp =3D ((uint64_t)s << 63) | ((uint64_t)_exp << 52) | mant;
*(uint64_t *)farg =3D tmp;
+#ifndef __powerpc64__
AB_DPRINTF("%d %03x %013llx =3D> %016llx %0e\n",
+#else
+ AB_DPRINTF("%d %03x %013lx =3D> %016lx %0e\n",
+#endif
s, _exp, mant, *(uint64_t *)farg, *(double *)farg);
}
=20
@@ -3873,6 +4254,7 @@
uint64_t tmp;
int i=3D0;
=20
+#ifndef __powerpc64__
if (arg_list_size =3D=3D 1) { // Large
iargs =3D malloc(400 * sizeof(HWord_t));
for (tmp=3D0; ; tmp =3D tmp + 1 + (tmp >> 1)) {
@@ -3896,6 +4278,31 @@
break;
}
}
+#else
+ if (arg_list_size =3D=3D 1) { // Large
+ iargs =3D malloc(800 * sizeof(HWord_t));
+ for (tmp=3D0; ; tmp =3D 2*tmp + 1 + (tmp >> 2)) {
+ if ((long)tmp < 0 )
+ tmp =3D 0xFFFFFFFFFFFFFFFFULL;
+ iargs[i++] =3D tmp;
+ AB_DPRINTF("val %016lx\n", tmp);
+ if (tmp =3D=3D 0xFFFFFFFFFFFFFFFFULL)
+ break;
+ }
+ } else { // Default
+ iargs =3D malloc(20 * sizeof(HWord_t));
+ // for (tmp=3D0; ; tmp =3D 9999*tmp + 999999) { // gives 6
+ for (tmp =3D 0; ; tmp =3D 123456789*tmp + 123456789999) { // give=
s 3
+ if ((long)tmp < 0 )
+ tmp =3D 0xFFFFFFFFFFFFFFFFULL;
+ iargs[i++] =3D tmp;
+ AB_DPRINTF("val %016lx\n", tmp);
+ if (tmp =3D=3D 0xFFFFFFFFFFFFFFFFULL)
+ break;
+ }
+ }
+#endif // #ifndef __powerpc64__
+
AB_DPRINTF("Registered %d iargs values\n", i);
nb_iargs =3D i;
}
@@ -4146,7 +4553,11 @@
r18 =3D tmpxer;
__asm__ __volatile__ ("mtxer 18");
=20
+#ifndef __powerpc64__
printf("%s %08x, %08x, %08x =3D> %08x (%08x %08x)\n",
+#else
+ printf("%s %016lx, %016lx, %016lx =3D> %016lx (%08x %08x)\n"=
,
+#endif
name, iargs[i], iargs[j], iargs[k], res, flags, xer);
}
if (verbose) printf("\n");
@@ -4201,7 +4612,12 @@
r18 =3D tmpxer;
__asm__ __volatile__ ("mtxer 18");
=20
+#ifndef __powerpc64__
printf("%s %08x, %08x =3D> %08x (%08x %08x)\n",
+#else
+ if (zap_hi32) res &=3D 0xFFFFFFFFULL;
+ printf("%s %016lx, %016lx =3D> %016lx (%08x %08x)\n",
+#endif
name, iargs[i], iargs[j], res, flags, xer);
}
if (verbose) printf("\n");
@@ -4248,7 +4664,11 @@
r18 =3D tmpxer;
__asm__ __volatile__ ("mtxer 18");
=20
+#ifndef __powerpc64__
printf("%s %08x =3D> %08x (%08x %08x)\n",
+#else
+ printf("%s %016lx =3D> %016lx (%08x %08x)\n",
+#endif
name, iargs[i], res, flags, xer);
}
if ((test_flags & PPC_XER_CA) && xer_orig =3D=3D 0x00000000) {
@@ -4300,10 +4720,17 @@
void init_function( test_func_t *p_func, uint32_t func_buf[] )
{
uint32_t *p;
+#ifndef __powerpc64__
p =3D (uint32_t *)*p_func;
func_buf[0] =3D p[0];
func_buf[1] =3D p[1];
*p_func =3D (void *)func_buf;
+#else
+ p =3D (uint32_t *)((uint64_t *)*p_func)[0];
+ func_buf[0] =3D p[0];
+ func_buf[1] =3D p[1];
+ ((uint64_t *)*p_func)[0] =3D (uint64_t)&func_buf[0];
+#endif // #ifndef __powerpc64__
}
=20
=20
@@ -4347,7 +4774,11 @@
r18 =3D tmpxer;
__asm__ __volatile__ ("mtxer 18");
=20
+#ifndef __powerpc64__
printf("%s %08x, %08x =3D> %08x (%08x %08x)\n",
+#else
+ printf("%s %016lx, %08x =3D> %016lx (%08x %08x)\n",
+#endif
name, iargs[i], ii16[j], res, flags, xer);
}
if (verbose) printf("\n");
@@ -4367,6 +4798,15 @@
* mftb_cb
* mtcrf_cb
* mtspr_cb
+
+ __powerpc64__ only:
+ * rldcl rA,rS,SH,MB
+ * rldcr rA,rS,SH,ME
+ * rldic rA,rS,SH,MB
+ * rldicl rA,rS,SH,MB
+ * rldicr rA,rS,SH,ME
+ * rldimi rA,rS,SH,MB
+ * sradi rA,rS,SH
*/
=20
static void rlwi_cb (const char* name, test_func_t func,
@@ -4416,7 +4856,11 @@
r18 =3D tmpxer;
__asm__ __volatile__ ("mtxer 18");
=20
+#ifndef __powerpc64__
printf("%s %08x, %2d, %2d, %2d =3D> %08x (%08x %08x)\n",
+#else
+ printf("%s %016lx, %2d, %2d, %2d =3D> %016lx (%08x %08x)\=
n",
+#endif
name, iargs[i], j, k, l, res, flags, xer);
}
if (verbose) printf("\n");
@@ -4470,7 +4914,11 @@
r18 =3D tmpxer;
__asm__ __volatile__ ("mtxer 18");
=20
+#ifndef __powerpc64__
printf("%s %08x, %08x, %2d, %2d =3D> %08x (%08x %08x)\n",
+#else
+ printf("%s %016lx, %016lx, %2d, %2d =3D> %016lx (%08x %08=
x)\n",
+#endif
name, iargs[i], iargs[j], k, l, res, flags, xer);
}
if (verbose) printf("\n");
@@ -4520,7 +4968,11 @@
r18 =3D tmpxer;
__asm__ __volatile__ ("mtxer 18");
=20
+#ifndef __powerpc64__
printf("%s %08x, %2d =3D> %08x (%08x %08x)\n",
+#else
+ printf("%s %016lx, %2d =3D> %016lx (%08x %08x)\n",
+#endif
name, iargs[i], j, res, flags, xer);
}
if (verbose) printf("\n");
@@ -4568,7 +5020,11 @@
r18 =3D tmpxer;
__asm__ __volatile__ ("mtxer 18");
=20
+#ifndef __powerpc64__
printf("%s %d, %d (%08x) =3D> (%08x %08x)\n",
+#else
+ printf("%s %d, %d (%016lx) =3D> (%08x %08x)\n",
+#endif
name, j, k, iargs[i], flags, xer);
}
if (verbose) printf("\n");
@@ -4663,7 +5119,11 @@
r18 =3D tmpxer;
__asm__ __volatile__ ("mtxer 18");
=20
+#ifndef __powerpc64__
printf("%s (%08x) =3D> %08x (%08x %08x)\n",
+#else
+ printf("%s (%016lx) =3D> %016lx (%08x %08x)\n",
+#endif
name, iargs[i], res, flags, xer);
}
}
@@ -4687,7 +5147,11 @@
);
res &=3D 0xE000007F; /* rest of the bits are undefined */
=20
+#ifndef __powerpc64__
printf("%s 1 (%08x) -> mtxer -> mfxer =3D> %08x\n",
+#else
+ printf("%s 1 (%08x) -> mtxer -> mfxer =3D> %016lx\n",
+#endif
name, j, res);
}
=20
@@ -4700,7 +5164,11 @@
: /*out*/"=3Dr"(res) : /*in*/"r"(j) : /*trashed*/"lr"=20
);
=20
+#ifndef __powerpc64__
printf("%s 8 (%08x) -> mtlr -> mflr =3D> %08x\n",
+#else
+ printf("%s 8 (%08x) -> mtlr -> mflr =3D> %016lx\n",
+#endif
name, j, res);
}
=20
@@ -4713,7 +5181,11 @@
: /*out*/"=3Dr"(res) : /*in*/"r"(j) : /*trashed*/"ctr"=20
);
=20
+#ifndef __powerpc64__
printf("%s 9 (%08x) -> mtctr -> mfctr =3D> %08x\n",
+#else
+ printf("%s 9 (%08x) -> mtctr -> mfctr =3D> %016lx\n",
+#endif
name, j, res);
}
=20
@@ -4963,7 +5435,11 @@
r18 =3D tmpxer;
__asm__ __volatile__ ("mtxer 18");
=20
+#ifndef __powerpc64__
printf("%s %3d, %08x =3D> (%08x %08x)\n",
+#else
+ printf("%s %3d, %016lx =3D> (%08x %08x)\n",
+#endif
name, j, iargs[i], flags, xer);
}
if (verbose) printf("\n");
@@ -5022,7 +5498,11 @@
r18 =3D tmpxer;
__asm__ __volatile__ ("mtxer 18");
=20
+#ifndef __powerpc64__
printf("%s %d, %08x =3D> (%08x %08x, %08x, %08x)\n",
+#else
+ printf("%s %d, %016lx =3D> (%08x %08x, %016lx, %016lx)\n",
+#endif
name, j, iargs[k], flags, xer, lr, ctr);
}
if (verbose) printf("\n");
@@ -5062,7 +5542,11 @@
r18 =3D tmpxer;
__asm__ __volatile__ ("mtxer 18");
=20
+#ifndef __powerpc64__
printf("%s %d, %08x =3D> (%08x %08x, %08x, %08x)\n",
+#else
+ printf("%s %d, %016lx =3D> (%08x %08x, %016lx, %016lx)\n",
+#endif
name, j, iargs[k], flags, xer, lr, ctr);
}
if (verbose) printf("\n");
@@ -5102,14 +5586,171 @@
r18 =3D tmpxer;
__asm__ __volatile__ ("mtxer 18");
=20
+#ifndef __powerpc64__
printf("%s %d, %08x =3D> (%08x %08x, %08x, %08x)\n",
+#else
+ printf("%s %d, %016lx =3D> (%08x %08x, %016lx, %016lx)\n",
+#endif
name, j, iargs[k], flags, xer, lr, ctr);
}
#endif
}
=20
+#ifdef __powerpc64__
+static void rldc_cb (const char* name, test_func_t func,
+ unused uint32_t test_flags)
+{
+ uint32_t func_buf[2];
+ volatile HWord_t res;
+ volatile uint32_t flags, xer, tmpcr, tmpxer;
+ int i, j, k, arg_step;
+ =20
+ arg_step =3D (arg_list_size =3D=3D 0) ? 7 : 3;
+ =20
+ for (i=3D0; i<nb_iargs; i++) {
+ for (j=3D0; j<nb_iargs; j++) {
+ for (k=3D0; k<64; k+=3Darg_step) {
+ /* Patch up the instruction */
+ init_function( &func, func_buf );
+ patch_op_imm(&func_buf[0], (((k & 0x1F)<<1) | ((k>>5)&1)), 5=
, 6);
+ =20
+ r14 =3D iargs[i];
+ r15 =3D iargs[j];
=20
+ /* Save flags */
+ __asm__ __volatile__ ("mfcr 18");
+ tmpcr =3D r18;
+ __asm__ __volatile__ ("mfxer 18");
+ tmpxer =3D r18;
=20
+ /* Set up flags for test */
+ r18 =3D 0;
+ __asm__ __volatile__ ("mtcr 18");
+ __asm__ __volatile__ ("mtxer 18");
+ (*func)();
+ __asm__ __volatile__ ("mfcr 18");
+ flags =3D r18;
+ __asm__ __volatile__ ("mfxer 18");
+ xer =3D r18;
+ res =3D r17;
+
+ /* Restore flags */
+ r18 =3D tmpcr;
+ __asm__ __volatile__ ("mtcr 18");
+ r18 =3D tmpxer;
+ __asm__ __volatile__ ("mtxer 18");
+
+ printf("%s %016lx, %016lx, %2d =3D> %016lx (%08x %08x)\n",
+ name, iargs[i], iargs[j], k, res, flags, xer);
+ }
+ if (verbose) printf("\n");
+ }
+ }
+}
+
+static void rldi_cb (const char* name, test_func_t func,
+ unused uint32_t test_flags)
+{
+ uint32_t func_buf[2];
+ volatile HWord_t res;
+ volatile uint32_t flags, xer, tmpcr, tmpxer;
+ int i, j, k, arg_step;
+ =20
+ arg_step =3D (arg_list_size =3D=3D 0) ? 7 : 3;
+ =20
+ for (i=3D0; i<nb_iargs; i++) {
+ for (j=3D0; j<64; j+=3Darg_step) { // SH
+ for (k=3D0; k<64; k+=3Darg_step) { // MB|ME
+ /* Patch up the instruction */
+ init_function( &func, func_buf );
+ _patch_op_imm(&func_buf[0], (j & 0x1F), 11, 5);
+ _patch_op_imm(&func_buf[0], ((j>>5)&1), 1, 1);
+ patch_op_imm(&func_buf[0], (((k & 0x1F)<<1) | ((k>>5)&1)), 5=
, 6);
+ =20
+ r14 =3D iargs[i];
+
+ /* Save flags */
+ __asm__ __volatile__ ("mfcr 18");
+ tmpcr =3D r18;
+ __asm__ __volatile__ ("mfxer 18");
+ tmpxer =3D r18;
+
+ /* Set up flags for test */
+ r18 =3D 0;
+ __asm__ __volatile__ ("mtcr 18");
+ __asm__ __volatile__ ("mtxer 18");
+ (*func)();
+ __asm__ __volatile__ ("mfcr 18");
+ flags =3D r18;
+ __asm__ __volatile__ ("mfxer 18");
+ xer =3D r18;
+ res =3D r17;
+
+ /* Restore flags */
+ r18 =3D tmpcr;
+ __asm__ __volatile__ ("mtcr 18");
+ r18 =3D tmpxer;
+ __asm__ __volatile__ ("mtxer 18");
+
+ printf("%s %016lx, %2d, %2d =3D> %016lx (%08x %08x)\n",
+ name, iargs[i], j, k, res, flags, xer);
+ }
+ if (verbose) printf("\n");
+ }
+ }
+}
+
+static void sradi_cb (const char* name, test_func_t func,
+ unused uint32_t test_flags)
+{
+ uint32_t func_buf[2];
+ volatile HWord_t res;
+ volatile uint32_t flags, xer, tmpcr, tmpxer;
+ int i, j, arg_step;
+ =20
+ arg_step =3D (arg_list_size =3D=3D 0) ? 7 : 3;
+ =20
+ for (i=3D0; i<nb_iargs; i++) {
+ for (j=3D0; j<64; j+=3Darg_step) { // SH
+ /* Patch up the instruction */
+ init_function( &func, func_buf );
+ _patch_op_imm(&func_buf[0], (j & 0x1F), 11, 5);
+ patch_op_imm(&func_buf[0], ((j>>5)&1), 1, 1);
+ =20
+ r14 =3D iargs[i];
+
+ /* Save flags */
+ __asm__ __volatile__ ("mfcr 18");
+ tmpcr =3D r18;
+ __asm__ __volatile__ ("mfxer 18");
+ tmpxer =3D r18;
+
+ /* Set up flags for test */
+ r18 =3D 0;
+ __asm__ __volatile__ ("mtcr 18");
+ __asm__ __volatile__ ("mtxer 18");
+ (*func)();
+ __asm__ __volatile__ ("mfcr 18");
+ flags =3D r18;
+ __asm__ __volatile__ ("mfxer 18");
+ xer =3D r18;
+ res =3D r17;
+
+ /* Restore flags */
+ r18 =3D tmpcr;
+ __asm__ __volatile__ ("mtcr 18");
+ r18 =3D tmpxer;
+ __asm__ __volatile__ ("mtxer 18");
+
+ printf("%s %016lx, %2d =3D> %016lx (%08x %08x)\n",
+ name, iargs[i], j, res, flags, xer);
+ }
+ if (verbose) printf("\n");
+ }
+}
+#endif // #ifdef __powerpc64__
+
+
typedef struct special_t special_t;
=20
struct special_t {
@@ -5209,7 +5850,65 @@
"mtspr", /* One register + 1 10 bits immediate arguments */
&mtspr_cb,
},
+#ifdef __powerpc64__
{
+ "rldcl", /* Two registers + 1 6 bit immediate argument */
+ &rldc_cb,
+ },
+ {
+ "rldcl.", /* Two registers + 1 6 bit immediate argument */
+ &rldc_cb,
+ },
+ {
+ "rldcr", /* Two registers + 1 6 bit immediate argument */
+ &rldc_cb,
+ },
+ {
+ "rldcr.", /* Two registers + 1 6 bit immediate argument */
+ &rldc_cb,
+ },
+ {
+ "rldic", /* One register + 2 6 bit immediate arguments */
+ &rldi_cb,
+ },
+ {
+ "rldic.", /* One register + 2 6 bit immediate arguments */
+ &rldi_cb,
+ },
+ {
+ "rldicl", /* One register + 2 6 bit immediate arguments */
+ &rldi_cb,
+ },
+ {
+ "rldicl.", /* One register + 2 6 bit immediate arguments */
+ &rldi_cb,
+ },
+ {
+ "rldicr", /* One register + 2 6 bit immediate arguments */
+ &rldi_cb,
+ },
+ {
+ "rldicr.", /* One register + 2 6 bit immediate arguments */
+ &rldi_cb,
+ },
+ {
+ "rldimi", /* One register + 2 6 bit immediate arguments */
+ &rldi_cb,
+ },
+ {
+ "rldimi.", /* One register + 2 6 bit immediate arguments */
+ &rldi_cb,
+ },
+ {
+ "sradi", /* One register + 1 6 bit immediate argument */
+ &sradi_cb,
+ },
+ {
+ "sradi.", /* One register + 1 6 bit immediate argument */
+ &sradi_cb,
+ },
+#endif // #ifdef __powerpc64__
+ {
NULL,
NULL,
},
@@ -5229,8 +5928,12 @@
uint32_t func_buf[2];
volatile HWord_t res, base;
volatile uint32_t flags, xer, tmpcr, tmpxer;
- int i, offs;
+ int i, offs, is_lwa=3D0;
=20
+#ifdef __powerpc64__
+ is_lwa =3D strstr(name, "lwa") !=3D NULL;
+#endif
+
// +ve d
base =3D (HWord_t)&iargs[0];
for (i=3D0; i<nb_iargs; i++) {
@@ -5238,7 +5941,10 @@
=20
/* Patch up the instruction */
init_function( &func, func_buf );
- patch_op_imm16(&func_buf[0], offs);
+ if (is_lwa)
+ patch_op_imm(&func_buf[0], offs>>2, 2, 14);
+ else
+ patch_op_imm16(&func_buf[0], offs);
=20
r14 =3D base;
=20
@@ -5265,7 +5971,11 @@
r18 =3D tmpxer;
__asm__ __volatile__ ("mtxer 18");
=20
+#ifndef __powerpc64__
printf("%s %2d, (%08x) =3D> %08x, %2d (%08x %08x)\n",
+#else
+ printf("%s %3d, (%016lx) =3D> %016lx, %3ld (%08x %08x)\n",
+#endif
name, offs, iargs[i], res, r14-base, flags, xer);
}
if (verbose) printf("\n");
@@ -5304,7 +6014,11 @@
r18 =3D tmpxer;
__asm__ __volatile__ ("mtxer 18");
=20
+#ifndef __powerpc64__
printf("%s %2d, (%08x) =3D> %08x, %2d (%08x %08x)\n",
+#else
+ printf("%s %3d, (%016lx) =3D> %016lx, %3ld (%08x %08x)\n",
+#endif
name, offs, iargs[nb_iargs-1+i], res, r14-base, flags, xer)=
;
}
}
@@ -5347,7 +6061,11 @@
r18 =3D tmpxer;
__asm__ __volatile__ ("mtxer 18");
=20
+#ifndef __powerpc64__
printf("%s %d (%08x) =3D> %08x, %d (%08x %08x)\n",
+#else
+ printf("%s %3d, (%016lx) =3D> %016lx, %2ld (%08x %08x)\n",
+#endif
name, offs, iargs[i], res, r14-base, flags, xer);
}
}
@@ -5401,7 +6119,11 @@
r18 =3D tmpxer;
__asm__ __volatile__ ("mtxer 18");
=20
+#ifndef __powerpc64__
printf("%s %08x, %2d =3D> %08x, %2d (%08x %08x)\n",
+#else
+ printf("%s %016lx, %3d =3D> %016lx, %3ld (%08x %08x)\n",
+#endif
name, iargs[i], offs, iargs_priv[i], r15-base, flags, xer);
}
if (verbose) printf("\n");
@@ -5443,7 +6165,11 @@
r18 =3D tmpxer;
__asm__ __volatile__ ("mtxer 18");
=20
+#ifndef __powerpc64__
printf("%s %08x, %2d =3D> %08x, %2d (%08x %08x)\n",
+#else
+ printf("%s %016lx, %3d =3D> %016lx, %3ld (%08x %08x)\n",
+#endif
name, iargs[nb_iargs-1+i], offs, iargs_priv[nb_iargs-1+i],
r15-base, flags, xer);
}
@@ -5493,7 +6219,11 @@
r18 =3D tmpxer;
__asm__ __volatile__ ("mtxer 18");
=20
+#ifndef __powerpc64__
printf("%s %08x, %d =3D> %08x, %d (%08x %08x)\n",
+#else
+ printf("%s %016lx, %3d =3D> %016lx, %2ld (%08x %08x)\n",
+#endif
name, iargs[i], offs, iargs_priv[i], r15-base, flags, xer);
}
free(iargs_priv);
@@ -5568,7 +6298,11 @@
as vex's accuracy isn't perfect */
ur &=3D 0xFFFFFFFFFFFFFF00ULL;
=20
+#ifndef __powerpc64__
printf("%s %016llx, %016llx, %016llx =3D> %016llx",
+#else
+ printf("%s %016lx, %016lx, %016lx =3D> %016lx",
+#endif
name, u0, u1, u2, ur);
#if defined TEST_FLOAT_FLAGS
printf(" (%08x)", flags);
@@ -5619,7 +6353,11 @@
r18 =3D tmpxer;
__asm__ __volatile__ ("mtxer 18");
=20
+#ifndef __powerpc64__
printf("%s %016llx, %016llx =3D> %016llx",
+#else
+ printf("%s %016lx, %016lx =3D> %016lx",
+#endif
name, u0, u1, ur);
#if defined TEST_FLOAT_FLAGS
printf(" (%08x)", flags);
@@ -5673,7 +6411,11 @@
if (zap_hi_32bits)
ur &=3D 0xFFFFFFFFULL;
=20
+#ifndef __powerpc64__
printf("%s %016llx =3D> %016llx",
+#else
+ printf("%s %016lx =3D> %016lx",
+#endif
name, u0, ur);
#if defined TEST_FLOAT_FLAGS
printf(" (%08x)", flags);
@@ -5793,7 +6535,11 @@
r18 =3D tmpxer;
__asm__ __volatile__ ("mtxer 18");
=20
+#ifndef __powerpc64__
printf("%s %016llx, %4d =3D> %016llx, %4d",
+#else
+ printf("%s %016lx, %4d =3D> %016lx, %4ld",
+#endif
name, double_to_bits(src), offs,
double_to_bits(res), r14-base);
#if defined TEST_FLOAT_FLAGS
@@ -5850,7 +6596,11 @@
r18 =3D tmpxer;
__asm__ __volatile__ ("mtxer 18");
=20
+#ifndef __powerpc64__
printf("%s %016llx, %4d =3D> %016llx, %4d",
+#else
+ printf("%s %016lx, %4ld =3D> %016lx, %4ld",
+#endif
name, double_to_bits(src), r15/*offs*/,
double_to_bits(res), r14-base);
#if defined TEST_FLOAT_FLAGS
@@ -5931,7 +6681,11 @@
r18 =3D tmpxer;
__asm__ __volatile__ ("mtxer 18");
=20
+#ifndef __powerpc64__
printf("%s %016llx, %4d =3D> %016llx, %4d",
+#else
+ printf("%s %016lx, %4d =3D> %016lx, %4ld",
+#endif
name, double_to_bits(src), offs,
double_to_bits(*p_dst), r15-base);
#if defined TEST_FLOAT_FLAGS
@@ -6008,7 +6762,11 @@
r18 =3D tmpxer;
__asm__ __volatile__ ("mtxer 18");
=20
+#ifndef __powerpc64__
printf("%s %016llx, %4d =3D> %016llx, %4d",
+#else
+ printf("%s %016lx, %4ld =3D> %016lx, %4ld",
+#endif
name, double_to_bits(src), r16/*offs*/,
double_to_bits(*p_dst), r15-base);
#if defined TEST_FLOAT_FLAGS
@@ -6019,12 +6777,20 @@
=20
#if 0
// print double precision result
+#ifndef __powerpc64__
printf("%s %016llx (%014e), %4d =3D> %016llx (%014e), %08x (%08x %=
08x)\n",
+#else
+ printf("%s %016lx (%014e), %4d =3D> %016lx (%014e), %08x (%08x %08=
x)\n",
+#endif
name, double_to_bits(src), src, offs,
double_to_bits(*p_dst), *p_dst, r15, flags, xer);
=20
// print single precision result
+#ifndef __powerpc64__
printf("%s %016llx (%014e), %4d =3D> %08x (%f), %08x (%08x %08x)\n=
",
+#else
+ printf("%s %016lx (%014e), %4d =3D> %08x (%f), %08x (%08x %08x)\n"=
,
+#endif
name, double_to_bits(src), src, offs,
(uint32_t)(double_to_bits(*p_dst) >> 32),
bits_to_float( (uint32_t)(double_to_bits(*p_dst) >> 32) ),
|
|
From: <sv...@va...> - 2006-01-03 11:47:49
|
Author: cerion Date: 2006-01-03 11:47:38 +0000 (Tue, 03 Jan 2006) New Revision: 5486 Log: regtest none::ppc32 - More cleanup - Fixed rlwimi test - init r_dst to zero. - Fixed load/store tests - print change in updated base reg, not actual = value. Modified: trunk/none/tests/ppc32/jm-fp.stdout.exp trunk/none/tests/ppc32/jm-insns.c trunk/none/tests/ppc32/jm-int.stdout.exp [... diff too large to include ...] |
|
From: <sv...@va...> - 2006-01-03 04:10:22
|
Author: sewardj
Date: 2006-01-03 04:10:13 +0000 (Tue, 03 Jan 2006)
New Revision: 5485
Log:
Signal-related syscall support.
Modified:
trunk/coregrind/m_syswrap/syswrap-ppc64-linux.c
Modified: trunk/coregrind/m_syswrap/syswrap-ppc64-linux.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_syswrap/syswrap-ppc64-linux.c 2006-01-03 04:09:27 U=
TC (rev 5484)
+++ trunk/coregrind/m_syswrap/syswrap-ppc64-linux.c 2006-01-03 04:10:13 U=
TC (rev 5485)
@@ -422,7 +422,7 @@
//zz DECL_TEMPLATE(ppc64_linux, sys_ipc);
DECL_TEMPLATE(ppc64_linux, sys_clone);
//zz DECL_TEMPLATE(ppc64_linux, sys_sigreturn);
-//zz DECL_TEMPLATE(ppc64_linux, sys_rt_sigreturn);
+DECL_TEMPLATE(ppc64_linux, sys_rt_sigreturn);
//zz DECL_TEMPLATE(ppc64_linux, sys_sigaction);
=20
PRE(sys_socketcall)
@@ -1051,42 +1051,42 @@
//zz /* Check to see if some any signals arose as a result of this. *=
/
//zz *flags |=3D SfPollAfter;
//zz }
-//zz=20
-//zz PRE(sys_rt_sigreturn)
-//zz {
-//zz ThreadState* tst;
-//zz PRINT("rt_sigreturn ( )");
-//zz=20
-//zz vg_assert(VG_(is_valid_tid)(tid));
-//zz vg_assert(tid >=3D 1 && tid < VG_N_THREADS);
-//zz vg_assert(VG_(is_running_thread)(tid));
-//zz=20
-//zz ///* Adjust esp to point to start of frame; skip back up over ha=
ndler
-//zz // ret addr */
-//zz tst =3D VG_(get_ThreadState)(tid);
-//zz //tst->arch.vex.guest_ESP -=3D sizeof(Addr);
-//zz // Should we do something equivalent on ppc64? Who knows.
-//zz=20
-//zz ///* This is only so that the EIP is (might be) useful to report=
if
-//zz // something goes wrong in the sigreturn */
-//zz //ML_(fixup_guest_state_to_restart_syscall)(&tst->arch);
-//zz // Should we do something equivalent on ppc64? Who knows.
-//zz=20
-//zz VG_(sigframe_destroy)(tid, True);
-//zz=20
-//zz /* See comments above in PRE(sys_sigreturn) about this. */
-//zz SET_STATUS_from_SysRes_NO_SANITY_CHECK(
-//zz VG_(mk_SysRes_ppc64_linux)(=20
-//zz tst->arch.vex.guest_GPR3,
-//zz /* get CR0.SO */
-//zz (LibVEX_GuestPPC32_get_CR( &tst->arch.vex ) >> 28) & 1
-//zz )
-//zz );
-//zz=20
-//zz /* Check to see if some any signals arose as a result of this. *=
/
-//zz *flags |=3D SfPollAfter;
-//zz }
-//zz=20
+
+PRE(sys_rt_sigreturn)
+{
+ ThreadState* tst;
+ PRINT("rt_sigreturn ( )");
+
+ vg_assert(VG_(is_valid_tid)(tid));
+ vg_assert(tid >=3D 1 && tid < VG_N_THREADS);
+ vg_assert(VG_(is_running_thread)(tid));
+
+ ///* Adjust esp to point to start of frame; skip back up over handler
+ // ret addr */
+ tst =3D VG_(get_ThreadState)(tid);
+ //tst->arch.vex.guest_ESP -=3D sizeof(Addr);
+ // Should we do something equivalent on ppc64? Who knows.
+
+ ///* This is only so that the EIP is (might be) useful to report if
+ // something goes wrong in the sigreturn */
+ //ML_(fixup_guest_state_to_restart_syscall)(&tst->arch);
+ // Should we do something equivalent on ppc64? Who knows.
+
+ VG_(sigframe_destroy)(tid, True);
+
+ /* See comments above in PRE(sys_sigreturn) about this. */
+ SET_STATUS_from_SysRes_NO_SANITY_CHECK(
+ VG_(mk_SysRes_ppc64_linux)(=20
+ tst->arch.vex.guest_GPR3,
+ /* get CR0.SO */
+ (LibVEX_GuestPPC64_get_CR( &tst->arch.vex ) >> 28) & 1
+ )
+ );
+
+ /* Check to see if some any signals arose as a result of this. */
+ *flags |=3D SfPollAfter;
+}
+
//zz /* Convert from non-RT to RT sigset_t's */
//zz static=20
//zz void convert_sigset_to_rt(const vki_old_sigset_t *oldset, vki_sigse=
t_t *set)
@@ -1188,7 +1188,7 @@
=20
GENX_(__NR_unlink, sys_unlink), // 10
GENX_(__NR_execve, sys_execve), // 11
-// _____(__NR_chdir, sys_chdir), // 12
+ GENX_(__NR_chdir, sys_chdir), // 12
// _____(__NR_time, sys_time), // 13
// _____(__NR_mknod, sys_mknod), // 14
=20
@@ -1380,7 +1380,7 @@
=20
// _____(__NR_getresgid, sys_getresgid), // 170
// _____(__NR_prctl, sys_prctl), // 171
-// _____(__NR_rt_sigreturn, sys_rt_sigreturn), // 172
+ PLAX_(__NR_rt_sigreturn, sys_rt_sigreturn), // 172
LINXY(__NR_rt_sigaction, sys_rt_sigaction), // 173
LINXY(__NR_rt_sigprocmask, sys_rt_sigprocmask), // 174
=20
@@ -1400,7 +1400,7 @@
// _____(__NR_sendfile, sys_sendfile), // 186
// _____(__NR_getpmsg, sys_getpmsg), // 187
// _____(__NR_putpmsg, sys_putpmsg), // 188
-// _____(__NR_vfork, sys_vfork), // 189
+ GENX_(__NR_vfork, sys_fork), // 189 treat a=
s fork
=20
GENXY(__NR_ugetrlimit, sys_getrlimit), // 190
// _____(__NR_readahead, sys_readahead), // 191
|
|
From: <sv...@va...> - 2006-01-03 04:09:36
|
Author: sewardj
Date: 2006-01-03 04:09:27 +0000 (Tue, 03 Jan 2006)
New Revision: 5484
Log:
casting paranoia (harmless)
Modified:
trunk/coregrind/m_syswrap/syswrap-generic.c
Modified: trunk/coregrind/m_syswrap/syswrap-generic.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_syswrap/syswrap-generic.c 2006-01-03 04:08:32 UTC (=
rev 5483)
+++ trunk/coregrind/m_syswrap/syswrap-generic.c 2006-01-03 04:09:27 UTC (=
rev 5484)
@@ -80,7 +80,7 @@
if (!ret && syscallname !=3D NULL) {
VG_(message)(Vg_UserMsg, "Warning: client syscall %s tried "
"to modify addresses %p-%p",
- syscallname, start, start+size-1);
+ syscallname, (void*)start, (void*)(start+=
size-1));
if (VG_(clo_verbosity) > 1) {
VG_(get_and_pp_StackTrace)(tid, VG_(clo_backtrace_size));
}
|
|
From: <sv...@va...> - 2006-01-03 04:08:37
|
Author: sewardj
Date: 2006-01-03 04:08:32 +0000 (Tue, 03 Jan 2006)
New Revision: 5483
Log:
First cut at signal frame build/removal for ppc64-linux. Ghastly
stuff, but it does at least appear to do simple signal stuff
correctly.
Modified:
trunk/coregrind/m_sigframe/sigframe-ppc64-linux.c
Modified: trunk/coregrind/m_sigframe/sigframe-ppc64-linux.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_sigframe/sigframe-ppc64-linux.c 2006-01-02 20:47:26=
UTC (rev 5482)
+++ trunk/coregrind/m_sigframe/sigframe-ppc64-linux.c 2006-01-03 04:08:32=
UTC (rev 5483)
@@ -78,148 +78,95 @@
// A structure in which to save the application's registers
// during the execution of signal handlers.
=20
-// Linux has 2 signal frame structures: one for normal signal
-// deliveries, and one for SA_SIGINFO deliveries (also known as RT
-// signals).
-//
+// On ppc64-linux, rt_sigframe is used for all signals.
+
// In theory, so long as we get the arguments to the handler function
// right, it doesn't matter what the exact layout of the rest of the
// frame is. Unfortunately, things like gcc's exception unwinding
// make assumptions about the locations of various parts of the frame,
// so we need to duplicate it exactly.
=20
+/* Many of these byzantine details derived from
+ linux-2.6.13/arch/ppc64/kernel/signal.c */
+
+#define TRAMP_SIZE 6 /* who knows why - it only needs to be 2. */
+
/* Structure containing bits of information that we want to save
on signal delivery. */
-//zz struct vg_sig_private {
-//zz UInt magicPI;
-//zz UInt sigNo_private;
-//zz VexGuestPPC32State shadow;
-//zz };
-//zz=20
-//zz /* Structure put on stack for signal handlers with SA_SIGINFO clear=
. */
-//zz struct nonrt_sigframe {
-//zz UInt gap1[16];
-//zz struct vki_sigcontext sigcontext;
-//zz struct vki_mcontext mcontext;
-//zz struct vg_sig_private priv;
-//zz unsigned char abigap[224];
-//zz };
-//zz=20
-//zz /* Structure put on stack for signal handlers with SA_SIGINFO set. =
*/
-//zz struct rt_sigframe {
-//zz UInt gap1[20];
-//zz vki_siginfo_t siginfo;
-//zz struct vki_ucontext ucontext;
-//zz struct vg_sig_private priv;
-//zz unsigned char abigap[224];
-//zz };
+struct vg_sig_private {
+ UInt magicPI;
+ UInt sigNo_private;
+ VexGuestPPC64State shadow;
+};
=20
+/* Structure put on stack for all signal handlers. */
+struct rt_sigframe {
+ struct vki_ucontext uc;
+ ULong _unused[2];
+ UInt tramp[TRAMP_SIZE];
+ struct vki_siginfo* pinfo;
+ void* puc;
+ vki_siginfo_t info;
+ struct vg_sig_private priv;
+ UChar abigap[288];
+};
+
#define SET_SIGNAL_LR(zztst, zzval) \
do { tst->arch.vex.guest_LR =3D (zzval); \
VG_TRACK( post_reg_write, Vg_CoreSignal, tst->tid, \
- offsetof(VexGuestPPC32State,guest_LR), \
+ offsetof(VexGuestPPC64State,guest_LR), \
sizeof(UWord) ); \
} while (0)
=20
#define SET_SIGNAL_GPR(zztst, zzn, zzval) \
do { tst->arch.vex.guest_GPR##zzn =3D (zzval); \
VG_TRACK( post_reg_write, Vg_CoreSignal, tst->tid, \
- offsetof(VexGuestPPC32State,guest_GPR##zzn), \
+ offsetof(VexGuestPPC64State,guest_GPR##zzn), \
sizeof(UWord) ); \
} while (0)
=20
=20
-static=20
-void stack_mcontext ( struct vki_mcontext *mc,=20
- ThreadState* tst,=20
- Int ret,
- UInt fault_addr )
-{
-// VG_TRACK( pre_mem_write, Vg_CoreSignal, tst->tid, "signal frame mco=
ntext",
-// (Addr)mc, sizeof(struct vki_pt_regs) );
-//
-//# define DO(gpr) mc->mc_gregs[VKI_PT_R0+gpr] =3D tst->arch.vex.guest=
_GPR##gpr
-// DO(0); DO(1); DO(2); DO(3); DO(4); DO(5); DO(6); DO(7);
-// DO(8); DO(9); DO(10); DO(11); DO(12); DO(13); DO(14); DO(15);
-// DO(16); DO(17); DO(18); DO(19); DO(20); DO(21); DO(22); DO(23);
-// DO(24); DO(25); DO(26); DO(27); DO(28); DO(29); DO(30); DO(31);
-//# undef DO
-//
-// mc->mc_gregs[VKI_PT_NIP] =3D tst->arch.vex.guest_CIA;
-// mc->mc_gregs[VKI_PT_MSR] =3D 0xf032; /* pretty arbitrary */
-// mc->mc_gregs[VKI_PT_ORIG_R3] =3D tst->arch.vex.guest_GPR3;
-// mc->mc_gregs[VKI_PT_CTR] =3D tst->arch.vex.guest_CTR;
-// mc->mc_gregs[VKI_PT_LNK] =3D tst->arch.vex.guest_LR;
-// mc->mc_gregs[VKI_PT_XER] =3D LibVEX_GuestPPC32_get_XER(&tst->ar=
ch.vex);
-// mc->mc_gregs[VKI_PT_CCR] =3D LibVEX_GuestPPC32_get_CR(&tst->arc=
h.vex);
-// mc->mc_gregs[VKI_PT_MQ] =3D 0;
-// mc->mc_gregs[VKI_PT_TRAP] =3D 0;
-// mc->mc_gregs[VKI_PT_DAR] =3D fault_addr;
-// mc->mc_gregs[VKI_PT_DSISR] =3D 0;
-// mc->mc_gregs[VKI_PT_RESULT] =3D 0;
-// VG_TRACK( post_mem_write, Vg_CoreSignal, tst->tid,=20
-// (Addr)mc, sizeof(struct vki_pt_regs) );
-//
-// /* XXX should do FP and vector regs */
-//
-// /* set up signal return trampoline */
-// VG_TRACK(pre_mem_write, Vg_CoreSignal, tst->tid, "signal frame mcon=
text",
-// (Addr)&mc->mc_pad, sizeof(mc->mc_pad));
-// mc->mc_pad[0] =3D 0x38000000U + ret; /* li 0,ret */
-// mc->mc_pad[1] =3D 0x44000002U; /* sc */
-// VG_TRACK( post_mem_write, Vg_CoreSignal, tst->tid,=20
-// (Addr)&mc->mc_pad, sizeof(mc->mc_pad) );
-// /* invalidate any translation of this area */
-// VG_(discard_translations)( (Addr64)(Addr)&mc->mc_pad,=20
-// sizeof(mc->mc_pad), "stack_mcontext" ); =
=20
-//
-// /* set the signal handler to return to the trampoline */
-// SET_SIGNAL_LR(tst, (Addr) &mc->mc_pad[0]);
-}
-
-
/* Extend the stack segment downwards if needed so as to ensure the
new signal frames are mapped to something. Return a Bool
indicating whether or not the operation was successful.
*/
static Bool extend ( ThreadState *tst, Addr addr, SizeT size )
{
- I_die_here;
-// ThreadId tid =3D tst->tid;
-// NSegment *stackseg =3D NULL;
-//
-// if (VG_(extend_stack)(addr, tst->client_stack_szB)) {
-// stackseg =3D VG_(am_find_nsegment)(addr);
-// if (0 && stackseg)
-// VG_(printf)("frame=3D%p seg=3D%p-%p\n",
-// addr, stackseg->start, stackseg->end);
-// }
-//
-// if (stackseg =3D=3D NULL || !stackseg->hasR || !stackseg->hasW) {
-// VG_(message)(
-// Vg_UserMsg,
-// "Can't extend stack to %p during signal delivery for thread %=
d:",
-// addr, tid);
-// if (stackseg =3D=3D NULL)
-// VG_(message)(Vg_UserMsg, " no stack segment");
-// else
-// VG_(message)(Vg_UserMsg, " too small or bad protection modes=
");
-//
-// /* set SIGSEGV to default handler */
-// VG_(set_default_handler)(VKI_SIGSEGV);
-// VG_(synth_fault_mapping)(tid, addr);
-//
-// /* The whole process should be about to die, since the default
-// action of SIGSEGV to kill the whole process. */
-// return False;
-// }
-//
-// /* For tracking memory events, indicate the entire frame has been
-// allocated. */
-// VG_TRACK( new_mem_stack_signal, addr - VG_STACK_REDZONE_SZB,
-// size + VG_STACK_REDZONE_SZB );
-//
-// return True;
+ ThreadId tid =3D tst->tid;
+ NSegment *stackseg =3D NULL;
+
+ if (VG_(extend_stack)(addr, tst->client_stack_szB)) {
+ stackseg =3D VG_(am_find_nsegment)(addr);
+ if (0 && stackseg)
+ VG_(printf)("frame=3D%p seg=3D%p-%p\n",
+ addr, stackseg->start, stackseg->end);
+ }
+
+ if (stackseg =3D=3D NULL || !stackseg->hasR || !stackseg->hasW) {
+ VG_(message)(
+ Vg_UserMsg,
+ "Can't extend stack to %p during signal delivery for thread %d:=
",
+ addr, tid);
+ if (stackseg =3D=3D NULL)
+ VG_(message)(Vg_UserMsg, " no stack segment");
+ else
+ VG_(message)(Vg_UserMsg, " too small or bad protection modes")=
;
+
+ /* set SIGSEGV to default handler */
+ VG_(set_default_handler)(VKI_SIGSEGV);
+ VG_(synth_fault_mapping)(tid, addr);
+
+ /* The whole process should be about to die, since the default
+ action of SIGSEGV to kill the whole process. */
+ return False;
+ }
+
+ /* For tracking memory events, indicate the entire frame has been
+ allocated. */
+ VG_TRACK( new_mem_stack_signal, addr - VG_STACK_REDZONE_SZB,
+ size + VG_STACK_REDZONE_SZB );
+
+ return True;
}
=20
=20
@@ -232,107 +179,123 @@
const vki_sigset_t *mask,
void *restorer )
{
- I_die_here;
-// struct vg_sig_private *priv;
-// Addr sp;
-// ThreadState *tst;
-// Int sigNo =3D siginfo->si_signo;
-// Addr faultaddr;
-//
-// /* Stack must be 16-byte aligned */
-// sp_top_of_frame &=3D ~0xf;
-//
-// if (flags & VKI_SA_SIGINFO) {
-// sp =3D sp_top_of_frame - sizeof(struct rt_sigframe);
-// } else {
-// sp =3D sp_top_of_frame - sizeof(struct nonrt_sigframe);
-// }
-//
-// tst =3D VG_(get_ThreadState)(tid);
-//
-// if (!extend(tst, sp, sp_top_of_frame - sp))
-// return;
-//
-// vg_assert(VG_IS_16_ALIGNED(sp));
-//
-// /* Set up the stack chain pointer */
-// VG_TRACK( pre_mem_write, Vg_CoreSignal, tid, "signal handler frame"=
,
-// sp, sizeof(UWord) );
-// *(Addr *)sp =3D tst->arch.vex.guest_GPR1;
-// VG_TRACK( post_mem_write, Vg_CoreSignal, tid,=20
-// sp, sizeof(UWord) );
-//
-// faultaddr =3D (Addr)siginfo->_sifields._sigfault._addr;
-// if (sigNo =3D=3D VKI_SIGILL && siginfo->si_code > 0)
-// faultaddr =3D tst->arch.vex.guest_CIA;
-//
-// if (flags & VKI_SA_SIGINFO) {
-// struct rt_sigframe *frame =3D (struct rt_sigframe *) sp;
-// struct vki_ucontext *ucp =3D &frame->ucontext;
-//
-// VG_TRACK( pre_mem_write, Vg_CoreSignal, tid, "signal frame sigin=
fo",
-// (Addr)&frame->siginfo, sizeof(frame->siginfo) );
-// VG_(memcpy)(&frame->siginfo, siginfo, sizeof(*siginfo));
-// VG_TRACK( post_mem_write, Vg_CoreSignal, tid,=20
-// (Addr)&frame->siginfo, sizeof(frame->siginfo) );
-//
-// VG_TRACK( pre_mem_write, Vg_CoreSignal, tid, "signal frame ucont=
ext",
-// (Addr)ucp, offsetof(struct vki_ucontext, uc_pad) );
-// ucp->uc_flags =3D 0;
-// ucp->uc_link =3D 0;
-// ucp->uc_stack =3D tst->altstack;
-// VG_TRACK( post_mem_write, Vg_CoreSignal, tid, (Addr)ucp,
-// offsetof(struct vki_ucontext, uc_pad) );
-//
-// VG_TRACK( pre_mem_write, Vg_CoreSignal, tid, "signal frame ucont=
ext",
-// (Addr)&ucp->uc_regs,
-// sizeof(ucp->uc_regs) + sizeof(ucp->uc_sigmask) );
-// ucp->uc_regs =3D &ucp->uc_mcontext;
-// ucp->uc_sigmask =3D tst->sig_mask;
-// VG_TRACK( post_mem_write, Vg_CoreSignal, tid,=20
-// (Addr)&ucp->uc_regs,
-// sizeof(ucp->uc_regs) + sizeof(ucp->uc_sigmask) );
-//
-// stack_mcontext(&ucp->uc_mcontext, tst, __NR_rt_sigreturn, faulta=
ddr);
-// priv =3D &frame->priv;
-//
-// SET_SIGNAL_GPR(tid, 4, (Addr) &frame->siginfo);
-// SET_SIGNAL_GPR(tid, 5, (Addr) ucp);
-// /* the kernel sets this, though it doesn't seem to be in the ABI=
*/
-// SET_SIGNAL_GPR(tid, 6, (Addr) &frame->siginfo);
-//
-// } else {
-// /* non-RT signal delivery */
-// struct nonrt_sigframe *frame =3D (struct nonrt_sigframe *) sp;
-// struct vki_sigcontext *scp =3D &frame->sigcontext;
-//
-// VG_TRACK( pre_mem_write, Vg_CoreSignal, tid, "signal frame sigco=
ntext",
-// (Addr)&scp->_unused[3], sizeof(*scp) - 3 * sizeof(UInt=
) );
-// scp->signal =3D sigNo;
-// scp->handler =3D (Addr) handler;
-// scp->oldmask =3D tst->sig_mask.sig[0];
-// scp->_unused[3] =3D tst->sig_mask.sig[1];
-// VG_TRACK( post_mem_write, Vg_CoreSignal, tid,
-// (Addr)&scp->_unused[3], sizeof(*scp) - 3 * sizeof(UInt=
) );
-//
-// stack_mcontext(&frame->mcontext, tst, __NR_sigreturn, faultaddr)=
;
-// priv =3D &frame->priv;
-//
-// SET_SIGNAL_GPR(tid, 4, (Addr) scp);
-// }
-//
-// priv->magicPI =3D 0x31415927;
-// priv->sigNo_private =3D sigNo;
-// priv->shadow =3D tst->arch.vex_shadow;
-//
-// SET_SIGNAL_GPR(tid, 1, sp);
-// SET_SIGNAL_GPR(tid, 3, sigNo);
-// tst->arch.vex.guest_CIA =3D (Addr) handler;
-//
-// if (0)
-// VG_(printf)("pushed signal frame; %R1 now =3D %p, "
-// "next %%CIA =3D %p, status=3D%d\n",=20
-// sp, tst->arch.vex.guest_CIA, tst->status);
+ struct vg_sig_private* priv;
+ Addr sp;
+ ThreadState* tst;
+ Int sigNo =3D siginfo->si_signo;
+ Addr faultaddr;
+ struct rt_sigframe* frame;
+
+ /* Stack must be 16-byte aligned */
+ vg_assert(VG_IS_16_ALIGNED(sizeof(struct rt_sigframe)));
+
+ sp_top_of_frame &=3D ~0xf;
+ sp =3D sp_top_of_frame - sizeof(struct rt_sigframe);
+
+ tst =3D VG_(get_ThreadState)(tid);
+ if (!extend(tst, sp, sp_top_of_frame - sp))
+ return;
+
+ vg_assert(VG_IS_16_ALIGNED(sp));
+
+ frame =3D (struct rt_sigframe *) sp;
+
+ /* clear it (conservatively) */
+ VG_(memset)(frame, 0, sizeof(*frame));
+
+ /////////
+ frame->pinfo =3D &frame->info;
+ frame->puc =3D &frame->uc;
+
+ frame->uc.uc_flags =3D 0;
+ frame->uc.uc_link =3D 0;
+ /////////
+
+ /* Set up the stack chain pointer */
+ VG_TRACK( pre_mem_write, Vg_CoreSignal, tid, "signal handler frame",
+ sp, sizeof(UWord) );
+ *(Addr *)sp =3D tst->arch.vex.guest_GPR1;
+ VG_TRACK( post_mem_write, Vg_CoreSignal, tid,=20
+ sp, sizeof(UWord) );
+
+ faultaddr =3D (Addr)siginfo->_sifields._sigfault._addr;
+ if (sigNo =3D=3D VKI_SIGILL && siginfo->si_code > 0)
+ faultaddr =3D tst->arch.vex.guest_CIA;
+
+ VG_(memcpy)(&frame->info, siginfo, sizeof(*siginfo));
+ VG_TRACK( post_mem_write, Vg_CoreSignal, tid,
+ (Addr)&frame->info, sizeof(frame->info) );
+
+ frame->uc.uc_flags =3D 0;
+ frame->uc.uc_link =3D 0;
+ frame->uc.uc_stack =3D tst->altstack;
+ frame->uc.uc_sigmask =3D tst->sig_mask;
+ VG_TRACK( post_mem_write, Vg_CoreSignal, tid,
+ (Addr)(&frame->uc), sizeof(frame->uc) );
+
+# define DO(gpr) frame->uc.uc_mcontext.gp_regs[VKI_PT_R0+gpr] \
+ =3D tst->arch.vex.guest_GPR##gpr=20
+ DO(0); DO(1); DO(2); DO(3); DO(4); DO(5); DO(6); DO(7);
+ DO(8); DO(9); DO(10); DO(11); DO(12); DO(13); DO(14); DO(15);
+ DO(16); DO(17); DO(18); DO(19); DO(20); DO(21); DO(22); DO(23);
+ DO(24); DO(25); DO(26); DO(27); DO(28); DO(29); DO(30); DO(31);
+# undef DO
+
+ frame->uc.uc_mcontext.gp_regs[VKI_PT_NIP] =3D tst->arch.vex.guest=
_CIA;
+ frame->uc.uc_mcontext.gp_regs[VKI_PT_MSR] =3D 0xf032; /* pretty=
arbitrary */
+ frame->uc.uc_mcontext.gp_regs[VKI_PT_ORIG_R3] =3D tst->arch.vex.guest=
_GPR3;
+ frame->uc.uc_mcontext.gp_regs[VKI_PT_CTR] =3D tst->arch.vex.guest=
_CTR;
+ frame->uc.uc_mcontext.gp_regs[VKI_PT_LNK] =3D tst->arch.vex.guest=
_LR;
+ frame->uc.uc_mcontext.gp_regs[VKI_PT_XER] =3D LibVEX_GuestPPC64_g=
et_XER(
+ &tst->arch.vex);
+ frame->uc.uc_mcontext.gp_regs[VKI_PT_CCR] =3D LibVEX_GuestPPC64_g=
et_CR(
+ &tst->arch.vex);
+ //mc->mc_gregs[VKI_PT_MQ] =3D 0;
+ //mc->mc_gregs[VKI_PT_TRAP] =3D 0;
+ //mc->mc_gregs[VKI_PT_DAR] =3D fault_addr;
+ //mc->mc_gregs[VKI_PT_DSISR] =3D 0;
+ //mc->mc_gregs[VKI_PT_RESULT] =3D 0;
+
+ /* XXX should do FP and vector regs */
+
+ /* set up signal return trampoline */
+ frame->tramp[0] =3D 0x38000000U + __NR_rt_sigreturn; /* li 0,__NR_rt_=
sigreturn */
+ frame->tramp[1] =3D 0x44000002U; /* sc */
+ VG_TRACK(post_mem_write, Vg_CoreSignal, tst->tid,
+ (Addr)&frame->tramp, sizeof(frame->tramp));
+
+ /* invalidate any translation of this area */
+ VG_(discard_translations)( (Addr64)&frame->tramp[0],=20
+ sizeof(frame->tramp), "stack_mcontext" ); =
=20
+
+ /* set the signal handler to return to the trampoline */
+ SET_SIGNAL_LR(tst, (Addr) &frame->tramp[0]);
+
+ /* Stack pointer for the handler .. (note, back chain set
+ earlier) */
+ SET_SIGNAL_GPR(tid, 1, sp);
+
+ /* Args for the handler .. */
+ SET_SIGNAL_GPR(tid, 3, sigNo);
+ SET_SIGNAL_GPR(tid, 4, (Addr) &frame->info);
+ SET_SIGNAL_GPR(tid, 5, (Addr) &frame->uc);
+ /* the kernel sets this, though it doesn't seem to be in the ABI */
+ SET_SIGNAL_GPR(tid, 6, (Addr) &frame->info);
+
+ /* Handler is in fact a standard ppc64-linux function descriptor,=20
+ so extract the function entry point and also the toc ptr to use. *=
/
+ SET_SIGNAL_GPR(tid, 2, (Addr) ((ULong*)handler)[1]);
+ tst->arch.vex.guest_CIA =3D (Addr) ((ULong*)handler)[0];
+
+ priv =3D &frame->priv;
+ priv->magicPI =3D 0x31415927;
+ priv->sigNo_private =3D sigNo;
+ priv->shadow =3D tst->arch.vex_shadow;
+
+ if (0)
+ VG_(printf)("pushed signal frame; %R1 now =3D %p, "
+ "next %%CIA =3D %p, status=3D%d\n",=20
+ sp, tst->arch.vex.guest_CIA, tst->status);
}
=20
=20
@@ -343,77 +306,65 @@
/* EXPORTED */
void VG_(sigframe_destroy)( ThreadId tid, Bool isRT )
{
- I_die_here;
-// ThreadState *tst;
-// struct vg_sig_private *priv;
-// Addr sp;
-// UInt frame_size;
-// struct vki_mcontext *mc;
-// Int sigNo;
-// Bool has_siginfo =3D isRT;
-//
-// vg_assert(VG_(is_valid_tid)(tid));
-// tst =3D VG_(get_ThreadState)(tid);
-//
-// /* Check that the stack frame looks valid */
-// sp =3D tst->arch.vex.guest_GPR1;
-// vg_assert(VG_IS_16_ALIGNED(sp));
-// /* JRS 17 Nov 05: This code used to check that *sp -- which should
-// have been set by the stwu at the start of the handler -- points
-// to just above the frame (ie, the previous frame). However, that
-// isn't valid when delivering signals on alt stacks. So I removed
-// it. The frame is still sanity-checked using the priv->magicPI
-// field. */
-//
-// if (has_siginfo) {
-// struct rt_sigframe *frame =3D (struct rt_sigframe *)sp;
-// frame_size =3D sizeof(*frame);
-// mc =3D &frame->ucontext.uc_mcontext;
-// priv =3D &frame->priv;
-// vg_assert(priv->magicPI =3D=3D 0x31415927);
-// tst->sig_mask =3D frame->ucontext.uc_sigmask;
-// } else {
-// struct nonrt_sigframe *frame =3D (struct nonrt_sigframe *)sp;
-// frame_size =3D sizeof(*frame);
-// mc =3D &frame->mcontext;
-// priv =3D &frame->priv;
-// vg_assert(priv->magicPI =3D=3D 0x31415927);
-// tst->sig_mask.sig[0] =3D frame->sigcontext.oldmask;
-// tst->sig_mask.sig[1] =3D frame->sigcontext._unused[3];
-// }
-// tst->tmp_sig_mask =3D tst->sig_mask;
-//
-// sigNo =3D priv->sigNo_private;
-//
-//# define DO(gpr) tst->arch.vex.guest_GPR##gpr =3D mc->mc_gregs[VKI_P=
T_R0+gpr]
-// DO(0); DO(1); DO(2); DO(3); DO(4); DO(5); DO(6); DO(7);
-// DO(8); DO(9); DO(10); DO(11); DO(12); DO(13); DO(14); DO(15);
-// DO(16); DO(17); DO(18); DO(19); DO(20); DO(21); DO(22); DO(23);
-// DO(24); DO(25); DO(26); DO(27); DO(28); DO(29); DO(30); DO(31);
-//# undef DO
-//
-// tst->arch.vex.guest_CIA =3D mc->mc_gregs[VKI_PT_NIP];
-//
-// // Umm ... ? (jrs 2005 July 8)
-// // tst->arch.m_orig_gpr3 =3D mc->mc_gregs[VKI_PT_ORIG_R3];
-//
-// LibVEX_GuestPPC32_put_CR( mc->mc_gregs[VKI_PT_CCR], &tst->arch.vex =
);
-//
-// tst->arch.vex.guest_LR =3D mc->mc_gregs[VKI_PT_LNK];
-// tst->arch.vex.guest_CTR =3D mc->mc_gregs[VKI_PT_CTR];
-// LibVEX_GuestPPC32_put_XER( mc->mc_gregs[VKI_PT_XER], &tst->arch.vex=
);
-//
-// tst->arch.vex_shadow =3D priv->shadow;
-//
-// VG_TRACK(die_mem_stack_signal, sp, frame_size);
-//
-// if (VG_(clo_trace_signals))
-// VG_(message)(Vg_DebugMsg,
-// "vg_pop_signal_frame (thread %d): isRT=3D%d valid m=
agic; EIP=3D%p",
-// tid, has_siginfo, tst->arch.vex.guest_CIA);
-//
-// /* tell the tools */
-// VG_TRACK( post_deliver_signal, tid, sigNo );
+ ThreadState *tst;
+ struct vg_sig_private *priv;
+ Addr sp;
+ UInt frame_size;
+ struct rt_sigframe *frame;
+ Int sigNo;
+ Bool has_siginfo =3D isRT;
+
+ vg_assert(VG_(is_valid_tid)(tid));
+ tst =3D VG_(get_ThreadState)(tid);
+
+ /* Check that the stack frame looks valid */
+ sp =3D tst->arch.vex.guest_GPR1;
+ vg_assert(VG_IS_16_ALIGNED(sp));
+ /* JRS 17 Nov 05: This code used to check that *sp -- which should
+ have been set by the stwu at the start of the handler -- points
+ to just above the frame (ie, the previous frame). However, that
+ isn't valid when delivering signals on alt stacks. So I removed
+ it. The frame is still sanity-checked using the priv->magicPI
+ field. */
+
+ frame =3D (struct rt_sigframe *)sp;
+ frame_size =3D sizeof(*frame);
+ priv =3D &frame->priv;
+ vg_assert(priv->magicPI =3D=3D 0x31415927);
+ tst->sig_mask =3D frame->uc.uc_sigmask;
+ tst->tmp_sig_mask =3D tst->sig_mask;
+
+ sigNo =3D priv->sigNo_private;
+
+# define DO(gpr) tst->arch.vex.guest_GPR##gpr \
+ =3D frame->uc.uc_mcontext.gp_regs[VKI_PT_R0+gpr]
+ DO(0); DO(1); DO(2); DO(3); DO(4); DO(5); DO(6); DO(7);
+ DO(8); DO(9); DO(10); DO(11); DO(12); DO(13); DO(14); DO(15);
+ DO(16); DO(17); DO(18); DO(19); DO(20); DO(21); DO(22); DO(23);
+ DO(24); DO(25); DO(26); DO(27); DO(28); DO(29); DO(30); DO(31);
+# undef DO
+
+ tst->arch.vex.guest_CIA =3D frame->uc.uc_mcontext.gp_regs[VKI_PT_NIP]=
;
+
+ LibVEX_GuestPPC64_put_CR( frame->uc.uc_mcontext.gp_regs[VKI_PT_CCR],=20
+ &tst->arch.vex );
+
+ tst->arch.vex.guest_LR =3D frame->uc.uc_mcontext.gp_regs[VKI_PT_LNK]=
;
+ tst->arch.vex.guest_CTR =3D frame->uc.uc_mcontext.gp_regs[VKI_PT_CTR]=
;
+ LibVEX_GuestPPC64_put_XER( frame->uc.uc_mcontext.gp_regs[VKI_PT_XER],=
=20
+ &tst->arch.vex );
+
+ tst->arch.vex_shadow =3D priv->shadow;
+
+ VG_TRACK(die_mem_stack_signal, sp, frame_size);
+
+ if (VG_(clo_trace_signals))
+ VG_(message)(Vg_DebugMsg,
+ "vg_pop_signal_frame (thread %d): isRT=3D%d valid mag=
ic; EIP=3D%p",
+ tid, has_siginfo, tst->arch.vex.guest_CIA);
+
+ /* tell the tools */
+ VG_TRACK( post_deliver_signal, tid, sigNo );
}
=20
/*--------------------------------------------------------------------*/
|
|
From: <js...@ac...> - 2006-01-03 04:04:32
|
Nightly build on phoenix ( SuSE 10.0 ) started at 2006-01-03 03:30:01 GMT Checking out vex source tree ... done Building vex ... done Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 209 tests, 5 stderr failures, 1 stdout failure ================= memcheck/tests/leak-tree (stderr) memcheck/tests/stack_switch (stderr) memcheck/tests/x86/scalar (stderr) none/tests/mremap2 (stdout) none/tests/x86/faultstatus (stderr) none/tests/x86/int (stderr) |
|
From: <js...@ac...> - 2006-01-03 03:56:56
|
Nightly build on g5 ( YDL 4.0, ppc970 ) started at 2006-01-03 04:40:00 CET Results unchanged from 24 hours ago Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 176 tests, 15 stderr failures, 1 stdout failure ================= memcheck/tests/badjump (stderr) memcheck/tests/badjump2 (stderr) memcheck/tests/leak-cycle (stderr) memcheck/tests/leak-tree (stderr) memcheck/tests/leakotron (stdout) memcheck/tests/mempool (stderr) memcheck/tests/partiallydefinedeq (stderr) memcheck/tests/pointer-trace (stderr) memcheck/tests/supp1 (stderr) memcheck/tests/supp_unknown (stderr) memcheck/tests/toobig-allocs (stderr) memcheck/tests/xml1 (stderr) massif/tests/toobig-allocs (stderr) none/tests/faultstatus (stderr) none/tests/fdleak_cmsg (stderr) none/tests/mremap (stderr) |
|
From: Tom H. <to...@co...> - 2006-01-03 03:42:58
|
Nightly build on dunsmere ( athlon, Fedora Core 4 ) started at 2006-01-03 03:30:05 GMT Results unchanged from 24 hours ago Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 211 tests, 7 stderr failures, 2 stdout failures ================= memcheck/tests/leak-tree (stderr) memcheck/tests/mempool (stderr) memcheck/tests/pointer-trace (stderr) memcheck/tests/stack_switch (stderr) memcheck/tests/x86/scalar (stderr) memcheck/tests/x86/sse1_memory (stdout) none/tests/mremap2 (stdout) none/tests/x86/faultstatus (stderr) none/tests/x86/int (stderr) |
|
From: <sv...@va...> - 2006-01-02 20:47:29
|
Author: dirk
Date: 2006-01-02 20:47:26 +0000 (Mon, 02 Jan 2006)
New Revision: 5482
Log:
update
Modified:
trunk/docs/internals/3_1_BUGSTATUS.txt
Modified: trunk/docs/internals/3_1_BUGSTATUS.txt
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=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/docs/internals/3_1_BUGSTATUS.txt 2006-01-02 20:46:06 UTC (rev 5=
481)
+++ trunk/docs/internals/3_1_BUGSTATUS.txt 2006-01-02 20:47:26 UTC (rev 5=
482)
@@ -8,7 +8,7 @@
=20
v5262 v5446 n-i-bz fsub 3,3,3 in ppc32 dispatcher doesn't clea=
r NaNs
v5270 v5447 n-i-bz ppc32: __NR_{set,get}priority
-v5470 pending 117332 missing line info with icc 8.1 (x86)
+v5470 v5479 117332 missing line info with icc 8.1 (x86)
pending pending 117362 partially defined equality
pending pending 117366 amd64: 0xDD 0x7C fnstsw
pending pending 117367 amd64: 0xD9 0xF4 fxtract
@@ -24,11 +24,11 @@
pending pending 118466 add %r,%r mishandled by memcheck
pending pending n-i-bz VALGRIND_COUNT_LEAKS arg types (Olly Betts)
v5429 v5450 n-i-bz memcheck/tests/mempool reads freed memory
-v5366/67/70 pending n-i-bz AshleyP's custom-allocator assertion
+v5366/67/70 v5480 n-i-bz AshleyP's custom-allocator assertion
vx1501 vx1516 n-i-bz Dirk strict-aliasing stuff
v5368 v5448 n-i-bz More space for debugger cmd line (Dan Thale=
r)
v5378/80 v5379/81 n-i-bz Clarified leak checker output message
-v5382 pending n-i-bz AshleyP's --gen-suppressions output fix
+v5382 v5481 n-i-bz AshleyP's --gen-suppressions output fix
v5384 wontfix 117096 Weird errors when --log-fd=3D has invalid v=
alue
v5396 v5449 n-i-bz cg_annotate's --sort option broken=20
(TODO: VERIFY 31BRANCH)
|
|
From: <sv...@va...> - 2006-01-02 20:46:10
|
Author: dirk
Date: 2006-01-02 20:46:06 +0000 (Mon, 02 Jan 2006)
New Revision: 5481
Log:
backport r5382 from trunk:
r5382 | njn | 2005-12-19 20:40:12 +0100 (Mon, 19 Dec 2005) | 3 lines
Fix a minor --gen-suppressions output bug.
Modified:
branches/VALGRIND_3_1_BRANCH/coregrind/m_errormgr.c
Modified: branches/VALGRIND_3_1_BRANCH/coregrind/m_errormgr.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
--- branches/VALGRIND_3_1_BRANCH/coregrind/m_errormgr.c 2006-01-02 20:44:=
14 UTC (rev 5480)
+++ branches/VALGRIND_3_1_BRANCH/coregrind/m_errormgr.c 2006-01-02 20:46:=
06 UTC (rev 5481)
@@ -404,19 +404,21 @@
if (stop_at > VG_MAX_SUPP_CALLERS) stop_at =3D VG_MAX_SUPP_CALLERS;
vg_assert(stop_at > 0);
=20
- VG_(printf)("{\n");
- VG_(printf)(" <insert a suppression name here>\n");
-
if (ThreadErr =3D=3D err->ekind || MutexErr =3D=3D err->ekind) {
+ VG_(printf)("{\n");
+ VG_(printf)(" <insert a suppression name here>\n");
VG_(printf)(" core:PThread\n");
=20
} else {
Char* name =3D VG_TDICT_CALL(tool_get_error_name, err);
if (NULL =3D=3D name) {
VG_(message)(Vg_UserMsg,=20
- "(tool does not allow error to be suppressed)");
+ "(%s does not allow error to be suppressed)",
+ VG_(details).name);
return;
}
+ VG_(printf)("{\n");
+ VG_(printf)(" <insert a suppression name here>\n");
VG_(printf)(" %s:%s\n", VG_(details).name, name);
VG_TDICT_CALL(tool_print_extra_suppression_info, err);
}
|
|
From: <sv...@va...> - 2006-01-02 20:44:25
|
Author: dirk
Date: 2006-01-02 20:44:14 +0000 (Mon, 02 Jan 2006)
New Revision: 5480
Log:
merge 5366/67/70 from trunk to fix AshleyP's custom-allocator assertion
Modified:
branches/VALGRIND_3_1_BRANCH/memcheck/mac_leakcheck.c
Modified: branches/VALGRIND_3_1_BRANCH/memcheck/mac_leakcheck.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
--- branches/VALGRIND_3_1_BRANCH/memcheck/mac_leakcheck.c 2006-01-02 20:4=
1:28 UTC (rev 5479)
+++ branches/VALGRIND_3_1_BRANCH/memcheck/mac_leakcheck.c 2006-01-02 20:4=
4:14 UTC (rev 5480)
@@ -119,10 +119,10 @@
*/
typedef=20
enum {=20
- Unreached,=20
- IndirectLeak,
- Interior,=20
- Proper
+ Unreached =3D0,=20
+ IndirectLeak =3D1,
+ Interior =3D2,=20
+ Proper =3D3
}
Reachedness;
=20
@@ -536,7 +536,17 @@
lc_do_leakcheck(i);
=20
tl_assert(lc_markstack_top =3D=3D -1);
- tl_assert(lc_markstack[i].state =3D=3D IndirectLeak);
+ tl_assert(lc_markstack[i].state =3D=3D IndirectLeak
+ /* jrs 20051218: Ashley Pittman supplied a
+ custom-allocator test program which causes the =3D=3D
+ IndirectLeak condition to fail - it causes .state
+ to be Unreached. Since I have no idea how this
+ clique stuff works and no time to figure it out,
+ just allow that condition too. This could well be
+ a completely bogus fix. It doesn't seem unsafe
+ given that in any case the .state field is
+ immediately overwritten by the next statement. */
+ || lc_markstack[i].state =3D=3D Unreached);
=20
lc_markstack[i].state =3D Unreached; /* Return to unreached state,
to indicate its a clique
@@ -702,7 +712,7 @@
/* Sanity check -- make sure they don't overlap */
for (i =3D 0; i < lc_n_shadows-1; i++) {
tl_assert( lc_shadows[i]->data + lc_shadows[i]->size
- < lc_shadows[i+1]->data );
+ <=3D lc_shadows[i+1]->data );
}
=20
if (lc_n_shadows =3D=3D 0) {
|
|
From: <sv...@va...> - 2006-01-02 20:41:32
|
Author: dirk
Date: 2006-01-02 20:41:28 +0000 (Mon, 02 Jan 2006)
New Revision: 5479
Log:
backport r5470 from trunk:
r5470 | sewardj | 2006-01-02 00:00:49 +0100 (Mon, 02 Jan 2006) | 5 lines
Read dwarf2 line number information even if a .debug_str section was
not found. This is believed to fix the regression in 3.1.X wherein
debug info was sometimes not read from icc-8.1 generated executables.
Modified:
branches/VALGRIND_3_1_BRANCH/coregrind/m_debuginfo/dwarf.c
branches/VALGRIND_3_1_BRANCH/coregrind/m_debuginfo/symtab.c
Modified: branches/VALGRIND_3_1_BRANCH/coregrind/m_debuginfo/dwarf.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
--- branches/VALGRIND_3_1_BRANCH/coregrind/m_debuginfo/dwarf.c 2006-01-02=
19:34:53 UTC (rev 5478)
+++ branches/VALGRIND_3_1_BRANCH/coregrind/m_debuginfo/dwarf.c 2006-01-02=
20:41:28 UTC (rev 5479)
@@ -847,9 +847,14 @@
/* Those cases extract the data properly */
case 0x05: /* FORM_data2 */ cval =3D *((UShort*)p); p +=3D=
2; break;
case 0x06: /* FORM_data4 */ cval =3D *((UInt*)p);p +=3D4=
; break;
- case 0x0e: /* FORM_strp */ sval =3D debugstr + *((UInt*=
)p);=20
- p +=3D 4; break;
- /* pointer in .debug_str */
+ case 0x0e: /* FORM_strp */ /* pointer in .debug_str */
+ /* 2006-01-01: only generate a value if
+ debugstr is non-NULL (which means that a
+ debug_str section was found) */
+ if (debugstr)
+ sval =3D debugstr + *((UI=
nt*)p);=20
+ p +=3D 4;=20
+ break;
case 0x08: /* FORM_string */ sval =3D (Char*)p;=20
p +=3D VG_(strlen)((Char*)p)=
+ 1; break;
case 0x0b: /* FORM_data1 */ cval =3D *p; p++; break;
Modified: branches/VALGRIND_3_1_BRANCH/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
--- branches/VALGRIND_3_1_BRANCH/coregrind/m_debuginfo/symtab.c 2006-01-0=
2 19:34:53 UTC (rev 5478)
+++ branches/VALGRIND_3_1_BRANCH/coregrind/m_debuginfo/symtab.c 2006-01-0=
2 20:41:28 UTC (rev 5479)
@@ -1727,7 +1727,12 @@
stabstr, stabstr_sz );
}
# endif
- if (debug_info && debug_abbv && debug_line && debug_str) {
+ /* jrs 2006-01-01: icc-8.1 has been observed to generate
+ binaries without debug_str sections. Don't preclude
+ debuginfo reading for that reason, but, in
+ read_unitinfo_dwarf2, do check that debugstr is non-NULL
+ before using it. */
+ if (debug_info && debug_abbv && debug_line /* && debug_str */) {
ML_(read_debuginfo_dwarf2) ( si,=20
debug_info, debug_info_sz,
debug_abbv,
|
|
From: <sv...@va...> - 2006-01-02 19:35:03
|
Author: dirk
Date: 2006-01-02 19:34:53 +0000 (Mon, 02 Jan 2006)
New Revision: 5478
Log:
backport from trunk:
r5325 | njn | 2005-12-12 16:54:50 +0100 (Mon, 12 Dec 2005) | 3 lines
Make it clearer that internal errors are Valgrind's fault.
Modified:
branches/VALGRIND_3_1_BRANCH/coregrind/m_signals.c
Modified: branches/VALGRIND_3_1_BRANCH/coregrind/m_signals.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
--- branches/VALGRIND_3_1_BRANCH/coregrind/m_signals.c 2006-01-02 19:06:3=
7 UTC (rev 5477)
+++ branches/VALGRIND_3_1_BRANCH/coregrind/m_signals.c 2006-01-02 19:34:5=
3 UTC (rev 5478)
@@ -1699,7 +1699,7 @@
Valgrind internally.
*/
VG_(message)(Vg_DebugMsg,=20
- "INTERNAL ERROR: Valgrind received a signal %d (%s) - exiting",
+ "VALGRIND INTERNAL ERROR: Valgrind received a signal %d (%s) - exit=
ing",
sigNo, signame(sigNo));
=20
VG_(message)(Vg_DebugMsg,=20
|
|
From: <sv...@va...> - 2006-01-02 19:06:42
|
Author: sewardj
Date: 2006-01-02 19:06:37 +0000 (Mon, 02 Jan 2006)
New Revision: 5477
Log:
Enable various syscalls.
Modified:
trunk/coregrind/m_syswrap/syswrap-ppc64-linux.c
Modified: trunk/coregrind/m_syswrap/syswrap-ppc64-linux.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_syswrap/syswrap-ppc64-linux.c 2006-01-02 19:06:08 U=
TC (rev 5476)
+++ trunk/coregrind/m_syswrap/syswrap-ppc64-linux.c 2006-01-02 19:06:37 U=
TC (rev 5477)
@@ -413,7 +413,7 @@
aren't visible outside this file, but that requires even more macro
magic. */
=20
-//zz DECL_TEMPLATE(ppc64_linux, sys_socketcall);
+DECL_TEMPLATE(ppc64_linux, sys_socketcall);
DECL_TEMPLATE(ppc64_linux, sys_mmap);
//zz DECL_TEMPLATE(ppc64_linux, sys_mmap2);
//zz DECL_TEMPLATE(ppc64_linux, sys_stat64);
@@ -424,264 +424,264 @@
//zz DECL_TEMPLATE(ppc64_linux, sys_sigreturn);
//zz DECL_TEMPLATE(ppc64_linux, sys_rt_sigreturn);
//zz DECL_TEMPLATE(ppc64_linux, sys_sigaction);
-//zz=20
-//zz PRE(sys_socketcall)
-//zz {
-//zz # define ARG2_0 (((UWord*)ARG2)[0])
-//zz # define ARG2_1 (((UWord*)ARG2)[1])
-//zz # define ARG2_2 (((UWord*)ARG2)[2])
-//zz # define ARG2_3 (((UWord*)ARG2)[3])
-//zz # define ARG2_4 (((UWord*)ARG2)[4])
-//zz # define ARG2_5 (((UWord*)ARG2)[5])
-//zz=20
-//zz *flags |=3D SfMayBlock;
-//zz PRINT("sys_socketcall ( %d, %p )",ARG1,ARG2);
-//zz PRE_REG_READ2(long, "socketcall", int, call, unsigned long *, ar=
gs);
-//zz=20
-//zz switch (ARG1 /* request */) {
-//zz=20
-//zz case VKI_SYS_SOCKETPAIR:
-//zz /* int socketpair(int d, int type, int protocol, int sv[2]); *=
/
-//zz PRE_MEM_READ( "socketcall.socketpair(args)", ARG2, 4*sizeof(A=
ddr) );
-//zz ML_(generic_PRE_sys_socketpair)( tid, ARG2_0, ARG2_1, ARG2_2,=
ARG2_3 );
-//zz break;
-//zz=20
-//zz case VKI_SYS_SOCKET:
-//zz /* int socket(int domain, int type, int protocol); */
-//zz PRE_MEM_READ( "socketcall.socket(args)", ARG2, 3*sizeof(Addr)=
);
-//zz break;
-//zz=20
-//zz case VKI_SYS_BIND:
-//zz /* int bind(int sockfd, struct sockaddr *my_addr,
-//zz int addrlen); */
-//zz PRE_MEM_READ( "socketcall.bind(args)", ARG2, 3*sizeof(Addr) )=
;
-//zz ML_(generic_PRE_sys_bind)( tid, ARG2_0, ARG2_1, ARG2_2 );
-//zz break;
-//zz=20
-//zz case VKI_SYS_LISTEN:
-//zz /* int listen(int s, int backlog); */
-//zz PRE_MEM_READ( "socketcall.listen(args)", ARG2, 2*sizeof(Addr)=
);
-//zz break;
-//zz=20
-//zz case VKI_SYS_ACCEPT: {
-//zz /* int accept(int s, struct sockaddr *addr, int *addrlen); */
-//zz PRE_MEM_READ( "socketcall.accept(args)", ARG2, 3*sizeof(Addr)=
);
-//zz ML_(generic_PRE_sys_accept)( tid, ARG2_0, ARG2_1, ARG2_2 );
-//zz break;
-//zz }
-//zz=20
-//zz case VKI_SYS_SENDTO:
-//zz /* int sendto(int s, const void *msg, int len,
-//zz unsigned int flags,
-//zz const struct sockaddr *to, int tolen); */
-//zz PRE_MEM_READ( "socketcall.sendto(args)", ARG2, 6*sizeof(Addr) =
);
-//zz ML_(generic_PRE_sys_sendto)( tid, ARG2_0, ARG2_1, ARG2_2,
-//zz ARG2_3, ARG2_4, ARG2_5 );
-//zz break;
-//zz=20
-//zz case VKI_SYS_SEND:
-//zz /* int send(int s, const void *msg, size_t len, int flags); */
-//zz PRE_MEM_READ( "socketcall.send(args)", ARG2, 4*sizeof(Addr) );
-//zz ML_(generic_PRE_sys_send)( tid, ARG2_0, ARG2_1, ARG2_2 );
-//zz break;
-//zz=20
-//zz case VKI_SYS_RECVFROM:
-//zz /* int recvfrom(int s, void *buf, int len, unsigned int flags,
-//zz struct sockaddr *from, int *fromlen); */
-//zz PRE_MEM_READ( "socketcall.recvfrom(args)", ARG2, 6*sizeof(Addr=
) );
-//zz ML_(generic_PRE_sys_recvfrom)( tid, ARG2_0, ARG2_1, ARG2_2,
-//zz ARG2_3, ARG2_4, ARG2_5 );
-//zz break;
-//zz=20
-//zz case VKI_SYS_RECV:
-//zz /* int recv(int s, void *buf, int len, unsigned int flags); */
-//zz /* man 2 recv says:
-//zz The recv call is normally used only on a connected socket
-//zz (see connect(2)) and is identical to recvfrom with a NULL
-//zz from parameter.
-//zz */
-//zz PRE_MEM_READ( "socketcall.recv(args)", ARG2, 4*sizeof(Addr) );
-//zz ML_(generic_PRE_sys_recv)( tid, ARG2_0, ARG2_1, ARG2_2 );
-//zz break;
-//zz=20
-//zz case VKI_SYS_CONNECT:
-//zz /* int connect(int sockfd,
-//zz struct sockaddr *serv_addr, int addrlen ); */
-//zz PRE_MEM_READ( "socketcall.connect(args)", ARG2, 3*sizeof(Addr)=
);
-//zz ML_(generic_PRE_sys_connect)( tid, ARG2_0, ARG2_1, ARG2_2 );
-//zz break;
-//zz=20
-//zz case VKI_SYS_SETSOCKOPT:
-//zz /* int setsockopt(int s, int level, int optname,
-//zz const void *optval, int optlen); */
-//zz PRE_MEM_READ( "socketcall.setsockopt(args)", ARG2, 5*sizeof(Ad=
dr) );
-//zz ML_(generic_PRE_sys_setsockopt)( tid, ARG2_0, ARG2_1, ARG2_2,
-//zz ARG2_3, ARG2_4 );
-//zz break;
-//zz=20
-//zz case VKI_SYS_GETSOCKOPT:
-//zz /* int getsockopt(int s, int level, int optname,
-//zz void *optval, socklen_t *optlen); */
-//zz PRE_MEM_READ( "socketcall.getsockopt(args)", ARG2, 5*sizeof(Ad=
dr) );
-//zz ML_(generic_PRE_sys_getsockopt)( tid, ARG2_0, ARG2_1, ARG2_2,
-//zz ARG2_3, ARG2_4 );
-//zz break;
-//zz=20
-//zz case VKI_SYS_GETSOCKNAME:
-//zz /* int getsockname(int s, struct sockaddr* name, int* namelen)=
*/
-//zz PRE_MEM_READ( "socketcall.getsockname(args)", ARG2, 3*sizeof(A=
ddr) );
-//zz ML_(generic_PRE_sys_getsockname)( tid, ARG2_0, ARG2_1, ARG2_2 =
);
-//zz break;
-//zz=20
-//zz case VKI_SYS_GETPEERNAME:
-//zz /* int getpeername(int s, struct sockaddr* name, int* namelen)=
*/
-//zz PRE_MEM_READ( "socketcall.getpeername(args)", ARG2, 3*sizeof(A=
ddr) );
-//zz ML_(generic_PRE_sys_getpeername)( tid, ARG2_0, ARG2_1, ARG2_2 =
);
-//zz break;
-//zz=20
-//zz case VKI_SYS_SHUTDOWN:
-//zz /* int shutdown(int s, int how); */
-//zz PRE_MEM_READ( "socketcall.shutdown(args)", ARG2, 2*sizeof(Addr=
) );
-//zz break;
-//zz=20
-//zz case VKI_SYS_SENDMSG: {
-//zz /* int sendmsg(int s, const struct msghdr *msg, int flags); */
-//zz=20
-//zz /* this causes warnings, and I don't get why. glibc bug?
-//zz * (after all it's glibc providing the arguments array)
-//zz PRE_MEM_READ( "socketcall.sendmsg(args)", ARG2, 3*sizeof(Add=
r) );
-//zz */
-//zz ML_(generic_PRE_sys_sendmsg)( tid, ARG2_0, ARG2_1 );
-//zz break;
-//zz }
-//zz=20
-//zz case VKI_SYS_RECVMSG: {
-//zz /* int recvmsg(int s, struct msghdr *msg, int flags); */
-//zz=20
-//zz /* this causes warnings, and I don't get why. glibc bug?
-//zz * (after all it's glibc providing the arguments array)
-//zz PRE_MEM_READ("socketcall.recvmsg(args)", ARG2, 3*sizeof(Addr=
) );
-//zz */
-//zz ML_(generic_PRE_sys_recvmsg)( tid, ARG2_0, ARG2_1 );
-//zz break;
-//zz }
-//zz=20
-//zz default:
-//zz VG_(message)(Vg_DebugMsg,"Warning: unhandled socketcall 0x%x",=
ARG1);
-//zz SET_STATUS_Failure( VKI_EINVAL );
-//zz break;
-//zz }
-//zz # undef ARG2_0
-//zz # undef ARG2_1
-//zz # undef ARG2_2
-//zz # undef ARG2_3
-//zz # undef ARG2_4
-//zz # undef ARG2_5
-//zz }
-//zz=20
-//zz POST(sys_socketcall)
-//zz {
-//zz # define ARG2_0 (((UWord*)ARG2)[0])
-//zz # define ARG2_1 (((UWord*)ARG2)[1])
-//zz # define ARG2_2 (((UWord*)ARG2)[2])
-//zz # define ARG2_3 (((UWord*)ARG2)[3])
-//zz # define ARG2_4 (((UWord*)ARG2)[4])
-//zz # define ARG2_5 (((UWord*)ARG2)[5])
-//zz=20
-//zz SysRes r;
-//zz vg_assert(SUCCESS);
-//zz switch (ARG1 /* request */) {
-//zz=20
-//zz case VKI_SYS_SOCKETPAIR:
-//zz r =3D ML_(generic_POST_sys_socketpair)(
-//zz tid, VG_(mk_SysRes_Success)(RES),
-//zz ARG2_0, ARG2_1, ARG2_2, ARG2_3
-//zz );
-//zz SET_STATUS_from_SysRes(r);
-//zz break;
-//zz=20
-//zz case VKI_SYS_SOCKET:
-//zz r =3D ML_(generic_POST_sys_socket)( tid, VG_(mk_SysRes_Success)=
(RES) );
-//zz SET_STATUS_from_SysRes(r);
-//zz break;
-//zz=20
-//zz case VKI_SYS_BIND:
-//zz /* int bind(int sockfd, struct sockaddr *my_addr,
-//zz int addrlen); */
-//zz break;
-//zz=20
-//zz case VKI_SYS_LISTEN:
-//zz /* int listen(int s, int backlog); */
-//zz break;
-//zz=20
-//zz case VKI_SYS_ACCEPT:
-//zz /* int accept(int s, struct sockaddr *addr, int *addrlen); */
-//zz r =3D ML_(generic_POST_sys_accept)( tid, VG_(mk_SysRes_Success)=
(RES),
-//zz ARG2_0, ARG2_1, ARG2_2 );
-//zz SET_STATUS_from_SysRes(r);
-//zz break;
-//zz=20
-//zz case VKI_SYS_SENDTO:
-//zz break;
-//zz=20
-//zz case VKI_SYS_SEND:
-//zz break;
-//zz=20
-//zz case VKI_SYS_RECVFROM:
-//zz ML_(generic_POST_sys_recvfrom)( tid, VG_(mk_SysRes_Success)(RES=
),
-//zz ARG2_0, ARG2_1, ARG2_2,
-//zz ARG2_3, ARG2_4, ARG2_5 );
-//zz break;
-//zz=20
-//zz case VKI_SYS_RECV:
-//zz ML_(generic_POST_sys_recv)( tid, RES, ARG2_0, ARG2_1, ARG2_2 );
-//zz break;
-//zz=20
-//zz case VKI_SYS_CONNECT:
-//zz break;
-//zz=20
-//zz case VKI_SYS_SETSOCKOPT:
-//zz break;
-//zz=20
-//zz case VKI_SYS_GETSOCKOPT:
-//zz ML_(generic_POST_sys_getsockopt)( tid, VG_(mk_SysRes_Success)(R=
ES),
-//zz ARG2_0, ARG2_1,
-//zz ARG2_2, ARG2_3, ARG2_4 );
-//zz break;
-//zz=20
-//zz case VKI_SYS_GETSOCKNAME:
-//zz ML_(generic_POST_sys_getsockname)( tid, VG_(mk_SysRes_Success)(=
RES),
-//zz ARG2_0, ARG2_1, ARG2_2 );
-//zz break;
-//zz=20
-//zz case VKI_SYS_GETPEERNAME:
-//zz ML_(generic_POST_sys_getpeername)( tid, VG_(mk_SysRes_Success)(=
RES),
-//zz ARG2_0, ARG2_1, ARG2_2 );
-//zz break;
-//zz=20
-//zz case VKI_SYS_SHUTDOWN:
-//zz break;
-//zz=20
-//zz case VKI_SYS_SENDMSG:
-//zz break;
-//zz=20
-//zz case VKI_SYS_RECVMSG:
-//zz ML_(generic_POST_sys_recvmsg)( tid, ARG2_0, ARG2_1 );
-//zz break;
-//zz=20
-//zz default:
-//zz VG_(message)(Vg_DebugMsg,"FATAL: unhandled socketcall 0x%x",ARG=
1);
-//zz VG_(core_panic)("... bye!\n");
-//zz break; /*NOTREACHED*/
-//zz }
-//zz # undef ARG2_0
-//zz # undef ARG2_1
-//zz # undef ARG2_2
-//zz # undef ARG2_3
-//zz # undef ARG2_4
-//zz # undef ARG2_5
-//zz }
=20
+PRE(sys_socketcall)
+{
+# define ARG2_0 (((UWord*)ARG2)[0])
+# define ARG2_1 (((UWord*)ARG2)[1])
+# define ARG2_2 (((UWord*)ARG2)[2])
+# define ARG2_3 (((UWord*)ARG2)[3])
+# define ARG2_4 (((UWord*)ARG2)[4])
+# define ARG2_5 (((UWord*)ARG2)[5])
+
+ *flags |=3D SfMayBlock;
+ PRINT("sys_socketcall ( %d, %p )",ARG1,ARG2);
+ PRE_REG_READ2(long, "socketcall", int, call, unsigned long *, args);
+
+ switch (ARG1 /* request */) {
+
+ case VKI_SYS_SOCKETPAIR:
+ /* int socketpair(int d, int type, int protocol, int sv[2]); */
+ PRE_MEM_READ( "socketcall.socketpair(args)", ARG2, 4*sizeof(Addr) =
);
+ ML_(generic_PRE_sys_socketpair)( tid, ARG2_0, ARG2_1, ARG2_2, ARG2=
_3 );
+ break;
+
+ case VKI_SYS_SOCKET:
+ /* int socket(int domain, int type, int protocol); */
+ PRE_MEM_READ( "socketcall.socket(args)", ARG2, 3*sizeof(Addr) );
+ break;
+
+ case VKI_SYS_BIND:
+ /* int bind(int sockfd, struct sockaddr *my_addr,
+ int addrlen); */
+ PRE_MEM_READ( "socketcall.bind(args)", ARG2, 3*sizeof(Addr) );
+ ML_(generic_PRE_sys_bind)( tid, ARG2_0, ARG2_1, ARG2_2 );
+ break;
+
+ case VKI_SYS_LISTEN:
+ /* int listen(int s, int backlog); */
+ PRE_MEM_READ( "socketcall.listen(args)", ARG2, 2*sizeof(Addr) );
+ break;
+
+ case VKI_SYS_ACCEPT: {
+ /* int accept(int s, struct sockaddr *addr, int *addrlen); */
+ PRE_MEM_READ( "socketcall.accept(args)", ARG2, 3*sizeof(Addr) );
+ ML_(generic_PRE_sys_accept)( tid, ARG2_0, ARG2_1, ARG2_2 );
+ break;
+ }
+
+ case VKI_SYS_SENDTO:
+ /* int sendto(int s, const void *msg, int len,
+ unsigned int flags,
+ const struct sockaddr *to, int tolen); */
+ PRE_MEM_READ( "socketcall.sendto(args)", ARG2, 6*sizeof(Addr) );
+ ML_(generic_PRE_sys_sendto)( tid, ARG2_0, ARG2_1, ARG2_2,
+ ARG2_3, ARG2_4, ARG2_5 );
+ break;
+
+ case VKI_SYS_SEND:
+ /* int send(int s, const void *msg, size_t len, int flags); */
+ PRE_MEM_READ( "socketcall.send(args)", ARG2, 4*sizeof(Addr) );
+ ML_(generic_PRE_sys_send)( tid, ARG2_0, ARG2_1, ARG2_2 );
+ break;
+
+ case VKI_SYS_RECVFROM:
+ /* int recvfrom(int s, void *buf, int len, unsigned int flags,
+ struct sockaddr *from, int *fromlen); */
+ PRE_MEM_READ( "socketcall.recvfrom(args)", ARG2, 6*sizeof(Addr) );
+ ML_(generic_PRE_sys_recvfrom)( tid, ARG2_0, ARG2_1, ARG2_2,
+ ARG2_3, ARG2_4, ARG2_5 );
+ break;
+
+ case VKI_SYS_RECV:
+ /* int recv(int s, void *buf, int len, unsigned int flags); */
+ /* man 2 recv says:
+ The recv call is normally used only on a connected socket
+ (see connect(2)) and is identical to recvfrom with a NULL
+ from parameter.
+ */
+ PRE_MEM_READ( "socketcall.recv(args)", ARG2, 4*sizeof(Addr) );
+ ML_(generic_PRE_sys_recv)( tid, ARG2_0, ARG2_1, ARG2_2 );
+ break;
+
+ case VKI_SYS_CONNECT:
+ /* int connect(int sockfd,
+ struct sockaddr *serv_addr, int addrlen ); */
+ PRE_MEM_READ( "socketcall.connect(args)", ARG2, 3*sizeof(Addr) );
+ ML_(generic_PRE_sys_connect)( tid, ARG2_0, ARG2_1, ARG2_2 );
+ break;
+
+ case VKI_SYS_SETSOCKOPT:
+ /* int setsockopt(int s, int level, int optname,
+ const void *optval, int optlen); */
+ PRE_MEM_READ( "socketcall.setsockopt(args)", ARG2, 5*sizeof(Addr) )=
;
+ ML_(generic_PRE_sys_setsockopt)( tid, ARG2_0, ARG2_1, ARG2_2,
+ ARG2_3, ARG2_4 );
+ break;
+
+ case VKI_SYS_GETSOCKOPT:
+ /* int getsockopt(int s, int level, int optname,
+ void *optval, socklen_t *optlen); */
+ PRE_MEM_READ( "socketcall.getsockopt(args)", ARG2, 5*sizeof(Addr) )=
;
+ ML_(generic_PRE_sys_getsockopt)( tid, ARG2_0, ARG2_1, ARG2_2,
+ ARG2_3, ARG2_4 );
+ break;
+
+ case VKI_SYS_GETSOCKNAME:
+ /* int getsockname(int s, struct sockaddr* name, int* namelen) */
+ PRE_MEM_READ( "socketcall.getsockname(args)", ARG2, 3*sizeof(Addr) =
);
+ ML_(generic_PRE_sys_getsockname)( tid, ARG2_0, ARG2_1, ARG2_2 );
+ break;
+
+ case VKI_SYS_GETPEERNAME:
+ /* int getpeername(int s, struct sockaddr* name, int* namelen) */
+ PRE_MEM_READ( "socketcall.getpeername(args)", ARG2, 3*sizeof(Addr) =
);
+ ML_(generic_PRE_sys_getpeername)( tid, ARG2_0, ARG2_1, ARG2_2 );
+ break;
+
+ case VKI_SYS_SHUTDOWN:
+ /* int shutdown(int s, int how); */
+ PRE_MEM_READ( "socketcall.shutdown(args)", ARG2, 2*sizeof(Addr) );
+ break;
+
+ case VKI_SYS_SENDMSG: {
+ /* int sendmsg(int s, const struct msghdr *msg, int flags); */
+
+ /* this causes warnings, and I don't get why. glibc bug?
+ * (after all it's glibc providing the arguments array)
+ PRE_MEM_READ( "socketcall.sendmsg(args)", ARG2, 3*sizeof(Addr) );
+ */
+ ML_(generic_PRE_sys_sendmsg)( tid, ARG2_0, ARG2_1 );
+ break;
+ }
+
+ case VKI_SYS_RECVMSG: {
+ /* int recvmsg(int s, struct msghdr *msg, int flags); */
+
+ /* this causes warnings, and I don't get why. glibc bug?
+ * (after all it's glibc providing the arguments array)
+ PRE_MEM_READ("socketcall.recvmsg(args)", ARG2, 3*sizeof(Addr) );
+ */
+ ML_(generic_PRE_sys_recvmsg)( tid, ARG2_0, ARG2_1 );
+ break;
+ }
+
+ default:
+ VG_(message)(Vg_DebugMsg,"Warning: unhandled socketcall 0x%x",ARG1)=
;
+ SET_STATUS_Failure( VKI_EINVAL );
+ break;
+ }
+# undef ARG2_0
+# undef ARG2_1
+# undef ARG2_2
+# undef ARG2_3
+# undef ARG2_4
+# undef ARG2_5
+}
+
+POST(sys_socketcall)
+{
+# define ARG2_0 (((UWord*)ARG2)[0])
+# define ARG2_1 (((UWord*)ARG2)[1])
+# define ARG2_2 (((UWord*)ARG2)[2])
+# define ARG2_3 (((UWord*)ARG2)[3])
+# define ARG2_4 (((UWord*)ARG2)[4])
+# define ARG2_5 (((UWord*)ARG2)[5])
+
+ SysRes r;
+ vg_assert(SUCCESS);
+ switch (ARG1 /* request */) {
+
+ case VKI_SYS_SOCKETPAIR:
+ r =3D ML_(generic_POST_sys_socketpair)(
+ tid, VG_(mk_SysRes_Success)(RES),
+ ARG2_0, ARG2_1, ARG2_2, ARG2_3
+ );
+ SET_STATUS_from_SysRes(r);
+ break;
+
+ case VKI_SYS_SOCKET:
+ r =3D ML_(generic_POST_sys_socket)( tid, VG_(mk_SysRes_Success)(RES)=
);
+ SET_STATUS_from_SysRes(r);
+ break;
+
+ case VKI_SYS_BIND:
+ /* int bind(int sockfd, struct sockaddr *my_addr,
+ int addrlen); */
+ break;
+
+ case VKI_SYS_LISTEN:
+ /* int listen(int s, int backlog); */
+ break;
+
+ case VKI_SYS_ACCEPT:
+ /* int accept(int s, struct sockaddr *addr, int *addrlen); */
+ r =3D ML_(generic_POST_sys_accept)( tid, VG_(mk_SysRes_Success)(RES)=
,
+ ARG2_0, ARG2_1, ARG2_2 );
+ SET_STATUS_from_SysRes(r);
+ break;
+
+ case VKI_SYS_SENDTO:
+ break;
+
+ case VKI_SYS_SEND:
+ break;
+
+ case VKI_SYS_RECVFROM:
+ ML_(generic_POST_sys_recvfrom)( tid, VG_(mk_SysRes_Success)(RES),
+ ARG2_0, ARG2_1, ARG2_2,
+ ARG2_3, ARG2_4, ARG2_5 );
+ break;
+
+ case VKI_SYS_RECV:
+ ML_(generic_POST_sys_recv)( tid, RES, ARG2_0, ARG2_1, ARG2_2 );
+ break;
+
+ case VKI_SYS_CONNECT:
+ break;
+
+ case VKI_SYS_SETSOCKOPT:
+ break;
+
+ case VKI_SYS_GETSOCKOPT:
+ ML_(generic_POST_sys_getsockopt)( tid, VG_(mk_SysRes_Success)(RES),
+ ARG2_0, ARG2_1,
+ ARG2_2, ARG2_3, ARG2_4 );
+ break;
+
+ case VKI_SYS_GETSOCKNAME:
+ ML_(generic_POST_sys_getsockname)( tid, VG_(mk_SysRes_Success)(RES),
+ ARG2_0, ARG2_1, ARG2_2 );
+ break;
+
+ case VKI_SYS_GETPEERNAME:
+ ML_(generic_POST_sys_getpeername)( tid, VG_(mk_SysRes_Success)(RES),
+ ARG2_0, ARG2_1, ARG2_2 );
+ break;
+
+ case VKI_SYS_SHUTDOWN:
+ break;
+
+ case VKI_SYS_SENDMSG:
+ break;
+
+ case VKI_SYS_RECVMSG:
+ ML_(generic_POST_sys_recvmsg)( tid, ARG2_0, ARG2_1 );
+ break;
+
+ default:
+ VG_(message)(Vg_DebugMsg,"FATAL: unhandled socketcall 0x%x",ARG1);
+ VG_(core_panic)("... bye!\n");
+ break; /*NOTREACHED*/
+ }
+# undef ARG2_0
+# undef ARG2_1
+# undef ARG2_2
+# undef ARG2_3
+# undef ARG2_4
+# undef ARG2_5
+}
+
PRE(sys_mmap)
{
SysRes r;
@@ -1182,12 +1182,12 @@
=20
GENXY(__NR_open, sys_open), // 5
GENXY(__NR_close, sys_close), // 6
-// _____(__NR_waitpid, sys_waitpid), // 7
-// _____(__NR_creat, sys_creat), // 8
+ GENXY(__NR_waitpid, sys_waitpid), // 7
+ GENXY(__NR_creat, sys_creat), // 8
// _____(__NR_link, sys_link), // 9
=20
GENX_(__NR_unlink, sys_unlink), // 10
-// _____(__NR_execve, sys_execve), // 11
+ GENX_(__NR_execve, sys_execve), // 11
// _____(__NR_chdir, sys_chdir), // 12
// _____(__NR_time, sys_time), // 13
// _____(__NR_mknod, sys_mknod), // 14
@@ -1198,7 +1198,7 @@
// _____(__NR_oldstat, sys_oldstat), // 18
// _____(__NR_lseek, sys_lseek), // 19
=20
-// _____(__NR_getpid, sys_getpid), // 20
+ GENX_(__NR_getpid, sys_getpid), // 20
// _____(__NR_mount, sys_mount), // 21
// _____(__NR_umount, sys_umount), // 22
// _____(__NR_setuid, sys_setuid), // 23
@@ -1208,7 +1208,7 @@
// _____(__NR_ptrace, sys_ptrace), // 26
// _____(__NR_alarm, sys_alarm), // 27
// _____(__NR_oldfstat, sys_oldfstat), // 28
-// _____(__NR_pause, sys_pause), // 29
+ GENX_(__NR_pause, sys_pause), // 29
=20
LINX_(__NR_utime, sys_utime), // 30
// _____(__NR_stty, sys_stty), // 31
@@ -1218,12 +1218,12 @@
=20
// _____(__NR_ftime, sys_ftime), // 35
// _____(__NR_sync, sys_sync), // 36
-// _____(__NR_kill, sys_kill), // 37
+ GENX_(__NR_kill, sys_kill), // 37
// _____(__NR_rename, sys_rename), // 38
// _____(__NR_mkdir, sys_mkdir), // 39
=20
// _____(__NR_rmdir, sys_rmdir), // 40
-// _____(__NR_dup, sys_dup), // 41
+ GENXY(__NR_dup, sys_dup), // 41
// _____(__NR_pipe, sys_pipe), // 42
// _____(__NR_times, sys_times), // 43
// _____(__NR_prof, sys_prof), // 44
@@ -1264,10 +1264,10 @@
// _____(__NR_sigpending, sys_sigpending), // 73
// _____(__NR_sethostname, sys_sethostname), // 74
=20
-// _____(__NR_setrlimit, sys_setrlimit), // 75
+ GENX_(__NR_setrlimit, sys_setrlimit), // 75
// _____(__NR_getrlimit, sys_getrlimit), // 76
// _____(__NR_getrusage, sys_getrusage), // 77
-// _____(__NR_gettimeofday, sys_gettimeofday), // 78
+ GENXY(__NR_gettimeofday, sys_gettimeofday), // 78
// _____(__NR_settimeofday, sys_settimeofday), // 79
=20
// _____(__NR_getgroups, sys_getgroups), // 80
@@ -1296,7 +1296,7 @@
=20
// _____(__NR_fstatfs, sys_fstatfs), // 100
// _____(__NR_ioperm, sys_ioperm), // 101
-// _____(__NR_socketcall, sys_socketcall), // 102
+ PLAXY(__NR_socketcall, sys_socketcall), // 102
// _____(__NR_syslog, sys_syslog), // 103
// _____(__NR_setitimer, sys_setitimer), // 104
=20
@@ -1310,7 +1310,7 @@
// _____(__NR_vhangup, sys_vhangup), // 111
// _____(__NR_idle, sys_idle), // 112
// _____(__NR_vm86, sys_vm86), // 113
-// _____(__NR_wait4, sys_wait4), // 114
+ GENXY(__NR_wait4, sys_wait4), // 114
=20
// _____(__NR_swapoff, sys_swapoff), // 115
// _____(__NR_sysinfo, sys_sysinfo), // 116
@@ -1369,12 +1369,12 @@
// _____(__NR_sched_get_priority_min, sys_sched_get_priority_min), // 1=
60
// _____(__NR_sched_rr_get_interval, sys_sched_rr_get_interval), // 1=
61
GENXY(__NR_nanosleep, sys_nanosleep), // 162
-// _____(__NR_mremap, sys_mremap), // 163
+ GENX_(__NR_mremap, sys_mremap), // 163
// _____(__NR_setresuid, sys_setresuid), // 164
=20
// _____(__NR_getresuid, sys_getresuid), // 165
// _____(__NR_query_module, sys_query_module), // 166
-// _____(__NR_poll, sys_poll), // 167
+ GENXY(__NR_poll, sys_poll), // 167
// _____(__NR_nfsservctl, sys_nfsservctl), // 168
// _____(__NR_setresgid, sys_setresgid), // 169
=20
@@ -1474,7 +1474,7 @@
// _____(__NR_clock_nanosleep, sys_clock_nanosleep), // 248
// _____(__NR_swapcontext, sys_swapcontext), // 249
=20
-// _____(__NR_tgkill, sys_tgkill), // 250
+ LINXY(__NR_tgkill, sys_tgkill), // 250
// _____(__NR_utimes, sys_utimes), // 251
// _____(__NR_statfs64, sys_statfs64), // 252
// _____(__NR_fstatfs64, sys_fstatfs64), // 253
|
|
From: <sv...@va...> - 2006-01-02 19:06:17
|
Author: sewardj Date: 2006-01-02 19:06:08 +0000 (Mon, 02 Jan 2006) New Revision: 5476 Log: Oops, fix interrupted-syscall snafu. Modified: trunk/coregrind/m_syswrap/syscall-ppc64-linux.S Modified: trunk/coregrind/m_syswrap/syscall-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_syswrap/syscall-ppc64-linux.S 2006-01-02 16:32:10 U= TC (rev 5475) +++ trunk/coregrind/m_syswrap/syscall-ppc64-linux.S 2006-01-02 19:06:08 U= TC (rev 5476) @@ -153,11 +153,11 @@ .globl ML_(blksys_complete) .globl ML_(blksys_committed) .globl ML_(blksys_finished) -ML_(blksys_setup): .long 1b -ML_(blksys_restart): .long 2b -ML_(blksys_complete): .long 3b -ML_(blksys_committed): .long 4b -ML_(blksys_finished): .long 5b +ML_(blksys_setup): .quad 1b +ML_(blksys_restart): .quad 2b +ML_(blksys_complete): .quad 3b +ML_(blksys_committed): .quad 4b +ML_(blksys_finished): .quad 5b =20 =20 /* Let the linker know we don't need an executable stack */ |
|
From: <sv...@va...> - 2006-01-02 16:32:17
|
Author: sewardj
Date: 2006-01-02 16:32:10 +0000 (Mon, 02 Jan 2006)
New Revision: 5475
Log:
Recrystallise the warp core on ppc64-linux.
Modified:
trunk/coregrind/m_syscall.c
Modified: trunk/coregrind/m_syscall.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_syscall.c 2006-01-02 16:25:31 UTC (rev 5474)
+++ trunk/coregrind/m_syscall.c 2006-01-02 16:32:10 UTC (rev 5475)
@@ -78,9 +78,10 @@
return res;
}
=20
-SysRes VG_(mk_SysRes_ppc64_linux) ( ULong val, ULong errflag ) {
+/* As per ppc32 version, cr0.so must be in l.s.b. of 2nd arg */
+SysRes VG_(mk_SysRes_ppc64_linux) ( ULong val, ULong cr0so ) {
SysRes res;
- res.isError =3D errflag !=3D 0;
+ res.isError =3D (cr0so & 1) !=3D 0;
res.val =3D val;
return res;
}
|
|
From: <sv...@va...> - 2006-01-02 16:25:35
|
Author: sewardj
Date: 2006-01-02 16:25:31 +0000 (Mon, 02 Jan 2006)
New Revision: 5474
Log:
Fun n games making sys_clone() work.
Modified:
trunk/coregrind/m_syswrap/syswrap-ppc64-linux.c
Modified: trunk/coregrind/m_syswrap/syswrap-ppc64-linux.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_syswrap/syswrap-ppc64-linux.c 2006-01-02 16:24:51 U=
TC (rev 5473)
+++ trunk/coregrind/m_syswrap/syswrap-ppc64-linux.c 2006-01-02 16:25:31 U=
TC (rev 5474)
@@ -140,6 +140,7 @@
pid_t* parent_tid in r8
void* ??? in r9
=20
+ Note: r3 contains fn ptr, not fn entry ptr -- needs toc deref
System call requires:
=20
int $__NR_clone in r0 (sc number)
@@ -183,8 +184,8 @@
" mr 31,6\n" // preserve arg
=20
// setup child stack
-" rlwinm 4,4,0,~0xf\n" // trim sp to multiple of 16 bytes
-" li 0,0\n"
+" rldicr 4,4, 0,59\n" // trim sp to multiple of 16 bytes
+" li 0,0\n" // (r4 &=3D ~0xF)
" stdu 0,-32(4)\n" // make initial stack frame
" mr 29,4\n" // preserve sp
=20
@@ -193,7 +194,7 @@
" mr 3,5\n" // syscall arg1: flags
// r4 already setup // syscall arg2: child_stack
" mr 5,8\n" // syscall arg3: parent_tid
-" mr 6,2\n" // syscall arg4: REAL THREAD tls
+" mr 6,13\n" // syscall arg4: REAL THREAD tls
" mr 7,7\n" // syscall arg5: child_tid
" mr 8,8\n" // syscall arg6: ????
" mr 9,9\n" // syscall arg7: ????
@@ -201,15 +202,15 @@
" sc\n" // clone()
=20
" mfcr 4\n" // CR now in low half r4
-" slwi 4,4,16\n"
-" slwi 4,4,16\n" // CR now in hi half r4
+" sldi 4,4,16\n"
+" sldi 4,4,16\n" // CR now in hi half r4
=20
-" slwi 3,3,16\n"
-" slwi 3,3,16\n"
-" srwi 3,3,16\n"
-" srwi 3,3,16\n" // zero out hi half r3
+" sldi 3,3,16\n"
+" sldi 3,3,16\n"
+" srdi 3,3,16\n"
+" srdi 3,3,16\n" // zero out hi half r3
=20
-" and 3,3,4\n" // r3 =3D CR : syscall-retval
+" or 3,3,4\n" // r3 =3D CR : syscall-retval
" cmpwi 3,0\n" // child if retval =3D=3D 0 (note, =
cmpw)
" bne 1f\n" // jump if !child
=20
@@ -219,6 +220,7 @@
That does leave a small window for a signal to be delivered
on the wrong stack, unfortunately. */
" mr 1,29\n"
+" ld 30, 0(30)\n" // convert fn ptr to fn entry
" mtctr 30\n" // ctr reg =3D fn
" mr 3,31\n" // r3 =3D arg
" bctrl\n" // call fn()
@@ -354,13 +356,15 @@
=20
/* Create the new thread */
word64 =3D do_syscall_clone_ppc64_linux(
- ML_(start_thread_NORETURN), stack, flags, &VG_(threads)[c=
tid],
+ ML_(start_thread_NORETURN),
+ stack, flags, &VG_(threads)[ctid],
child_tidptr, parent_tidptr, NULL
);
+
/* Low half word64 is syscall return value. Hi half is
the entire CR, from which we need to extract CR0.SO. */
/* VG_(printf)("word64 =3D 0x%llx\n", word64); */
- res =3D VG_(mk_SysRes_ppc32_linux)(=20
+ res =3D VG_(mk_SysRes_ppc64_linux)(=20
/*val*/(UInt)(word64 & 0xFFFFFFFFULL),=20
/*errflag*/ (UInt)((word64 >> (32+28)) & 1)
);
@@ -416,7 +420,7 @@
//zz DECL_TEMPLATE(ppc64_linux, sys_lstat64);
//zz DECL_TEMPLATE(ppc64_linux, sys_fstat64);
//zz DECL_TEMPLATE(ppc64_linux, sys_ipc);
-//zz DECL_TEMPLATE(ppc64_linux, sys_clone);
+DECL_TEMPLATE(ppc64_linux, sys_clone);
//zz DECL_TEMPLATE(ppc64_linux, sys_sigreturn);
//zz DECL_TEMPLATE(ppc64_linux, sys_rt_sigreturn);
//zz DECL_TEMPLATE(ppc64_linux, sys_sigaction);
@@ -912,92 +916,92 @@
//zz break; /*NOTREACHED*/
//zz }
//zz }
-//zz=20
-//zz PRE(sys_clone)
-//zz {
-//zz UInt cloneflags;
-//zz=20
-//zz PRINT("sys_clone ( %x, %p, %p, %p, %p )",ARG1,ARG2,ARG3,ARG4,ARG=
5);
-//zz PRE_REG_READ5(int, "clone",
-//zz unsigned long, flags,
-//zz void *, child_stack,
-//zz int *, parent_tidptr,
-//zz void *, child_tls,
-//zz int *, child_tidptr);
-//zz=20
-//zz if (ARG1 & VKI_CLONE_PARENT_SETTID) {
-//zz PRE_MEM_WRITE("clone(parent_tidptr)", ARG3, sizeof(Int));
-//zz if (!VG_(am_is_valid_for_client)(ARG3, sizeof(Int),=20
-//zz VKI_PROT_WRITE)) {
-//zz SET_STATUS_Failure( VKI_EFAULT );
-//zz return;
-//zz }
-//zz }
-//zz if (ARG1 & (VKI_CLONE_CHILD_SETTID | VKI_CLONE_CHILD_CLEARTID)) =
{
-//zz PRE_MEM_WRITE("clone(child_tidptr)", ARG5, sizeof(Int));
-//zz if (!VG_(am_is_valid_for_client)(ARG5, sizeof(Int),=20
-//zz VKI_PROT_WRITE)) {
-//zz SET_STATUS_Failure( VKI_EFAULT );
-//zz return;
-//zz }
-//zz }
-//zz=20
-//zz cloneflags =3D ARG1;
-//zz=20
-//zz if (!ML_(client_signal_OK)(ARG1 & VKI_CSIGNAL)) {
-//zz SET_STATUS_Failure( VKI_EINVAL );
-//zz return;
-//zz }
-//zz=20
-//zz /* Only look at the flags we really care about */
-//zz switch (cloneflags & (VKI_CLONE_VM | VKI_CLONE_FS=20
-//zz | VKI_CLONE_FILES | VKI_CLONE_VFORK)) {
-//zz case VKI_CLONE_VM | VKI_CLONE_FS | VKI_CLONE_FILES:
-//zz /* thread creation */
-//zz SET_STATUS_from_SysRes(
-//zz do_clone(tid,
-//zz ARG1, /* flags */
-//zz (Addr)ARG2, /* child SP */
-//zz (Int *)ARG3, /* parent_tidptr */
-//zz (Int *)ARG5, /* child_tidptr */
-//zz (Addr)ARG4)); /* child_tls */
-//zz break;
-//zz=20
-//zz case VKI_CLONE_VFORK | VKI_CLONE_VM: /* vfork */
-//zz /* FALLTHROUGH - assume vfork =3D=3D fork */
-//zz cloneflags &=3D ~(VKI_CLONE_VFORK | VKI_CLONE_VM);
-//zz=20
-//zz case 0: /* plain fork */
-//zz SET_STATUS_from_SysRes(
-//zz ML_(do_fork_clone)(tid,
-//zz cloneflags, /* flags */
-//zz (Int *)ARG3, /* parent_tidptr */
-//zz (Int *)ARG5)); /* child_tidptr */
-//zz break;
-//zz=20
-//zz default:
-//zz /* should we just ENOSYS? */
-//zz VG_(message)(Vg_UserMsg, "Unsupported clone() flags: 0x%x", A=
RG1);
-//zz VG_(message)(Vg_UserMsg, "");
-//zz VG_(message)(Vg_UserMsg, "The only supported clone() uses are=
:");
-//zz VG_(message)(Vg_UserMsg, " - via a threads library (LinuxThre=
ads or NPTL)");
-//zz VG_(message)(Vg_UserMsg, " - via the implementation of fork o=
r vfork");
-//zz VG_(unimplemented)
-//zz ("Valgrind does not support general clone().");
-//zz }
-//zz=20
-//zz if (SUCCESS) {
-//zz if (ARG1 & VKI_CLONE_PARENT_SETTID)
-//zz POST_MEM_WRITE(ARG3, sizeof(Int));
-//zz if (ARG1 & (VKI_CLONE_CHILD_SETTID | VKI_CLONE_CHILD_CLEARTID=
))
-//zz POST_MEM_WRITE(ARG5, sizeof(Int));
-//zz=20
-//zz /* Thread creation was successful; let the child have the cha=
nce
-//zz to run */
-//zz *flags |=3D SfYieldAfter;
-//zz }
-//zz }
-//zz=20
+
+PRE(sys_clone)
+{
+ UInt cloneflags;
+
+ PRINT("sys_clone ( %x, %p, %p, %p, %p )",ARG1,ARG2,ARG3,ARG4,ARG5);
+ PRE_REG_READ5(int, "clone",
+ unsigned long, flags,
+ void *, child_stack,
+ int *, parent_tidptr,
+ void *, child_tls,
+ int *, child_tidptr);
+
+ if (ARG1 & VKI_CLONE_PARENT_SETTID) {
+ PRE_MEM_WRITE("clone(parent_tidptr)", ARG3, sizeof(Int));
+ if (!VG_(am_is_valid_for_client)(ARG3, sizeof(Int),=20
+ VKI_PROT_WRITE)) {
+ SET_STATUS_Failure( VKI_EFAULT );
+ return;
+ }
+ }
+ if (ARG1 & (VKI_CLONE_CHILD_SETTID | VKI_CLONE_CHILD_CLEARTID)) {
+ PRE_MEM_WRITE("clone(child_tidptr)", ARG5, sizeof(Int));
+ if (!VG_(am_is_valid_for_client)(ARG5, sizeof(Int),=20
+ VKI_PROT_WRITE)) {
+ SET_STATUS_Failure( VKI_EFAULT );
+ return;
+ }
+ }
+
+ cloneflags =3D ARG1;
+
+ if (!ML_(client_signal_OK)(ARG1 & VKI_CSIGNAL)) {
+ SET_STATUS_Failure( VKI_EINVAL );
+ return;
+ }
+
+ /* Only look at the flags we really care about */
+ switch (cloneflags & (VKI_CLONE_VM | VKI_CLONE_FS=20
+ | VKI_CLONE_FILES | VKI_CLONE_VFORK)) {
+ case VKI_CLONE_VM | VKI_CLONE_FS | VKI_CLONE_FILES:
+ /* thread creation */
+ SET_STATUS_from_SysRes(
+ do_clone(tid,
+ ARG1, /* flags */
+ (Addr)ARG2, /* child SP */
+ (Int *)ARG3, /* parent_tidptr */
+ (Int *)ARG5, /* child_tidptr */
+ (Addr)ARG4)); /* child_tls */
+ break;
+
+ case VKI_CLONE_VFORK | VKI_CLONE_VM: /* vfork */
+ /* FALLTHROUGH - assume vfork =3D=3D fork */
+ cloneflags &=3D ~(VKI_CLONE_VFORK | VKI_CLONE_VM);
+
+ case 0: /* plain fork */
+ SET_STATUS_from_SysRes(
+ ML_(do_fork_clone)(tid,
+ cloneflags, /* flags */
+ (Int *)ARG3, /* parent_tidptr */
+ (Int *)ARG5)); /* child_tidptr */
+ break;
+
+ default:
+ /* should we just ENOSYS? */
+ VG_(message)(Vg_UserMsg, "Unsupported clone() flags: 0x%x", ARG1);
+ VG_(message)(Vg_UserMsg, "");
+ VG_(message)(Vg_UserMsg, "The only supported clone() uses are:");
+ VG_(message)(Vg_UserMsg, " - via a threads library (LinuxThreads o=
r NPTL)");
+ VG_(message)(Vg_UserMsg, " - via the implementation of fork or vfo=
rk");
+ VG_(unimplemented)
+ ("Valgrind does not support general clone().");
+ }
+
+ if (SUCCESS) {
+ if (ARG1 & VKI_CLONE_PARENT_SETTID)
+ POST_MEM_WRITE(ARG3, sizeof(Int));
+ if (ARG1 & (VKI_CLONE_CHILD_SETTID | VKI_CLONE_CHILD_CLEARTID))
+ POST_MEM_WRITE(ARG5, sizeof(Int));
+
+ /* Thread creation was successful; let the child have the chance
+ to run */
+ *flags |=3D SfYieldAfter;
+ }
+}
+
//zz PRE(sys_sigreturn)
//zz {
//zz ThreadState* tst;
@@ -1314,7 +1318,7 @@
// _____(__NR_fsync, sys_fsync), // 118
// _____(__NR_sigreturn, sys_sigreturn), // 119
=20
-// _____(__NR_clone, sys_clone), // 120
+ PLAX_(__NR_clone, sys_clone), // 120
// _____(__NR_setdomainname, sys_setdomainname), // 121
GENXY(__NR_uname, sys_newuname), // 122
// _____(__NR_modify_ldt, sys_modify_ldt), // 123
@@ -1398,7 +1402,7 @@
// _____(__NR_putpmsg, sys_putpmsg), // 188
// _____(__NR_vfork, sys_vfork), // 189
=20
-// _____(__NR_ugetrlimit, sys_ugetrlimit), // 190
+ GENXY(__NR_ugetrlimit, sys_getrlimit), // 190
// _____(__NR_readahead, sys_readahead), // 191
// /* #define __NR_mmap2 192 32bit only */
// /* #define __NR_truncate64 193 32bit only */
@@ -1435,7 +1439,7 @@
// _____(__NR_lremovexattr, sys_lremovexattr), // 219
=20
// _____(__NR_fremovexattr, sys_fremovexattr), // 220
-// _____(__NR_futex, sys_futex), // 221
+ LINXY(__NR_futex, sys_futex), // 221
// _____(__NR_sched_setaffinity, sys_sched_setaffinity), // 222
// _____(__NR_sched_getaffinity, sys_sched_getaffinity), // 223
// /* 224 currently unused */
@@ -1448,7 +1452,7 @@
=20
// _____(__NR_io_submit, sys_io_submit), // 230
// _____(__NR_io_cancel, sys_io_cancel), // 231
-// _____(__NR_set_tid_address, sys_set_tid_address), // 232
+ LINX_(__NR_set_tid_address, sys_set_tid_address), // 232
// _____(__NR_fadvise64, sys_fadvise64), // 233
LINX_(__NR_exit_group, sys_exit_group), // 234
=20
|
|
From: <sv...@va...> - 2006-01-02 16:24:56
|
Author: sewardj
Date: 2006-01-02 16:24:51 +0000 (Mon, 02 Jan 2006)
New Revision: 5473
Log:
Update.
Modified:
trunk/docs/internals/3_1_BUGSTATUS.txt
Modified: trunk/docs/internals/3_1_BUGSTATUS.txt
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=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/docs/internals/3_1_BUGSTATUS.txt 2006-01-02 16:24:03 UTC (rev 5=
472)
+++ trunk/docs/internals/3_1_BUGSTATUS.txt 2006-01-02 16:24:51 UTC (rev 5=
473)
@@ -8,7 +8,7 @@
=20
v5262 v5446 n-i-bz fsub 3,3,3 in ppc32 dispatcher doesn't clea=
r NaNs
v5270 v5447 n-i-bz ppc32: __NR_{set,get}priority
-pending pending 117332 missing line info with icc 8.1 (x86)
+v5470 pending 117332 missing line info with icc 8.1 (x86)
pending pending 117362 partially defined equality
pending pending 117366 amd64: 0xDD 0x7C fnstsw
pending pending 117367 amd64: 0xD9 0xF4 fxtract
@@ -34,4 +34,5 @@
(TODO: VERIFY 31BRANCH)
v5427 v5451 n-i-bz OSet 64-bit fastcmp bug
v5445 pending n-i-bz VG_(getgroups) fix (Shinichi Noda)
+vx1519 pending n-i-bz ppc32/64: allocate from callee-saved FP/VMX=
regs
vx1521/2 pending 119297 Incorrect error message for sse code
|
|
From: <sv...@va...> - 2006-01-02 16:24:07
|
Author: sewardj
Date: 2006-01-02 16:24:03 +0000 (Mon, 02 Jan 2006)
New Revision: 5472
Log:
Don't confuse ppc32 and ppc64.
Modified:
trunk/tests/cputest.c
Modified: trunk/tests/cputest.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/tests/cputest.c 2006-01-02 16:23:29 UTC (rev 5471)
+++ trunk/tests/cputest.c 2006-01-02 16:24:03 UTC (rev 5472)
@@ -17,11 +17,12 @@
char* all_archs[] =3D {
"amd64",
"ppc32",
+ "ppc64",
"x86",
NULL
};
=20
-#ifdef __powerpc__
+#if defined(__powerpc__) && !defined(__powerpc64__)
static Bool go(char* cpu)
{
if ( strcmp( cpu, "ppc32" ) =3D=3D 0 )
@@ -29,8 +30,18 @@
else=20
return False;
}
-#endif // __powerpc__
+#endif // __powerpc__ (32)
=20
+#if defined(__powerpc__) && defined(__powerpc64__)
+static Bool go(char* cpu)
+{
+ if ( strcmp( cpu, "ppc64" ) =3D=3D 0 )
+ return True;
+ else=20
+ return False;
+}
+#endif // __powerpc__ (64)
+
#if defined(__i386__) || defined(__x86_64__)
static void cpuid ( unsigned int n,
unsigned int* a, unsigned int* b,
|
|
From: <sv...@va...> - 2006-01-02 16:23:36
|
Author: sewardj
Date: 2006-01-02 16:23:29 +0000 (Mon, 02 Jan 2006)
New Revision: 5471
Log:
More paranoia please.
Modified:
trunk/coregrind/m_scheduler/sema.c
Modified: trunk/coregrind/m_scheduler/sema.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/sema.c 2006-01-01 23:00:49 UTC (rev 5470)
+++ trunk/coregrind/m_scheduler/sema.c 2006-01-02 16:23:29 UTC (rev 5471)
@@ -41,6 +41,7 @@
=20
void ML_(sema_init)(vg_sema_t *sema)
{
+ Int res;
VG_(pipe)(sema->pipe);
sema->pipe[0] =3D VG_(safe_fd)(sema->pipe[0]);
sema->pipe[1] =3D VG_(safe_fd)(sema->pipe[1]);
@@ -48,7 +49,8 @@
sema->owner_thread =3D -1;
=20
/* create initial token */
- VG_(write)(sema->pipe[1], "T", 1);
+ res =3D VG_(write)(sema->pipe[1], "T", 1);
+ vg_assert(res =3D=3D 1);
}
=20
void ML_(sema_deinit)(vg_sema_t *sema)
@@ -89,7 +91,6 @@
sema->owner_thread =3D 0;
=20
ret =3D VG_(write)(sema->pipe[1], "T", 1);
-
vg_assert(ret =3D=3D 1);
}
=20
|
|
From: <sv...@va...> - 2006-01-02 15:15:48
|
Author: cerion
Date: 2006-01-02 15:15:45 +0000 (Mon, 02 Jan 2006)
New Revision: 1528
Log:
ppc64 altivec:
- frontend: fix stvehx, stvewx
- backend: fix Iop_32HLto64 (mask off hi32 bits of src regs)
Modified:
trunk/priv/guest-ppc/toIR.c
trunk/priv/host-ppc/isel.c
Modified: trunk/priv/guest-ppc/toIR.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/priv/guest-ppc/toIR.c 2006-01-02 14:41:50 UTC (rev 1527)
+++ trunk/priv/guest-ppc/toIR.c 2006-01-02 15:15:45 UTC (rev 1528)
@@ -6475,7 +6475,7 @@
=20
IRType ty =3D mode64 ? Ity_I64 : Ity_I32;
IRTemp EA =3D newTemp(ty);
- IRTemp addr_aligned =3D newTemp(Ity_I32);
+ IRTemp addr_aligned =3D newTemp(ty);
IRTemp vS =3D newTemp(Ity_V128);
IRTemp eb =3D newTemp(Ity_I8);
IRTemp idx =3D newTemp(Ity_I8);
@@ -6504,10 +6504,9 @@
}
case 0x0A7: { // stvehx (Store Vector Half Word Indexed, AV p132)
DIP("stvehx v%d,r%u,r%u\n", vS_addr, rA_addr, rB_addr);
- assign( addr_aligned,
- mkSzNarrow32(ty, addr_align(mkexpr(EA), 2)) );
+ assign( addr_aligned, addr_align(mkexpr(EA), 2) );
assign( eb, binop(Iop_And8, mkU8(0xF),
- unop(Iop_32to8, mkexpr(addr_aligned) )) );
+ mkSzNarrow8(ty, mkexpr(addr_aligned) )) );
assign( idx, binop(Iop_Shl8,
binop(Iop_Sub8, mkU8(14), mkexpr(eb)),
mkU8(3)) );
@@ -6518,10 +6517,9 @@
}
case 0x0C7: { // stvewx (Store Vector Word Indexed, AV p133)
DIP("stvewx v%d,r%u,r%u\n", vS_addr, rA_addr, rB_addr);
- assign( addr_aligned,
- mkSzNarrow32(ty, addr_align(mkexpr(EA), 4)) );
+ assign( addr_aligned, addr_align(mkexpr(EA), 4) );
assign( eb, binop(Iop_And8, mkU8(0xF),
- unop(Iop_32to8, mkexpr(addr_aligned) )) );
+ mkSzNarrow8(ty, mkexpr(addr_aligned) )) );
assign( idx, binop(Iop_Shl8,
binop(Iop_Sub8, mkU8(12), mkexpr(eb)),
mkU8(3)) );
Modified: trunk/priv/host-ppc/isel.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/priv/host-ppc/isel.c 2006-01-02 14:41:50 UTC (rev 1527)
+++ trunk/priv/host-ppc/isel.c 2006-01-02 15:15:45 UTC (rev 1528)
@@ -1252,13 +1252,17 @@
//zz }
=20
if (e->Iex.Binop.op =3D=3D Iop_32HLto64) {
- HReg r_dst =3D newVRegI(env);
HReg r_Hi =3D iselIntExpr_R(env, e->Iex.Binop.arg1);
HReg r_Lo =3D iselIntExpr_R(env, e->Iex.Binop.arg2);
+ HReg r_dst =3D newVRegI(env);
+ HReg msk =3D newVRegI(env);
vassert(mode64);
/* r_dst =3D OR( r_Hi<<32, r_Lo ) */
addInstr(env, PPCInstr_Shft(Pshft_SHL, False/*64bit shift*/,
r_dst, r_Hi, PPCRH_Imm(False,32)));
+ addInstr(env, PPCInstr_LI(msk, 0xFFFFFFFF, mode64));
+ addInstr(env, PPCInstr_Alu( Palu_AND, r_Lo, r_Lo,
+ PPCRH_Reg(msk) ));
addInstr(env, PPCInstr_Alu( Palu_OR, r_dst, r_dst,
PPCRH_Reg(r_Lo) ));
return r_dst;
|