0d7b254902
The bp-permanent test case assumes that a NOP is exactly as long as a software breakpoint. This is not the case for the S390 "nop" instruction, which is 4 bytes long, while a software breakpoint is just 2 bytes long. The "nopr" instruction has the right size and can be used instead. Without this patch the test case fails on S390 when trying to continue after SIGTRAP on the permanent breakpoint: ... Continuing. Program received signal SIGILL, Illegal instruction. test () at /home/arnez/src/binutils-gdb/gdb/testsuite/gdb.base/bp-permanent.c:40 40 NOP; /* after permanent bp */ (gdb) FAIL: gdb.base/bp-permanent.exp: always_inserted=off, sw_watchpoint=0: basics: stop at permanent breakpoint With this patch the test case succeeds without any FAILs. gdb/testsuite/ChangeLog: * gdb.base/bp-permanent.c (NOP): Define as 2-byte instead of 4-byte instruction on S390.
136 lines
2.3 KiB
C
136 lines
2.3 KiB
C
/* Copyright (C) 2014 Free Software Foundation, Inc.
|
|
|
|
This file is part of GDB.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
|
|
#include <string.h>
|
|
#ifdef SIGNALS
|
|
#include <signal.h>
|
|
#include <unistd.h>
|
|
#endif
|
|
|
|
/* NOP instruction: must have the same size as the breakpoint
|
|
instruction. */
|
|
|
|
#if defined(__s390__) || defined(__s390x__)
|
|
#define NOP asm("nopr 0")
|
|
#else
|
|
#define NOP asm("nop")
|
|
#endif
|
|
|
|
/* Buffer holding the breakpoint instruction. */
|
|
unsigned char buffer[16];
|
|
|
|
volatile unsigned char *addr_bp;
|
|
volatile unsigned char *addr_after_bp;
|
|
int counter = 0;
|
|
|
|
void
|
|
test (void)
|
|
{
|
|
NOP;
|
|
NOP;
|
|
NOP;
|
|
NOP; /* write permanent bp here */
|
|
NOP; /* after permanent bp */
|
|
NOP;
|
|
NOP;
|
|
NOP;
|
|
NOP;
|
|
NOP;
|
|
|
|
counter++;
|
|
}
|
|
|
|
void
|
|
setup (void)
|
|
{
|
|
memcpy (buffer, (void *) addr_bp, addr_after_bp - addr_bp);
|
|
}
|
|
|
|
void
|
|
test_basics (void)
|
|
{
|
|
test (); /* for SIGTRAP */
|
|
test (); /* for breakpoint once */
|
|
test (); /* for breakpoint twice */
|
|
test (); /* for disabled bp SIGTRAP */
|
|
test (); /* for breakpoint thrice */
|
|
}
|
|
|
|
void
|
|
test_next (void)
|
|
{
|
|
test (); /* for next */
|
|
counter = 0; /* after next */
|
|
}
|
|
|
|
#ifdef SIGNALS
|
|
|
|
static void
|
|
test_signal_handler (int sig)
|
|
{
|
|
}
|
|
|
|
void
|
|
test_signal_with_handler (void)
|
|
{
|
|
signal (SIGUSR1, test_signal_handler);
|
|
test ();
|
|
}
|
|
|
|
void
|
|
test_signal_no_handler (void)
|
|
{
|
|
signal (SIGUSR1, SIG_IGN);
|
|
test ();
|
|
}
|
|
|
|
static void
|
|
test_signal_nested_handler ()
|
|
{
|
|
test ();
|
|
}
|
|
|
|
void
|
|
test_signal_nested_done (void)
|
|
{
|
|
}
|
|
|
|
void
|
|
test_signal_nested (void)
|
|
{
|
|
counter = 0;
|
|
signal (SIGALRM, test_signal_nested_handler);
|
|
alarm (1);
|
|
test ();
|
|
test_signal_nested_done ();
|
|
}
|
|
|
|
#endif
|
|
|
|
int
|
|
main (void)
|
|
{
|
|
setup ();
|
|
test_basics ();
|
|
test_next ();
|
|
#ifdef SIGNALS
|
|
test_signal_nested ();
|
|
test_signal_with_handler ();
|
|
test_signal_no_handler ();
|
|
#endif
|
|
return 0;
|
|
}
|