mirror of
https://github.com/tobast/libunwind-eh_elf.git
synced 2024-11-26 17:17:39 +01:00
178 lines
3.8 KiB
C
178 lines
3.8 KiB
C
|
|
||
|
|
||
|
#include <libunwind.h>
|
||
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <string.h>
|
||
|
#include <unistd.h>
|
||
|
#include <altivec.h>
|
||
|
|
||
|
#include <sys/resource.h>
|
||
|
|
||
|
#define panic(args...) { fprintf (stderr, args); abort(); }
|
||
|
|
||
|
extern vector signed int vec_init ();
|
||
|
extern void vec_print (vector signed int v);
|
||
|
|
||
|
vector signed int vec_stack (int count);
|
||
|
|
||
|
int
|
||
|
main ()
|
||
|
{
|
||
|
printf ("&vec_stack = %016lx\n", (unsigned long) vec_stack);
|
||
|
vec_stack (3);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
vector signed int
|
||
|
vec_stack (int count)
|
||
|
{
|
||
|
register vector signed int v1;
|
||
|
register vector signed int v2;
|
||
|
register vector signed int v3;
|
||
|
register vector signed int v4;
|
||
|
register vector signed int v5;
|
||
|
register vector signed int v6;
|
||
|
register vector signed int v7;
|
||
|
register vector signed int v8;
|
||
|
register vector signed int v9;
|
||
|
|
||
|
unw_fpreg_t vr;
|
||
|
|
||
|
unw_cursor_t cursor;
|
||
|
unw_word_t ip, sp;
|
||
|
unw_context_t uc;
|
||
|
int ret;
|
||
|
int verbose = 1;
|
||
|
|
||
|
/* if (count == 0) return vec_init(); */
|
||
|
|
||
|
if (count == 0)
|
||
|
{
|
||
|
unw_getcontext (&uc);
|
||
|
if (unw_init_local (&cursor, &uc) < 0)
|
||
|
{
|
||
|
panic ("unw_init_local failed!\n");
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
do
|
||
|
{
|
||
|
if ((ret = unw_get_reg (&cursor, UNW_REG_IP, &ip)) < 0)
|
||
|
{
|
||
|
panic ("FAILURE: unw_get_reg returned %d for UNW_REG_IP\n",
|
||
|
ret);
|
||
|
}
|
||
|
if ((ret = unw_get_reg (&cursor, UNW_REG_SP, &sp)) < 0)
|
||
|
{
|
||
|
panic ("FAILURE: unw_get_reg returned %d for UNW_REG_SP\n",
|
||
|
ret);
|
||
|
}
|
||
|
if ((ret = unw_get_fpreg (&cursor, UNW_PPC64_V30, &vr)) < 0)
|
||
|
{
|
||
|
panic
|
||
|
("FAILURE: unw_get_vreg returned %d for UNW_PPC64_V30\n",
|
||
|
ret);
|
||
|
}
|
||
|
|
||
|
|
||
|
if (verbose)
|
||
|
{
|
||
|
const char *regname = unw_regname (UNW_PPC64_V30);
|
||
|
char proc_name_buffer[256];
|
||
|
unw_word_t offset;
|
||
|
unsigned int * vec_half1, * vec_half2;
|
||
|
vec_half1 = (unsigned int *)&vr;
|
||
|
vec_half2 = vec_half1 + 1;
|
||
|
printf ("ip = %016lx, sp=%016lx\n", (long) ip, (long) sp);
|
||
|
printf ("vr30 = %08x %08x %08x %08x\n",
|
||
|
(unsigned int) (*vec_half1 >> 16),
|
||
|
(unsigned int) (*vec_half1 & 0xffffffff),
|
||
|
(unsigned int) (*vec_half2 >> 16),
|
||
|
(unsigned int) (*vec_half2 & 0xffffffff));
|
||
|
ret =
|
||
|
unw_get_proc_name (&cursor, proc_name_buffer,
|
||
|
sizeof (proc_name_buffer), &offset);
|
||
|
if (ret == 0)
|
||
|
{
|
||
|
printf ("proc name = %s, offset = %lx\n",
|
||
|
proc_name_buffer, offset);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
panic ("unw_get_proc_name returned %d\n", ret);
|
||
|
}
|
||
|
printf ("unw_regname(UNW_PPC_V30) = %s\n\n", regname);
|
||
|
}
|
||
|
|
||
|
ret = unw_step (&cursor);
|
||
|
if (ret < 0)
|
||
|
{
|
||
|
unw_get_reg (&cursor, UNW_REG_IP, &ip);
|
||
|
panic ("FAILURE: unw_step() returned %d for ip=%lx\n", ret,
|
||
|
(long) ip);
|
||
|
}
|
||
|
}
|
||
|
while (ret > 0);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
v1 = vec_init ();
|
||
|
v2 = vec_init ();
|
||
|
v3 = vec_init ();
|
||
|
v4 = vec_init ();
|
||
|
v5 = vec_init ();
|
||
|
v6 = vec_init ();
|
||
|
|
||
|
/* make use of all of the registers in some calculation */
|
||
|
v7 =
|
||
|
vec_nor (v1, vec_add (v2, vec_sub (v3, vec_and (v4, vec_or (v5, v6)))));
|
||
|
|
||
|
/*
|
||
|
* "force" the registers to be non-volatile by making a call and also
|
||
|
* using the registers after the call.
|
||
|
*/
|
||
|
v8 = vec_stack (count - 1);
|
||
|
|
||
|
/*
|
||
|
* Use the result from the previous call, plus all of the non-volatile
|
||
|
* registers in another calculation.
|
||
|
*/
|
||
|
v9 =
|
||
|
vec_nor (v1,
|
||
|
vec_add (v2,
|
||
|
vec_sub (v3,
|
||
|
vec_and (v4, vec_or (v5, vec_xor (v6, v8))))));
|
||
|
|
||
|
printf ("v1 - ");
|
||
|
vec_print (v1);
|
||
|
printf ("\n");
|
||
|
printf ("v2 - ");
|
||
|
vec_print (v2);
|
||
|
printf ("\n");
|
||
|
printf ("v3 - ");
|
||
|
vec_print (v3);
|
||
|
printf ("\n");
|
||
|
printf ("v4 - ");
|
||
|
vec_print (v4);
|
||
|
printf ("\n");
|
||
|
printf ("v5 - ");
|
||
|
vec_print (v5);
|
||
|
printf ("\n");
|
||
|
printf ("v6 - ");
|
||
|
vec_print (v6);
|
||
|
printf ("\n");
|
||
|
printf ("v7 - ");
|
||
|
vec_print (v7);
|
||
|
printf ("\n");
|
||
|
printf ("v8 - ");
|
||
|
vec_print (v8);
|
||
|
printf ("\n");
|
||
|
printf ("v9 - ");
|
||
|
vec_print (v9);
|
||
|
printf ("\n");
|
||
|
|
||
|
return v9;
|
||
|
}
|