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
(6) |
|
2
(4) |
3
(9) |
4
(11) |
5
(16) |
6
(6) |
7
(1) |
8
(11) |
|
9
(11) |
10
(6) |
11
(10) |
12
(23) |
13
(23) |
14
(6) |
15
(10) |
|
16
(5) |
17
(13) |
18
(9) |
19
(4) |
20
(6) |
21
(16) |
22
(3) |
|
23
(5) |
24
(7) |
25
(6) |
26
(4) |
27
(8) |
28
|
29
(3) |
|
30
(2) |
31
(17) |
|
|
|
|
|
|
From: <sv...@va...> - 2015-08-20 22:45:48
|
Author: florian
Date: Thu Aug 20 23:45:41 2015
New Revision: 15574
Log:
When scanning the statement list for bogus literals we
can stop once the first such literal was found. No need
to scan further.
Modified:
trunk/memcheck/mc_translate.c
Modified: trunk/memcheck/mc_translate.c
==============================================================================
--- trunk/memcheck/mc_translate.c (original)
+++ trunk/memcheck/mc_translate.c Thu Aug 20 23:45:41 2015
@@ -6252,7 +6252,6 @@
IRType gWordTy, IRType hWordTy )
{
Bool verboze = 0||False;
- Bool bogus;
Int i, j, first_stmt;
IRStmt* st;
MCEnv mce;
@@ -6319,11 +6318,9 @@
extra-detailed (hence extra-expensive) instrumentation in
places. Scan the whole bb even if dodgyness is found earlier,
so that the flatness assertion is applied to all stmts. */
-
- bogus = False;
+ Bool bogus = False;
for (i = 0; i < sb_in->stmts_used; i++) {
-
st = sb_in->stmts[i];
tl_assert(st);
tl_assert(isFlatIRStmt(st));
@@ -6335,10 +6332,9 @@
ppIRStmt(st);
VG_(printf)("\n");
}
+ if (bogus) break;
}
-
}
-
mce.bogusLiterals = bogus;
/* Copy verbatim any IR preamble preceding the first IMark */
|
|
From: <sv...@va...> - 2015-08-20 21:41:35
|
Author: florian
Date: Thu Aug 20 22:41:28 2015
New Revision: 15573
Log:
Fix incorrect header guard. Reported by gia...@gm...
Fixes BZ #351531
Modified:
trunk/NEWS
trunk/include/vki/vki-xen-physdev.h
Modified: trunk/NEWS
==============================================================================
--- trunk/NEWS (original)
+++ trunk/NEWS Thu Aug 20 22:41:28 2015
@@ -308,6 +308,7 @@
351140 arm64 syscalls setuid (146) and setresgid (149) not implemented
351386 Cannot run ld.so.1 under Valgrind
351474 Fix VG_(iseqsigset) as obvious
+351534 Fix incorrect header guard
n-i-bz Provide implementations of certain compiler builtins to support
compilers who may not provide those
n-i-bz Old STABS code is still being compiled, but never used. Remove it.
Modified: trunk/include/vki/vki-xen-physdev.h
==============================================================================
--- trunk/include/vki/vki-xen-physdev.h (original)
+++ trunk/include/vki/vki-xen-physdev.h Thu Aug 20 22:41:28 2015
@@ -1,4 +1,4 @@
-#ifndef __VKI_XEN_PHYSDEV__H
+#ifndef __VKI_XEN_PHYSDEV_H
#define __VKI_XEN_PHYSDEV_H
#define VKI_XEN_MAP_PIRQ_TYPE_MSI 0x0
|
|
From: <sv...@va...> - 2015-08-20 20:25:28
|
Author: iraisr
Date: Thu Aug 20 21:25:19 2015
New Revision: 15572
Log:
Initial data (brk) segment is setup on demand, when a first brk() syscall
is made. It cannot be established during client image initialization because
that would conflict with a temporary stack which ld.so.1 (when executed directly)
uses for loading the target dynamic executable.
See PRE(sys_brk) in syswrap-solaris.c.
Preparatory work for ldsoexec support.
n-i-bz
Modified:
trunk/coregrind/m_initimg/initimg-solaris.c
trunk/coregrind/m_syswrap/syswrap-solaris.c
Modified: trunk/coregrind/m_initimg/initimg-solaris.c
==============================================================================
--- trunk/coregrind/m_initimg/initimg-solaris.c (original)
+++ trunk/coregrind/m_initimg/initimg-solaris.c Thu Aug 20 21:25:19 2015
@@ -747,63 +747,6 @@
return client_SP;
}
-
-/* Allocate the client data segment. It is an expandable anonymous mapping
- abutting a 1-page reservation. The data segment starts at VG_(brk_base)
- and runs up to VG_(brk_limit). None of these two values have to be
- page-aligned.
- Reservation segment is used to protect the data segment merging with
- a pre-existing segment. This should be no problem because address space
- manager ensures that requests for client address space are satisfied from
- the highest available addresses. However when memory is low, data segment
- can meet with mmap'ed objects and the reservation segment separates these.
- The page that contains VG_(brk_base) is already allocated by the program's
- loaded data segment. The brk syscall wrapper handles this special case.
- See the brk syscall wrapper for more information. */
-static void setup_client_dataseg(SizeT initial_size)
-{
- Bool ok;
- SysRes sres;
- Addr anon_start = VG_PGROUNDUP(VG_(brk_base));
- SizeT anon_size = VG_PGROUNDUP(initial_size);
- Addr resvn_start = anon_start + anon_size;
- SizeT resvn_size = VKI_PAGE_SIZE;
- const NSegment *seg;
- UInt prot;
-
- vg_assert(VG_IS_PAGE_ALIGNED(anon_size));
- vg_assert(VG_IS_PAGE_ALIGNED(resvn_size));
- vg_assert(VG_IS_PAGE_ALIGNED(anon_start));
- vg_assert(VG_IS_PAGE_ALIGNED(resvn_start));
-
- /* Stay sane (because there's been no brk activity yet). */
- vg_assert(VG_(brk_base) == VG_(brk_limit));
-
- /* Find the loaded data segment and remember its protection. */
- seg = VG_(am_find_nsegment)(VG_(brk_base) - 1);
- vg_assert(seg);
- prot = (seg->hasR ? VKI_PROT_READ : 0)
- | (seg->hasW ? VKI_PROT_WRITE : 0)
- | (seg->hasX ? VKI_PROT_EXEC : 0);
-
- /* Try to create the data segment and associated reservation where
- VG_(brk_base) says. */
- ok = VG_(am_create_reservation)(resvn_start, resvn_size, SmLower, anon_size);
- if (!ok) {
- /* That didn't work, we're hosed. */
- VG_(printf)("valgrind: cannot initialize a brk segment\n");
- VG_(exit)(1);
- /*NOTREACHED*/
- }
- vg_assert(ok);
-
- /* Map the data segment. */
- sres = VG_(am_mmap_anon_fixed_client)(anon_start, anon_size, prot);
- vg_assert(!sr_isError(sres));
- vg_assert(sr_Res(sres) == anon_start);
-}
-
-
/*====================================================================*/
/*=== TOP-LEVEL: VG_(setup_client_initial_image) ===*/
/*====================================================================*/
@@ -898,26 +841,10 @@
iifii.clstack_max_size);
}
- //--------------------------------------------------------------
- // Setup client data (brk) segment. Initially segment at least
- // 1 MB and at most 8 MB large which abuts a 1-page reservation.
- // p: load_client() [for 'info' and hence VG_(brk_base)]
- //--------------------------------------------------------------
- {
- SizeT m1 = 1024 * 1024;
- SizeT m8 = 8 * m1;
- SizeT dseg_max_size = VG_(client_rlimit_data).rlim_cur;
- VG_(debugLog)(1, "initimg", "Setup client data (brk) segment at %#lx\n",
- VG_(brk_base));
- if (dseg_max_size < m1)
- dseg_max_size = m1;
- if (dseg_max_size > m8)
- dseg_max_size = m8;
- dseg_max_size = VG_PGROUNDUP(dseg_max_size);
-
- setup_client_dataseg(dseg_max_size);
- }
-
+ /* Initial data (brk) segment is setup on demand, when a first brk() syscall
+ is made. It cannot be established now because it would conflict with
+ a temporary stack which ld.so.1 (when executed directly) uses for loading
+ the target dynamic executable. See PRE(sys_brk) in syswrap-solaris.c. */
return iifii;
}
@@ -934,7 +861,6 @@
void VG_(ii_finalise_image)(IIFinaliseImageInfo iifii)
{
ThreadArchState *arch = &VG_(threads)[1].arch;
- const NSegment *seg;
# if defined(VGA_x86)
vg_assert(0 == sizeof(VexGuestX86State) % LibVEX_GUEST_STATE_ALIGN);
@@ -990,14 +916,16 @@
VG_TRACK(post_reg_write, Vg_CoreStartup, 1/*tid*/, 0/*offset*/,
sizeof(VexGuestArchState));
- /* Tell the tool about the client data segment and then kill it which will
- make it inaccessible/unaddressable. */
- seg = VG_(am_find_nsegment)(VG_PGROUNDUP(VG_(brk_base)));
- vg_assert(seg);
- vg_assert(seg->kind == SkAnonC);
- VG_TRACK(new_mem_brk, VG_(brk_base), seg->end + 1 - VG_(brk_base),
- 1/*tid*/);
- VG_TRACK(die_mem_brk, VG_(brk_base), seg->end + 1 - VG_(brk_base));
+ /* Make inaccessible/unaddressable the end of the client data segment.
+ See PRE(sys_brk) in syswrap-solaris.c for details. Nothing to do in
+ case VG_(brk_base) starts on the beginning of a free page. */
+ const NSegment *seg = VG_(am_find_nsegment)(VG_(brk_base));
+ if (seg != NULL) {
+ vg_assert((seg->kind == SkFileC) || (seg->kind == SkAnonC));
+ VG_TRACK(new_mem_brk, VG_(brk_base), seg->end + 1 - VG_(brk_base),
+ 1 /* tid */);
+ VG_TRACK(die_mem_brk, VG_(brk_base), seg->end + 1 - VG_(brk_base));
+ }
}
#endif // defined(VGO_solaris)
Modified: trunk/coregrind/m_syswrap/syswrap-solaris.c
==============================================================================
--- trunk/coregrind/m_syswrap/syswrap-solaris.c (original)
+++ trunk/coregrind/m_syswrap/syswrap-solaris.c Thu Aug 20 21:25:19 2015
@@ -1803,15 +1803,18 @@
PRE_REG_READ0(long, "time");
}
-/* Data segment for brk (heap).
- Initial data segment is established during image initialization
- (initimg-solaris.c). Notable facts:
+/* Data segment for brk (heap). It is an expandable anonymous mapping
+ abutting a 1-page reservation. The data segment starts at VG_(brk_base)
+ and runs up to VG_(brk_limit). None of these two values have to be
+ page-aligned. Initial data segment is established on demand here (see
+ initimg-solaris.c for rationale).
+ Notable facts:
- VG_(brk_base) is not page aligned; does not move
- VG_(brk_limit) moves between [VG_(brk_base), data segment end]
- data segment end is always page aligned
- right after data segment end is 1-page reservation
- | heap |
+ | heap | 1 page
+------+------+--------------+-------+
| BSS | anon | anon | resvn |
+------+------+--------------+-------+
@@ -1824,9 +1827,63 @@
VG_(brk_base) -- not page aligned -- does not move
Because VG_(brk_base) is not page-aligned and is initially located within
- pre-established data segment, special care has to be taken in the code below
- to handle this feature.
-*/
+ pre-established BSS (data) segment, special care has to be taken in the code
+ below to handle this feature.
+
+ Reservation segment is used to protect the data segment merging with
+ a pre-existing segment. This should be no problem because address space
+ manager ensures that requests for client address space are satisfied from
+ the highest available addresses. However when memory is low, data segment
+ can meet with mmap'ed objects and the reservation segment separates these.
+ The page that contains VG_(brk_base) is already allocated by the program's
+ loaded data segment. The brk syscall wrapper handles this special case. */
+
+/* Establishes initial data segment for brk (heap). */
+static Bool setup_client_dataseg(SizeT initial_size, ThreadId tid)
+{
+ Addr anon_start = VG_PGROUNDUP(VG_(brk_base));
+ SizeT anon_size = VG_PGROUNDUP(initial_size);
+ Addr resvn_start = anon_start + anon_size;
+ SizeT resvn_size = VKI_PAGE_SIZE;
+
+ vg_assert(VG_IS_PAGE_ALIGNED(anon_size));
+ vg_assert(VG_IS_PAGE_ALIGNED(resvn_size));
+ vg_assert(VG_IS_PAGE_ALIGNED(anon_start));
+ vg_assert(VG_IS_PAGE_ALIGNED(resvn_start));
+ vg_assert(VG_(brk_base) == VG_(brk_limit));
+
+ /* Find the loaded data segment and remember its protection. */
+ const NSegment *seg = VG_(am_find_nsegment)(VG_(brk_base) - 1);
+ vg_assert(seg != NULL);
+ UInt prot = (seg->hasR ? VKI_PROT_READ : 0)
+ | (seg->hasW ? VKI_PROT_WRITE : 0)
+ | (seg->hasX ? VKI_PROT_EXEC : 0);
+
+ /* Try to create the data segment and associated reservation where
+ VG_(brk_base) says. */
+ Bool ok = VG_(am_create_reservation)(resvn_start, resvn_size, SmLower,
+ anon_size);
+ if (!ok) {
+ /* That didn't work, we're hosed. */
+ return False;
+ }
+
+ /* Map the data segment. */
+ SysRes sres = VG_(am_mmap_anon_fixed_client)(anon_start, anon_size, prot);
+ vg_assert(!sr_isError(sres));
+ vg_assert(sr_Res(sres) == anon_start);
+
+ /* Tell the tool about the client data segment and then kill it which will
+ make it initially inaccessible/unaddressable. */
+ seg = VG_(am_find_nsegment)(anon_start);
+ vg_assert(seg != NULL);
+ vg_assert(seg->kind == SkAnonC);
+ VG_TRACK(new_mem_brk, VG_(brk_base), seg->end + 1 - VG_(brk_base), tid);
+ VG_TRACK(die_mem_brk, VG_(brk_base), seg->end + 1 - VG_(brk_base));
+ return True;
+}
+
+static Bool brk_segment_established = False;
PRE(sys_brk)
{
@@ -1845,7 +1902,7 @@
PRINT("sys_brk ( %#lx )", ARG1);
PRE_REG_READ1(unsigned long, "brk", vki_caddr_t, end_data_segment);
- if (!new_brk) {
+ if (new_brk == 0) {
/* brk(0) - specific to Solaris 11 only. */
SET_STATUS_Success(old_brk_limit);
return;
@@ -1866,6 +1923,33 @@
return;
}
+ if (!brk_segment_established) {
+ /* Stay sane (because there should have been no brk activity yet). */
+ vg_assert(VG_(brk_base) == VG_(brk_limit));
+
+ /* Establish an initial data segment for brk (heap).
+ Initially at least 1 MB and at most 8 MB large. */
+ SizeT m1 = 1024 * 1024;
+ SizeT m8 = 8 * m1;
+ SizeT dseg_max_size = VG_(client_rlimit_data).rlim_cur;
+ VG_(debugLog)(1, "syswrap-solaris", "Setup client data (brk) segment "
+ "at %#lx\n", VG_(brk_base));
+ if (dseg_max_size < m1)
+ dseg_max_size = m1;
+ if (dseg_max_size > m8)
+ dseg_max_size = m8;
+ dseg_max_size = VG_PGROUNDUP(dseg_max_size);
+
+ if (!setup_client_dataseg(dseg_max_size, tid)) {
+ VG_(umsg)("Cannot map memory to initialize brk segment in thread #%d "
+ "at %#lx\n", tid, VG_(brk_base));
+ SET_STATUS_Failure(VKI_ENOMEM);
+ return;
+ }
+
+ brk_segment_established = True;
+ }
+
if (new_brk < old_brk_limit) {
/* Shrinking the data segment. Be lazy and don't munmap the excess
area. */
|
|
From: <sv...@va...> - 2015-08-20 16:53:28
|
Author: sewardj
Date: Thu Aug 20 17:53:18 2015
New Revision: 3180
Log:
Reading from TPIDRURO_EL0 and PMUSERENR_EL0: make these properly
conditional in Thumb mode. They never were before, which strikes
me as incorrect.
Modified:
trunk/priv/guest_arm_toIR.c
Modified: trunk/priv/guest_arm_toIR.c
==============================================================================
--- trunk/priv/guest_arm_toIR.c (original)
+++ trunk/priv/guest_arm_toIR.c Thu Aug 20 17:53:18 2015
@@ -21624,10 +21624,9 @@
have to support it since arm-linux uses TPIDRURO as a thread
state register. */
if ((INSN0(15,0) == 0xEE1D) && (INSN1(11,0) == 0x0F70)) {
- /* FIXME: should this be unconditional? */
UInt rD = INSN1(15,12);
if (!isBadRegT(rD)) {
- putIRegT(rD, IRExpr_Get(OFFB_TPIDRURO, Ity_I32), IRTemp_INVALID);
+ putIRegT(rD, IRExpr_Get(OFFB_TPIDRURO, Ity_I32), condT);
DIP("mrc p15,0, r%u, c13, c0, 3\n", rD);
goto decode_success;
}
@@ -21640,10 +21639,9 @@
See comment on the ARM equivalent of this (above) for details.
*/
if ((INSN0(15,0) == 0xEE19) && (INSN1(11,0) == 0x0F1E)) {
- /* FIXME: should this be unconditional? */
UInt rD = INSN1(15,12);
if (!isBadRegT(rD)) {
- putIRegT(rD, mkU32(0), IRTemp_INVALID);
+ putIRegT(rD, mkU32(0), condT);
DIP("mrc p15,0, r%u, c9, c14, 0\n", rD);
goto decode_success;
}
|
|
From: <sv...@va...> - 2015-08-20 16:17:18
|
Author: sewardj
Date: Thu Aug 20 17:17:11 2015
New Revision: 3179
Log:
Implement reading from PMUSERENR_EL0, making it return zero.
Fixes (for some definition of "fix") #345984.
Modified:
trunk/priv/guest_arm_toIR.c
Modified: trunk/priv/guest_arm_toIR.c
==============================================================================
--- trunk/priv/guest_arm_toIR.c (original)
+++ trunk/priv/guest_arm_toIR.c Thu Aug 20 17:17:11 2015
@@ -17218,7 +17218,7 @@
/* ----------------------------------------------------------- */
/* -------------- read CP15 TPIDRURO register ------------- */
- /* mrc p15, 0, r0, c13, c0, 3 up to
+ /* mrc p15, 0, r0, c13, c0, 3 up to
mrc p15, 0, r14, c13, c0, 3
*/
/* I don't know whether this is really v7-only. But anyway, we
@@ -17236,6 +17236,25 @@
/* fall through */
}
+ /* -------------- read CP15 PMUSRENR register ------------- */
+ /* mrc p15, 0, r0, c9, c14, 0 up to
+ mrc p15, 0, r14, c9, c14, 0
+ */
+ /* A program reading this register is really asking "which
+ performance monitoring registes are available in user space?
+ The simple answer here is to return zero, meaning "none". See
+ #345984. */
+ if (0x0E190F1E == (insn & 0x0FFF0FFF)) {
+ UInt rD = INSN(15,12);
+ if (rD <= 14) {
+ /* skip r15, that's too stupid to handle */
+ putIRegA(rD, mkU32(0), condT, Ijk_Boring);
+ DIP("mrc%s p15,0, r%u, c9, c14, 0\n", nCC(INSN_COND), rD);
+ goto decode_success;
+ }
+ /* fall through */
+ }
+
/* Handle various kinds of barriers. This is rather indiscriminate
in the sense that they are all turned into an IR Fence, which
means we don't know which they are, so the back end has to
@@ -21615,6 +21634,22 @@
/* fall through */
}
+ /* -------------- read CP15 PMUSRENR register ------------- */
+ /* mrc p15, 0, r0, c9, c14, 0 up to
+ mrc p15, 0, r14, c9, c14, 0
+ See comment on the ARM equivalent of this (above) for details.
+ */
+ if ((INSN0(15,0) == 0xEE19) && (INSN1(11,0) == 0x0F1E)) {
+ /* FIXME: should this be unconditional? */
+ UInt rD = INSN1(15,12);
+ if (!isBadRegT(rD)) {
+ putIRegT(rD, mkU32(0), IRTemp_INVALID);
+ DIP("mrc p15,0, r%u, c9, c14, 0\n", rD);
+ goto decode_success;
+ }
+ /* fall through */
+ }
+
/* ------------------- CLREX ------------------ */
if (INSN0(15,0) == 0xF3BF && INSN1(15,0) == 0x8F2F) {
/* AFAICS, this simply cancels a (all?) reservations made by a
|
|
From: <sv...@va...> - 2015-08-20 05:50:57
|
Author: iraisr
Date: Thu Aug 20 06:50:49 2015
New Revision: 15571
Log:
Follow-up fix for r15565.
Expected output of some helgrind tests slightly differed on Solaris.
n-i-bz
Modified:
trunk/helgrind/tests/tc12_rwl_trivial.stderr.exp-solaris
trunk/helgrind/tests/tc20_verifywrap.stderr.exp-solaris
Modified: trunk/helgrind/tests/tc12_rwl_trivial.stderr.exp-solaris
==============================================================================
--- trunk/helgrind/tests/tc12_rwl_trivial.stderr.exp-solaris (original)
+++ trunk/helgrind/tests/tc12_rwl_trivial.stderr.exp-solaris Thu Aug 20 06:50:49 2015
@@ -24,6 +24,7 @@
with error code 1 (EPERM: Operation not permitted)
at 0x........: pthread_rwlock_unlock_WRK (hg_intercepts.c:...)
by 0x........: pthread_rwlock_unlock (hg_intercepts.c:...)
+ ...
by 0x........: main (tc12_rwl_trivial.c:29)
Modified: trunk/helgrind/tests/tc20_verifywrap.stderr.exp-solaris
==============================================================================
--- trunk/helgrind/tests/tc20_verifywrap.stderr.exp-solaris (original)
+++ trunk/helgrind/tests/tc20_verifywrap.stderr.exp-solaris Thu Aug 20 06:50:49 2015
@@ -171,6 +171,7 @@
with error code 1 (EPERM: Operation not permitted)
at 0x........: pthread_rwlock_unlock_WRK (hg_intercepts.c:...)
by 0x........: pthread_rwlock_unlock (hg_intercepts.c:...)
+ ...
by 0x........: main (tc20_verifywrap.c:189)
(1) no error on next line
@@ -197,6 +198,7 @@
with error code 1 (EPERM: Operation not permitted)
at 0x........: pthread_rwlock_unlock_WRK (hg_intercepts.c:...)
by 0x........: pthread_rwlock_unlock (hg_intercepts.c:...)
+ ...
by 0x........: main (tc20_verifywrap.c:206)
(4) no error on next line
@@ -225,6 +227,7 @@
with error code 1 (EPERM: Operation not permitted)
at 0x........: pthread_rwlock_unlock_WRK (hg_intercepts.c:...)
by 0x........: pthread_rwlock_unlock (hg_intercepts.c:...)
+ ...
by 0x........: main (tc20_verifywrap.c:227)
|