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