[Cin] ppc64le incomplete patch #2

Daniel Reurich daniel at centurion.net.nz
Thu Mar 7 20:49:32 CET 2019


Hi Andrew,

For fixing BCSignals, I found that struct sigcontext which ultimately
comes from sigcontext.h in the kernel headers doesn't provide a
conistent mapping of the registers across all architectures - but struct
pt_reg from <asm/ptrace.h> does.

So you might want to give this patch a spin:

diff --git a/guicast/bcsignals.C b/guicast/bcsignals.C
index ed50cfb..b7549de 100644
--- a/guicast/bcsignals.C
+++ b/guicast/bcsignals.C
@@ -382,6 +382,7 @@ const char* BC_Signals::sig_to_str(int number)
 #include <ucontext.h>
 #include <sys/wait.h>
 #include "thread.h"
+#include <asm/ptrace.h>

 #if __i386__
 #define IP eip
@@ -389,6 +390,9 @@ const char* BC_Signals::sig_to_str(int number)
 #if __x86_64__
 #define IP rip
 #endif
+#if __powerpc__ || __powerpc64__ || __powerpc64le__
+#define IP nip
+#endif
 #ifndef IP
 #error gotta have IP
 #endif
@@ -406,7 +410,7 @@ static void handle_dump(int n, siginfo_t * info,
void *sc)
 //     if( uid != 0 ) return;
        ucontext_t *uc = (ucontext_t *)sc;
        int pid = getpid(), tid = gettid();
-       struct sigcontext *c = (struct sigcontext *)&uc->uc_mcontext;
+       struct pt_regs *c = (struct pt_regs *)&uc->uc_mcontext;
        uint8_t *ip = (uint8_t *)c->IP;
        fprintf(stderr,"** %s at %p in pid %d, tid %d\n",
                n==SIGSEGV? "segv" : n==SIGINT? "intr" : "trap",



On 25/02/19 17:18, Andrew Randrianasulu wrote:
> diff --git a/cinelerra-5.1/guicast/bcsignals.C b/cinelerra-5.1/guicast/bcsignals.C
> index ed50cfb..8442847 100644
> --- a/cinelerra-5.1/guicast/bcsignals.C
> +++ b/cinelerra-5.1/guicast/bcsignals.C
> @@ -389,6 +389,9 @@ const char* BC_Signals::sig_to_str(int number)
>  #if __x86_64__
>  #define IP rip
>  #endif
> +#if __powerpc64__
> +#define IP nip
> +#endif
>  #ifndef IP
>  #error gotta have IP
>  #endif
> @@ -404,13 +407,14 @@ static void handle_dump(int n, siginfo_t * info, void *sc)
>  // it is not necessary to be root if ptrace is allowed via:
>  // echo 0 > /proc/sys/kernel/yama/ptrace_scope (usually set to 1)
>  //	if( uid != 0 ) return;
> +
>  	ucontext_t *uc = (ucontext_t *)sc;
>  	int pid = getpid(), tid = gettid();
>  	struct sigcontext *c = (struct sigcontext *)&uc->uc_mcontext;
> -	uint8_t *ip = (uint8_t *)c->IP;
> -	fprintf(stderr,"** %s at %p in pid %d, tid %d\n",
> -		n==SIGSEGV? "segv" : n==SIGINT? "intr" : "trap",
> -		(void*)ip, pid, tid);
> +//	uint8_t *ip = (uint8_t *)c->IP;
> +//	fprintf(stderr,"** %s at %p in pid %d, tid %d\n",
> +//		n==SIGSEGV? "segv" : n==SIGINT? "intr" : "trap",
> +//		(void*)ip, pid, tid);
>  	FILE *fp = 0;
>  	char fn[PATH_MAX];
>  	if( BC_Signals::trap_path ) {
> @@ -419,9 +423,9 @@ static void handle_dump(int n, siginfo_t * info, void *sc)
>  	}
>  	if( fp ) {
>  		fprintf(stderr,"writing debug data to %s\n", fn);
> -		fprintf(fp,"** %s at %p in pid %d, tid %d\n",
> -			n==SIGSEGV? "segv" : n==SIGINT? "intr" : "trap",
> -			(void*)c->IP, pid, tid);
> +//		fprintf(fp,"** %s at %p in pid %d, tid %d\n",
> +//			n==SIGSEGV? "segv" : n==SIGINT? "intr" : "trap",
> +//			(void*)c->IP, pid, tid);
>  	}
>  	else {
>  		strcpy(fn, "stdout");
> @@ -458,13 +462,13 @@ static void handle_dump(int n, siginfo_t * info, void *sc)
>  	int pfd = open(proc_mem,O_RDONLY);
>  	if( pfd >= 0 ) {
>  		fprintf(fp,"\nCODE:\n");
> -		for( int i=-32; i<32; ) {
> -			uint8_t v;  void *vp = (void *)(ip + i);
> -			if( !(i & 7) ) fprintf(fp,"%p:  ", vp);
> -			if( pread(pfd,&v,sizeof(v),(off_t)vp) != sizeof(v) ) break;
> -			fprintf(fp,"%c%02x", !i ? '>' : ' ', v);
> -			if( !(++i & 7) ) fprintf(fp,"\n");
> -		}
> +//		for( int i=-32; i<32; ) {
> +//			uint8_t v;  void *vp = (void *)(ip + i);
> +//			if( !(i & 7) ) fprintf(fp,"%p:  ", vp);
> +//			if( pread(pfd,&v,sizeof(v),(off_t)vp) != sizeof(v) ) break;
> +//			fprintf(fp,"%c%02x", !i ? '>' : ' ', v);
> +//			if( !(++i & 7) ) fprintf(fp,"\n");
> +//		}
>  		fprintf(fp,"\n");
>  		close(pfd);
>  	}
> @@ -494,5 +498,6 @@ static void handle_dump(int n, siginfo_t * info, void *sc)
>  	}
>          char *const argv[4] = { (char*) "/bin/sh", (char*) "-c", cmd, 0 };
>          execvp(argv[0], &argv[0]);
> +
>  }
>  


-- 
Daniel Reurich
Centurion Computer Technology (2005) Ltd.
021 797 722

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: OpenPGP digital signature
URL: <https://lists.cinelerra-gg.org/pipermail/cin/attachments/20190308/3805d76d/attachment.asc>


More information about the Cin mailing list