Re:sigcontext on Linux-ppc in user space, another hack.

2001-01-25 Thread jekacur


It appears you can just use the siginfo_t * as the struct sigcontext *
!!
ie
void *signal_handler(int signo, siginfo_t *siginfoptr, struct sigcontext
*scp)
{
 scp = (struct sigcontext_struct *)siginfoptr;
 /* the rest of your code, here */
}


John Kacur/Toronto/IBM@IBMCA
[EMAIL PROTECTED]
(416) 448-2584 (phone)
778-2584 (tie line)


"Kevin B. Hendricks" <[EMAIL PROTECTED]> on 01/25/2001 02:02:20 PM

Please respond to [EMAIL PROTECTED]

To:   John Kacur/Toronto/IBM@IBMCA
cc:
Subject:  Re: [Fwd: sigcontext on Linux-ppc in user space]


Hi,

Just in case this helps,  here is what I did to accomplish the same thing
in the green_threads jdk.  It definitely is not portable.

Kevin

Inside the signal handler:

#elif defined(__linux__) && defined(__powerpc__)
/* get the value of r1 (the stack pointer) */
long * p;
struct sigcontext_struct * scp;
__asm__ ( "addi %0,1,0" : "=r" (p) : /* no inputs */ );
/* follow it back up the chain */
p = *p;
/* from here the sigcontext struct is 64 bytes away */
p = p + 16;
scp = (struct sigcontext_struct *)p;

On Thursday, January 25, 2001, at 01:50 PM, [EMAIL PROTECTED] wrote:

>
> Ok, actually the segfault was for a more complicated function, but the
> simplified example still gives the wrong answer. i.e scp should point to
a
> struct sigcontext and scp->signal should be 10 in the sample program.
>
> John Kacur/Toronto/IBM@IBMCA
> [EMAIL PROTECTED]
> (416) 448-2584 (phone)
> 778-2584 (tie line)
>
>
> "Kevin B. Hendricks" <[EMAIL PROTECTED]> on 01/25/2001 01:10:40 PM
>
> Please respond to [EMAIL PROTECTED]
>
> To:   John Kacur/Toronto/IBM@IBMCA
> cc:   [EMAIL PROTECTED], [EMAIL PROTECTED]
> Subject:  Re: [Fwd: sigcontext on Linux-ppc in user space]
>
>
> Hi,
>
> Here is what I get from running it on my system (ppc linux with 2.2.15
> kernel with some mods and glibc-2.1.3).
>
> But no segfault.
>
> Kevin
>
>
> [kbhend@localhost ~]$ gcc -O2 -ojunk junk.c
> [kbhend@localhost ~]$ ./junk
> SIGUSR1 = 10
> scp = 7fffe9a4
> scp->signal = 0
> [kbhend@localhost ~]$
>
>
>
>
> On Thursday, January 25, 2001, at 10:09 AM, [EMAIL PROTECTED] wrote:
>
> > #include 
> > #include 
> >
> > /* Function Prototypes */
> > void install_sigusr1_handler(void);
> > void sigusr_handler(int , siginfo_t *, struct sigcontext * scp);
> >
> > int main(void)
> > {
> > install_sigusr1_handler();
> > printf("SIGUSR1 = %d\n", SIGUSR1);
> > raise(SIGUSR1);
> > exit(0);
> > }
> >
> > void install_sigusr1_handler(void)
> > {
> > struct sigaction newAct;
> >
> > if (sigemptyset(_mask) != 0) {
> > fprintf(stderr, "Warning, sigemptyset failed.\n");
> > }
> >
> > newAct.sa_flags = 0;
> > newAct.sa_flags |= SA_SIGINFO | SA_RESTART;
> >
> > newAct.sa_sigaction = (void
> > (*)(int,siginfo_t*,void*))sigusr_handler;
> >
> > if (sigaction(SIGUSR1, , NULL) != 0) {
> > fprintf(stderr, "Couldn't install SIGUSR1 handler.\n");

> > fprintf(stderr, "Exiting.\n");
> > exit(1);
> > }
> > }
> >
> > void sigusr_handler(int signo, siginfo_t *siginfp, struct sigcontext *
> scp)
> > {
> > printf("scp = %08x\n", scp);
> > printf("scp->signal = %d\n", scp->signal);
> > }
> >
> >
>
>
>
>




-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
Please read the FAQ at http://www.tux.org/lkml/



Re: [Fwd: sigcontext on Linux-ppc in user space]

2001-01-25 Thread jekacur


Ok, actually the segfault was for a more complicated function, but the
simplified example still gives the wrong answer. i.e scp should point to a
struct sigcontext and scp->signal should be 10 in the sample program.

John Kacur/Toronto/IBM@IBMCA
[EMAIL PROTECTED]
(416) 448-2584 (phone)
778-2584 (tie line)


"Kevin B. Hendricks" <[EMAIL PROTECTED]> on 01/25/2001 01:10:40 PM

Please respond to [EMAIL PROTECTED]

To:   John Kacur/Toronto/IBM@IBMCA
cc:   [EMAIL PROTECTED], [EMAIL PROTECTED]
Subject:  Re: [Fwd: sigcontext on Linux-ppc in user space]


Hi,

Here is what I get from running it on my system (ppc linux with 2.2.15
kernel with some mods and glibc-2.1.3).

But no segfault.

Kevin


[kbhend@localhost ~]$ gcc -O2 -ojunk junk.c
[kbhend@localhost ~]$ ./junk
SIGUSR1 = 10
scp = 7fffe9a4
scp->signal = 0
[kbhend@localhost ~]$




On Thursday, January 25, 2001, at 10:09 AM, [EMAIL PROTECTED] wrote:

> #include 
> #include 
>
> /* Function Prototypes */
> void install_sigusr1_handler(void);
> void sigusr_handler(int , siginfo_t *, struct sigcontext * scp);
>
> int main(void)
> {
> install_sigusr1_handler();
> printf("SIGUSR1 = %d\n", SIGUSR1);
> raise(SIGUSR1);
> exit(0);
> }
>
> void install_sigusr1_handler(void)
> {
> struct sigaction newAct;
>
> if (sigemptyset(_mask) != 0) {
> fprintf(stderr, "Warning, sigemptyset failed.\n");
> }
>
> newAct.sa_flags = 0;
> newAct.sa_flags |= SA_SIGINFO | SA_RESTART;
>
> newAct.sa_sigaction = (void
> (*)(int,siginfo_t*,void*))sigusr_handler;
>
> if (sigaction(SIGUSR1, , NULL) != 0) {
> fprintf(stderr, "Couldn't install SIGUSR1 handler.\n");
> fprintf(stderr, "Exiting.\n");
> exit(1);
> }
> }
>
> void sigusr_handler(int signo, siginfo_t *siginfp, struct sigcontext *
scp)
> {
> printf("scp = %08x\n", scp);
> printf("scp->signal = %d\n", scp->signal);
> }
>
>




-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
Please read the FAQ at http://www.tux.org/lkml/



Re: [Fwd: sigcontext on Linux-ppc in user space]

2001-01-25 Thread jekacur



John Kacur/Toronto/IBM@IBMCA
[EMAIL PROTECTED]
(416) 448-2584 (phone)
778-2584 (tie line)


-- Forwarded by John Kacur/Toronto/IBM on 01/25/2001
10:06 AM ---

John Kacur
01/24/2001 04:47 PM

To:   [EMAIL PROTECTED]
cc:   [EMAIL PROTECTED]
From: John Kacur/Toronto/IBM@IBMCA
Subject:  Re: [Fwd: sigcontext on Linux-ppc in user space]  (Document link:
  John Kacur)

Thanks for your reply. Yes, you are right I shouldn't include kernel files
in user space programs, and signal.h will contain what I need anyway. But I
still can't get at the sigcontext.c on Linux Powerpc. For example, this
simple program gives me a segmentation fault. (Linux ppc, suse 6.4, kernel
2.2.14


#include 
#include 

/* Function Prototypes */
void install_sigusr1_handler(void);
void sigusr_handler(int , siginfo_t *, struct sigcontext * scp);

int main(void)
{
install_sigusr1_handler();
printf("SIGUSR1 = %d\n", SIGUSR1);
raise(SIGUSR1);
exit(0);
}

void install_sigusr1_handler(void)
{
struct sigaction newAct;

if (sigemptyset(_mask) != 0) {
fprintf(stderr, "Warning, sigemptyset failed.\n");
}

newAct.sa_flags = 0;
newAct.sa_flags |= SA_SIGINFO | SA_RESTART;

newAct.sa_sigaction = (void
(*)(int,siginfo_t*,void*))sigusr_handler;

if (sigaction(SIGUSR1, , NULL) != 0) {
fprintf(stderr, "Couldn't install SIGUSR1 handler.\n");
fprintf(stderr, "Exiting.\n");
exit(1);
}
}

void sigusr_handler(int signo, siginfo_t *siginfp, struct sigcontext * scp)
{
printf("scp = %08x\n", scp);
printf("scp->signal = %d\n", scp->signal);
}

Ultimately, I want to get at the regs, ie scp->pt_regs->nip for example.

Any ideas?

Thanks.
John Kacur/Toronto/IBM@IBMCA
[EMAIL PROTECTED]
(416) 448-2584 (phone)
778-2584 (tie line)


John Kacur <[EMAIL PROTECTED]>@e1.ny.us.ibm.com on 01/24/2001 10:26:30 AM

Please respond to John Kacur <[EMAIL PROTECTED]>

Sent by:  [EMAIL PROTECTED]


To:   John Kacur/Toronto/IBM@IBMCA
cc:
Subject:  [Fwd: sigcontext on Linux-ppc in user space]



- Message from on -
   
   
   

John Kacur <[EMAIL PROTECTED]> writes:

> Does anyone know how to get at the struct sigcontext in a signal handler
> on Linux for powerpc? sigaction of course lets you create a signal
> handler as a function with the prototype void(*)(int, siginfo_t *, void
> *)
> where the last argument, a pointer to void, is the sigcontext. I believe
> that the last argument is NOT defined by POSIX and so is implementation
> dependent.
>
> On Intel it seems sufficient to use #include 
> to get the definition of struct sigcontext, and then get the values
> you'd like out of the signal handler. But on Linux for powerpc, the same
> thing doesn't work. Does anyone know what the trick is here to
> accomplish this?

You should never include kernel headers in user space.

If you have a glibc 2.1 (or newer) based system, just include
 which will include  with the struct
(this works on all architectures).

Andreas
--
 Andreas Jaeger
  SuSE Labs [EMAIL PROTECTED]
   private [EMAIL PROTECTED]
http://www.suse.de/~aj
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
Please read the FAQ at http://www.tux.org/lkml/






-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
Please read the FAQ at http://www.tux.org/lkml/



Re: [Fwd: sigcontext on Linux-ppc in user space]

2001-01-25 Thread jekacur



John Kacur/Toronto/IBM@IBMCA
[EMAIL PROTECTED]
(416) 448-2584 (phone)
778-2584 (tie line)


-- Forwarded by John Kacur/Toronto/IBM on 01/25/2001
10:06 AM ---

John Kacur
01/24/2001 04:47 PM

To:   [EMAIL PROTECTED]
cc:   [EMAIL PROTECTED]
From: John Kacur/Toronto/IBM@IBMCA
Subject:  Re: [Fwd: sigcontext on Linux-ppc in user space]  (Document link:
  John Kacur)

Thanks for your reply. Yes, you are right I shouldn't include kernel files
in user space programs, and signal.h will contain what I need anyway. But I
still can't get at the sigcontext.c on Linux Powerpc. For example, this
simple program gives me a segmentation fault. (Linux ppc, suse 6.4, kernel
2.2.14


#include stdio.h
#include signal.h

/* Function Prototypes */
void install_sigusr1_handler(void);
void sigusr_handler(int , siginfo_t *, struct sigcontext * scp);

int main(void)
{
install_sigusr1_handler();
printf("SIGUSR1 = %d\n", SIGUSR1);
raise(SIGUSR1);
exit(0);
}

void install_sigusr1_handler(void)
{
struct sigaction newAct;

if (sigemptyset(newAct.sa_mask) != 0) {
fprintf(stderr, "Warning, sigemptyset failed.\n");
}

newAct.sa_flags = 0;
newAct.sa_flags |= SA_SIGINFO | SA_RESTART;

newAct.sa_sigaction = (void
(*)(int,siginfo_t*,void*))sigusr_handler;

if (sigaction(SIGUSR1, newAct, NULL) != 0) {
fprintf(stderr, "Couldn't install SIGUSR1 handler.\n");
fprintf(stderr, "Exiting.\n");
exit(1);
}
}

void sigusr_handler(int signo, siginfo_t *siginfp, struct sigcontext * scp)
{
printf("scp = %08x\n", scp);
printf("scp-signal = %d\n", scp-signal);
}

Ultimately, I want to get at the regs, ie scp-pt_regs-nip for example.

Any ideas?

Thanks.
John Kacur/Toronto/IBM@IBMCA
[EMAIL PROTECTED]
(416) 448-2584 (phone)
778-2584 (tie line)


John Kacur [EMAIL PROTECTED]@e1.ny.us.ibm.com on 01/24/2001 10:26:30 AM

Please respond to John Kacur [EMAIL PROTECTED]

Sent by:  [EMAIL PROTECTED]


To:   John Kacur/Toronto/IBM@IBMCA
cc:
Subject:  [Fwd: sigcontext on Linux-ppc in user space]



- Message from on -
   
   
   

John Kacur [EMAIL PROTECTED] writes:

 Does anyone know how to get at the struct sigcontext in a signal handler
 on Linux for powerpc? sigaction of course lets you create a signal
 handler as a function with the prototype void(*)(int, siginfo_t *, void
 *)
 where the last argument, a pointer to void, is the sigcontext. I believe
 that the last argument is NOT defined by POSIX and so is implementation
 dependent.

 On Intel it seems sufficient to use #include asm/sigcontext.h
 to get the definition of struct sigcontext, and then get the values
 you'd like out of the signal handler. But on Linux for powerpc, the same
 thing doesn't work. Does anyone know what the trick is here to
 accomplish this?

You should never include kernel headers in user space.

If you have a glibc 2.1 (or newer) based system, just include
signal.h which will include bits/sigcontext.h with the struct
(this works on all architectures).

Andreas
--
 Andreas Jaeger
  SuSE Labs [EMAIL PROTECTED]
   private [EMAIL PROTECTED]
http://www.suse.de/~aj
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
Please read the FAQ at http://www.tux.org/lkml/






-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
Please read the FAQ at http://www.tux.org/lkml/



Re: [Fwd: sigcontext on Linux-ppc in user space]

2001-01-25 Thread jekacur


Ok, actually the segfault was for a more complicated function, but the
simplified example still gives the wrong answer. i.e scp should point to a
struct sigcontext and scp-signal should be 10 in the sample program.

John Kacur/Toronto/IBM@IBMCA
[EMAIL PROTECTED]
(416) 448-2584 (phone)
778-2584 (tie line)


"Kevin B. Hendricks" [EMAIL PROTECTED] on 01/25/2001 01:10:40 PM

Please respond to [EMAIL PROTECTED]

To:   John Kacur/Toronto/IBM@IBMCA
cc:   [EMAIL PROTECTED], [EMAIL PROTECTED]
Subject:  Re: [Fwd: sigcontext on Linux-ppc in user space]


Hi,

Here is what I get from running it on my system (ppc linux with 2.2.15
kernel with some mods and glibc-2.1.3).

But no segfault.

Kevin


[kbhend@localhost ~]$ gcc -O2 -ojunk junk.c
[kbhend@localhost ~]$ ./junk
SIGUSR1 = 10
scp = 7fffe9a4
scp-signal = 0
[kbhend@localhost ~]$




On Thursday, January 25, 2001, at 10:09 AM, [EMAIL PROTECTED] wrote:

 #include stdio.h
 #include signal.h

 /* Function Prototypes */
 void install_sigusr1_handler(void);
 void sigusr_handler(int , siginfo_t *, struct sigcontext * scp);

 int main(void)
 {
 install_sigusr1_handler();
 printf("SIGUSR1 = %d\n", SIGUSR1);
 raise(SIGUSR1);
 exit(0);
 }

 void install_sigusr1_handler(void)
 {
 struct sigaction newAct;

 if (sigemptyset(newAct.sa_mask) != 0) {
 fprintf(stderr, "Warning, sigemptyset failed.\n");
 }

 newAct.sa_flags = 0;
 newAct.sa_flags |= SA_SIGINFO | SA_RESTART;

 newAct.sa_sigaction = (void
 (*)(int,siginfo_t*,void*))sigusr_handler;

 if (sigaction(SIGUSR1, newAct, NULL) != 0) {
 fprintf(stderr, "Couldn't install SIGUSR1 handler.\n");
 fprintf(stderr, "Exiting.\n");
 exit(1);
 }
 }

 void sigusr_handler(int signo, siginfo_t *siginfp, struct sigcontext *
scp)
 {
 printf("scp = %08x\n", scp);
 printf("scp-signal = %d\n", scp-signal);
 }






-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
Please read the FAQ at http://www.tux.org/lkml/



Re:sigcontext on Linux-ppc in user space, another hack.

2001-01-25 Thread jekacur


It appears you can just use the siginfo_t * as the struct sigcontext *
!!
ie
void *signal_handler(int signo, siginfo_t *siginfoptr, struct sigcontext
*scp)
{
 scp = (struct sigcontext_struct *)siginfoptr;
 /* the rest of your code, here */
}


John Kacur/Toronto/IBM@IBMCA
[EMAIL PROTECTED]
(416) 448-2584 (phone)
778-2584 (tie line)


"Kevin B. Hendricks" [EMAIL PROTECTED] on 01/25/2001 02:02:20 PM

Please respond to [EMAIL PROTECTED]

To:   John Kacur/Toronto/IBM@IBMCA
cc:
Subject:  Re: [Fwd: sigcontext on Linux-ppc in user space]


Hi,

Just in case this helps,  here is what I did to accomplish the same thing
in the green_threads jdk.  It definitely is not portable.

Kevin

Inside the signal handler:

#elif defined(__linux__)  defined(__powerpc__)
/* get the value of r1 (the stack pointer) */
long * p;
struct sigcontext_struct * scp;
__asm__ ( "addi %0,1,0" : "=r" (p) : /* no inputs */ );
/* follow it back up the chain */
p = *p;
/* from here the sigcontext struct is 64 bytes away */
p = p + 16;
scp = (struct sigcontext_struct *)p;

On Thursday, January 25, 2001, at 01:50 PM, [EMAIL PROTECTED] wrote:


 Ok, actually the segfault was for a more complicated function, but the
 simplified example still gives the wrong answer. i.e scp should point to
a
 struct sigcontext and scp-signal should be 10 in the sample program.

 John Kacur/Toronto/IBM@IBMCA
 [EMAIL PROTECTED]
 (416) 448-2584 (phone)
 778-2584 (tie line)


 "Kevin B. Hendricks" [EMAIL PROTECTED] on 01/25/2001 01:10:40 PM

 Please respond to [EMAIL PROTECTED]

 To:   John Kacur/Toronto/IBM@IBMCA
 cc:   [EMAIL PROTECTED], [EMAIL PROTECTED]
 Subject:  Re: [Fwd: sigcontext on Linux-ppc in user space]


 Hi,

 Here is what I get from running it on my system (ppc linux with 2.2.15
 kernel with some mods and glibc-2.1.3).

 But no segfault.

 Kevin


 [kbhend@localhost ~]$ gcc -O2 -ojunk junk.c
 [kbhend@localhost ~]$ ./junk
 SIGUSR1 = 10
 scp = 7fffe9a4
 scp-signal = 0
 [kbhend@localhost ~]$




 On Thursday, January 25, 2001, at 10:09 AM, [EMAIL PROTECTED] wrote:

  #include stdio.h
  #include signal.h
 
  /* Function Prototypes */
  void install_sigusr1_handler(void);
  void sigusr_handler(int , siginfo_t *, struct sigcontext * scp);
 
  int main(void)
  {
  install_sigusr1_handler();
  printf("SIGUSR1 = %d\n", SIGUSR1);
  raise(SIGUSR1);
  exit(0);
  }
 
  void install_sigusr1_handler(void)
  {
  struct sigaction newAct;
 
  if (sigemptyset(newAct.sa_mask) != 0) {
  fprintf(stderr, "Warning, sigemptyset failed.\n");
  }
 
  newAct.sa_flags = 0;
  newAct.sa_flags |= SA_SIGINFO | SA_RESTART;
 
  newAct.sa_sigaction = (void
  (*)(int,siginfo_t*,void*))sigusr_handler;
 
  if (sigaction(SIGUSR1, newAct, NULL) != 0) {
  fprintf(stderr, "Couldn't install SIGUSR1 handler.\n");

  fprintf(stderr, "Exiting.\n");
  exit(1);
  }
  }
 
  void sigusr_handler(int signo, siginfo_t *siginfp, struct sigcontext *
 scp)
  {
  printf("scp = %08x\n", scp);
  printf("scp-signal = %d\n", scp-signal);
  }
 
 








-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
Please read the FAQ at http://www.tux.org/lkml/