1b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
2b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
3b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino#include <libunwind.h>
4b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino#include <stdio.h>
5b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino#include <stdlib.h>
6b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino#include <string.h>
7b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino#include <unistd.h>
8b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino#include <altivec.h>
9b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
10b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino#include <sys/resource.h>
11b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
12b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino#define panic(args...)	{ fprintf (stderr, args);  abort(); }
13b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
14b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulinoextern vector signed int vec_init ();
15b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulinoextern void vec_print (vector signed int v);
16b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
17b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulinovector signed int vec_stack (int count);
18b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
19b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulinoint
20b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulinomain ()
21b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino{
22b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  printf ("&vec_stack = %016lx\n", (unsigned long) vec_stack);
23b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  vec_stack (3);
24b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  return 0;
25b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino}
26b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
27b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
28b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulinovector signed int
29b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulinovec_stack (int count)
30b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino{
31b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  register vector signed int v1;
32b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  register vector signed int v2;
33b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  register vector signed int v3;
34b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  register vector signed int v4;
35b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  register vector signed int v5;
36b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  register vector signed int v6;
37b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  register vector signed int v7;
38b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  register vector signed int v8;
39b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  register vector signed int v9;
40b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
41b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  unw_fpreg_t vr;
42b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
43b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  unw_cursor_t cursor;
44b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  unw_word_t ip, sp;
45b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  unw_context_t uc;
46b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  int ret;
47b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  int verbose = 1;
48b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
49b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  /* if (count == 0) return vec_init(); */
50b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
51b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  if (count == 0)
52b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino    {
53b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino      unw_getcontext (&uc);
54b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino      if (unw_init_local (&cursor, &uc) < 0)
55b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino	{
56b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino	  panic ("unw_init_local failed!\n");
57b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino	}
58b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino      else
59b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino	{
60b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino	  do
61b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino	    {
62b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino	      if ((ret = unw_get_reg (&cursor, UNW_REG_IP, &ip)) < 0)
63b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino		{
64b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino		  panic ("FAILURE: unw_get_reg returned %d for UNW_REG_IP\n",
65b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino			 ret);
66b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino		}
67b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino	      if ((ret = unw_get_reg (&cursor, UNW_REG_SP, &sp)) < 0)
68b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino		{
69b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino		  panic ("FAILURE: unw_get_reg returned %d for UNW_REG_SP\n",
70b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino			 ret);
71b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino		}
72b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino	      if ((ret = unw_get_fpreg (&cursor, UNW_PPC64_V30, &vr)) < 0)
73b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino		{
74b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino		  panic
75b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino		    ("FAILURE: unw_get_vreg returned %d for UNW_PPC64_V30\n",
76b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino		     ret);
77b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino		}
78b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
79b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
80b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino	      if (verbose)
81b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino		{
82b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino		  const char *regname = unw_regname (UNW_PPC64_V30);
83b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino		  char proc_name_buffer[256];
84b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino		  unw_word_t offset;
85b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino                  unsigned int * vec_half1, * vec_half2;
86b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino                  vec_half1 = (unsigned int *)&vr;
87b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino                  vec_half2 = vec_half1 + 1;
88b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino		  printf ("ip = %016lx, sp=%016lx\n", (long) ip, (long) sp);
89b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino		  printf ("vr30 = %08x %08x %08x %08x\n",
90b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino			  (unsigned int) (*vec_half1 >> 16),
91b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino			  (unsigned int) (*vec_half1 & 0xffffffff),
92b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino			  (unsigned int) (*vec_half2 >> 16),
93b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino			  (unsigned int) (*vec_half2 & 0xffffffff));
94b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino		  ret =
95b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino		    unw_get_proc_name (&cursor, proc_name_buffer,
96b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino				       sizeof (proc_name_buffer), &offset);
97b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino		  if (ret == 0)
98b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino		    {
99b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino		      printf ("proc name = %s, offset = %lx\n",
100b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino			      proc_name_buffer, offset);
101b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino		    }
102b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino		  else
103b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino		    {
104b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino		      panic ("unw_get_proc_name returned %d\n", ret);
105b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino		    }
106b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino		  printf ("unw_regname(UNW_PPC_V30) = %s\n\n", regname);
107b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino		}
108b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
109b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino	      ret = unw_step (&cursor);
110b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino	      if (ret < 0)
111b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino		{
112b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino		  unw_get_reg (&cursor, UNW_REG_IP, &ip);
113b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino		  panic ("FAILURE: unw_step() returned %d for ip=%lx\n", ret,
114b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino			 (long) ip);
115b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino		}
116b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino	    }
117b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino	  while (ret > 0);
118b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino	}
119b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino    }
120b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
121b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  v1 = vec_init ();
122b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  v2 = vec_init ();
123b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  v3 = vec_init ();
124b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  v4 = vec_init ();
125b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  v5 = vec_init ();
126b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  v6 = vec_init ();
127b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
128b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  /* make use of all of the registers in some calculation */
129b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  v7 =
130b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino    vec_nor (v1, vec_add (v2, vec_sub (v3, vec_and (v4, vec_or (v5, v6)))));
131b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
132b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  /*
133b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino   * "force" the registers to be non-volatile by making a call and also
134b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino   * using the registers after the call.
135b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino   */
136b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  v8 = vec_stack (count - 1);
137b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
138b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  /*
139b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino   * Use the result from the previous call, plus all of the non-volatile
140b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino   * registers in another calculation.
141b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino   */
142b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  v9 =
143b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino    vec_nor (v1,
144b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino	     vec_add (v2,
145b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino		      vec_sub (v3,
146b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino			       vec_and (v4, vec_or (v5, vec_xor (v6, v8))))));
147b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
148b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  printf ("v1 - ");
149b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  vec_print (v1);
150b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  printf ("\n");
151b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  printf ("v2 - ");
152b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  vec_print (v2);
153b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  printf ("\n");
154b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  printf ("v3 - ");
155b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  vec_print (v3);
156b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  printf ("\n");
157b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  printf ("v4 - ");
158b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  vec_print (v4);
159b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  printf ("\n");
160b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  printf ("v5 - ");
161b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  vec_print (v5);
162b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  printf ("\n");
163b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  printf ("v6 - ");
164b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  vec_print (v6);
165b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  printf ("\n");
166b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  printf ("v7 - ");
167b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  vec_print (v7);
168b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  printf ("\n");
169b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  printf ("v8 - ");
170b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  vec_print (v8);
171b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  printf ("\n");
172b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  printf ("v9 - ");
173b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  vec_print (v9);
174b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  printf ("\n");
175b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
176b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  return v9;
177b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino}
178