Commit 9a461028 by Ben Elliston Committed by Ben Elliston

linux-unwind.h (get_regs): Remove type puns.

	* config/rs6000/linux-unwind.h (get_regs): Remove type
	puns. Change the type of `pc' to an array of unsigned ints and
	update all users.  Constify frame24.

From-SVN: r146615
parent 653e2568
2009-04-23 Ben Elliston <bje@au.ibm.com>
* config/rs6000/linux-unwind.h (get_regs): Remove type
puns. Change the type of `pc' to an array of unsigned ints and
update all users. Constify frame24.
2009-04-22 DJ Delorie <dj@redhat.com> 2009-04-22 DJ Delorie <dj@redhat.com>
* config/m32c/m32c.c (m32c_special_page_vector_p): Move * config/m32c/m32c.c (m32c_special_page_vector_p): Move
......
...@@ -91,14 +91,13 @@ enum { SIGNAL_FRAMESIZE = 128 }; ...@@ -91,14 +91,13 @@ enum { SIGNAL_FRAMESIZE = 128 };
static struct gcc_regs * static struct gcc_regs *
get_regs (struct _Unwind_Context *context) get_regs (struct _Unwind_Context *context)
{ {
const unsigned char *pc = context->ra; const unsigned int *pc = context->ra;
/* addi r1, r1, 128; li r0, 0x0077; sc (sigreturn) */ /* addi r1, r1, 128; li r0, 0x0077; sc (sigreturn) */
/* addi r1, r1, 128; li r0, 0x00AC; sc (rt_sigreturn) */ /* addi r1, r1, 128; li r0, 0x00AC; sc (rt_sigreturn) */
if (*(unsigned int *) (pc + 0) != 0x38210000 + SIGNAL_FRAMESIZE if (pc[0] != 0x38210000 + SIGNAL_FRAMESIZE || pc[2] != 0x44000002)
|| *(unsigned int *) (pc + 8) != 0x44000002)
return NULL; return NULL;
if (*(unsigned int *) (pc + 4) == 0x38000077) if (pc[1] == 0x38000077)
{ {
struct sigframe { struct sigframe {
char gap[SIGNAL_FRAMESIZE]; char gap[SIGNAL_FRAMESIZE];
...@@ -107,17 +106,17 @@ get_regs (struct _Unwind_Context *context) ...@@ -107,17 +106,17 @@ get_regs (struct _Unwind_Context *context)
} *frame = (struct sigframe *) context->cfa; } *frame = (struct sigframe *) context->cfa;
return frame->regs; return frame->regs;
} }
else if (*(unsigned int *) (pc + 4) == 0x380000AC) else if (pc[1] == 0x380000AC)
{ {
/* This works for 2.4 kernels, but not for 2.6 kernels with vdso /* This works for 2.4 kernels, but not for 2.6 kernels with vdso
because pc isn't pointing into the stack. Can be removed when because pc isn't pointing into the stack. Can be removed when
no one is running 2.4.19 or 2.4.20, the first two ppc64 no one is running 2.4.19 or 2.4.20, the first two ppc64
kernels released. */ kernels released. */
struct rt_sigframe_24 { const struct rt_sigframe_24 {
int tramp[6]; int tramp[6];
void *pinfo; void *pinfo;
struct gcc_ucontext *puc; struct gcc_ucontext *puc;
} *frame24 = (struct rt_sigframe_24 *) pc; } *frame24 = (const struct rt_sigframe_24 *) context->ra;
/* Test for magic value in *puc of vdso. */ /* Test for magic value in *puc of vdso. */
if ((long) frame24->puc != -21 * 8) if ((long) frame24->puc != -21 * 8)
...@@ -146,16 +145,15 @@ enum { SIGNAL_FRAMESIZE = 64 }; ...@@ -146,16 +145,15 @@ enum { SIGNAL_FRAMESIZE = 64 };
static struct gcc_regs * static struct gcc_regs *
get_regs (struct _Unwind_Context *context) get_regs (struct _Unwind_Context *context)
{ {
const unsigned char *pc = context->ra; const unsigned int *pc = context->ra;
/* li r0, 0x7777; sc (sigreturn old) */ /* li r0, 0x7777; sc (sigreturn old) */
/* li r0, 0x0077; sc (sigreturn new) */ /* li r0, 0x0077; sc (sigreturn new) */
/* li r0, 0x6666; sc (rt_sigreturn old) */ /* li r0, 0x6666; sc (rt_sigreturn old) */
/* li r0, 0x00AC; sc (rt_sigreturn new) */ /* li r0, 0x00AC; sc (rt_sigreturn new) */
if (*(const unsigned int *) (pc + 4) != 0x44000002) if (pc[1] != 0x44000002)
return NULL; return NULL;
if (*(const unsigned int *) (pc + 0) == 0x38007777 if (pc[0] == 0x38007777 || pc[0] == 0x38000077)
|| *(const unsigned int *) (pc + 0) == 0x38000077)
{ {
struct sigframe { struct sigframe {
char gap[SIGNAL_FRAMESIZE]; char gap[SIGNAL_FRAMESIZE];
...@@ -164,8 +162,7 @@ get_regs (struct _Unwind_Context *context) ...@@ -164,8 +162,7 @@ get_regs (struct _Unwind_Context *context)
} *frame = (struct sigframe *) context->cfa; } *frame = (struct sigframe *) context->cfa;
return frame->regs; return frame->regs;
} }
else if (*(const unsigned int *) (pc + 0) == 0x38006666 else if (pc[0] == 0x38006666 || pc[0] == 0x380000AC)
|| *(const unsigned int *) (pc + 0) == 0x380000AC)
{ {
struct rt_sigframe { struct rt_sigframe {
char gap[SIGNAL_FRAMESIZE + 16]; char gap[SIGNAL_FRAMESIZE + 16];
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment