1f666ad41SAnshuman Khandual /* 2f666ad41SAnshuman Khandual * Ptrace interface test helper functions 3f666ad41SAnshuman Khandual * 4f666ad41SAnshuman Khandual * Copyright (C) 2015 Anshuman Khandual, IBM Corporation. 5f666ad41SAnshuman Khandual * 6f666ad41SAnshuman Khandual * This program is free software; you can redistribute it and/or 7f666ad41SAnshuman Khandual * modify it under the terms of the GNU General Public License 8f666ad41SAnshuman Khandual * as published by the Free Software Foundation; either version 9f666ad41SAnshuman Khandual * 2 of the License, or (at your option) any later version. 10f666ad41SAnshuman Khandual */ 11f666ad41SAnshuman Khandual #include <inttypes.h> 12f666ad41SAnshuman Khandual #include <unistd.h> 13f666ad41SAnshuman Khandual #include <stdlib.h> 14f666ad41SAnshuman Khandual #include <string.h> 15f666ad41SAnshuman Khandual #include <malloc.h> 16f666ad41SAnshuman Khandual #include <errno.h> 17f666ad41SAnshuman Khandual #include <time.h> 18f666ad41SAnshuman Khandual #include <sys/ptrace.h> 19f666ad41SAnshuman Khandual #include <sys/ioctl.h> 20f666ad41SAnshuman Khandual #include <sys/uio.h> 21f666ad41SAnshuman Khandual #include <sys/types.h> 22f666ad41SAnshuman Khandual #include <sys/wait.h> 23f666ad41SAnshuman Khandual #include <sys/signal.h> 24f666ad41SAnshuman Khandual #include <sys/ipc.h> 25f666ad41SAnshuman Khandual #include <sys/shm.h> 26f666ad41SAnshuman Khandual #include <sys/user.h> 27f666ad41SAnshuman Khandual #include <linux/elf.h> 28f666ad41SAnshuman Khandual #include <linux/types.h> 29f666ad41SAnshuman Khandual #include <linux/auxvec.h> 30f666ad41SAnshuman Khandual #include "reg.h" 31f666ad41SAnshuman Khandual #include "utils.h" 32f666ad41SAnshuman Khandual 33f666ad41SAnshuman Khandual #define TEST_PASS 0 34f666ad41SAnshuman Khandual #define TEST_FAIL 1 35f666ad41SAnshuman Khandual 36f666ad41SAnshuman Khandual struct fpr_regs { 37f666ad41SAnshuman Khandual unsigned long fpr[32]; 38f666ad41SAnshuman Khandual unsigned long fpscr; 39f666ad41SAnshuman Khandual }; 40f666ad41SAnshuman Khandual 41f666ad41SAnshuman Khandual 42f666ad41SAnshuman Khandual #ifndef NT_PPC_TAR 43f666ad41SAnshuman Khandual #define NT_PPC_TAR 0x103 44f666ad41SAnshuman Khandual #define NT_PPC_PPR 0x104 45f666ad41SAnshuman Khandual #define NT_PPC_DSCR 0x105 46f666ad41SAnshuman Khandual #define NT_PPC_EBB 0x106 47f666ad41SAnshuman Khandual #define NT_PPC_PMU 0x107 48f666ad41SAnshuman Khandual #define NT_PPC_TM_CGPR 0x108 49f666ad41SAnshuman Khandual #define NT_PPC_TM_CFPR 0x109 50f666ad41SAnshuman Khandual #define NT_PPC_TM_CVMX 0x10a 51f666ad41SAnshuman Khandual #define NT_PPC_TM_CVSX 0x10b 52f666ad41SAnshuman Khandual #define NT_PPC_TM_SPR 0x10c 53f666ad41SAnshuman Khandual #define NT_PPC_TM_CTAR 0x10d 54f666ad41SAnshuman Khandual #define NT_PPC_TM_CPPR 0x10e 55f666ad41SAnshuman Khandual #define NT_PPC_TM_CDSCR 0x10f 56f666ad41SAnshuman Khandual #endif 57f666ad41SAnshuman Khandual 58f666ad41SAnshuman Khandual /* Basic ptrace operations */ 59f666ad41SAnshuman Khandual int start_trace(pid_t child) 60f666ad41SAnshuman Khandual { 61f666ad41SAnshuman Khandual int ret; 62f666ad41SAnshuman Khandual 63f666ad41SAnshuman Khandual ret = ptrace(PTRACE_ATTACH, child, NULL, NULL); 64f666ad41SAnshuman Khandual if (ret) { 65f666ad41SAnshuman Khandual perror("ptrace(PTRACE_ATTACH) failed"); 66f666ad41SAnshuman Khandual return TEST_FAIL; 67f666ad41SAnshuman Khandual } 68f666ad41SAnshuman Khandual ret = waitpid(child, NULL, 0); 69f666ad41SAnshuman Khandual if (ret != child) { 70f666ad41SAnshuman Khandual perror("waitpid() failed"); 71f666ad41SAnshuman Khandual return TEST_FAIL; 72f666ad41SAnshuman Khandual } 73f666ad41SAnshuman Khandual return TEST_PASS; 74f666ad41SAnshuman Khandual } 75f666ad41SAnshuman Khandual 76f666ad41SAnshuman Khandual int stop_trace(pid_t child) 77f666ad41SAnshuman Khandual { 78f666ad41SAnshuman Khandual int ret; 79f666ad41SAnshuman Khandual 80f666ad41SAnshuman Khandual ret = ptrace(PTRACE_DETACH, child, NULL, NULL); 81f666ad41SAnshuman Khandual if (ret) { 82f666ad41SAnshuman Khandual perror("ptrace(PTRACE_DETACH) failed"); 83f666ad41SAnshuman Khandual return TEST_FAIL; 84f666ad41SAnshuman Khandual } 85f666ad41SAnshuman Khandual return TEST_PASS; 86f666ad41SAnshuman Khandual } 87f666ad41SAnshuman Khandual 88f666ad41SAnshuman Khandual int cont_trace(pid_t child) 89f666ad41SAnshuman Khandual { 90f666ad41SAnshuman Khandual int ret; 91f666ad41SAnshuman Khandual 92f666ad41SAnshuman Khandual ret = ptrace(PTRACE_CONT, child, NULL, NULL); 93f666ad41SAnshuman Khandual if (ret) { 94f666ad41SAnshuman Khandual perror("ptrace(PTRACE_CONT) failed"); 95f666ad41SAnshuman Khandual return TEST_FAIL; 96f666ad41SAnshuman Khandual } 97f666ad41SAnshuman Khandual return TEST_PASS; 98f666ad41SAnshuman Khandual } 99f666ad41SAnshuman Khandual 100f666ad41SAnshuman Khandual /* FPR */ 101f666ad41SAnshuman Khandual int show_fpr(pid_t child, unsigned long *fpr) 102f666ad41SAnshuman Khandual { 103f666ad41SAnshuman Khandual struct fpr_regs *regs; 104f666ad41SAnshuman Khandual int ret, i; 105f666ad41SAnshuman Khandual 106f666ad41SAnshuman Khandual regs = (struct fpr_regs *) malloc(sizeof(struct fpr_regs)); 107f666ad41SAnshuman Khandual ret = ptrace(PTRACE_GETFPREGS, child, NULL, regs); 108f666ad41SAnshuman Khandual if (ret) { 109f666ad41SAnshuman Khandual perror("ptrace(PTRACE_GETREGSET) failed"); 110f666ad41SAnshuman Khandual return TEST_FAIL; 111f666ad41SAnshuman Khandual } 112f666ad41SAnshuman Khandual 113f666ad41SAnshuman Khandual if (fpr) { 114f666ad41SAnshuman Khandual for (i = 0; i < 32; i++) 115f666ad41SAnshuman Khandual fpr[i] = regs->fpr[i]; 116f666ad41SAnshuman Khandual } 117f666ad41SAnshuman Khandual return TEST_PASS; 118f666ad41SAnshuman Khandual } 119f666ad41SAnshuman Khandual 120f666ad41SAnshuman Khandual int write_fpr(pid_t child, unsigned long val) 121f666ad41SAnshuman Khandual { 122f666ad41SAnshuman Khandual struct fpr_regs *regs; 123f666ad41SAnshuman Khandual int ret, i; 124f666ad41SAnshuman Khandual 125f666ad41SAnshuman Khandual regs = (struct fpr_regs *) malloc(sizeof(struct fpr_regs)); 126f666ad41SAnshuman Khandual ret = ptrace(PTRACE_GETFPREGS, child, NULL, regs); 127f666ad41SAnshuman Khandual if (ret) { 128f666ad41SAnshuman Khandual perror("ptrace(PTRACE_GETREGSET) failed"); 129f666ad41SAnshuman Khandual return TEST_FAIL; 130f666ad41SAnshuman Khandual } 131f666ad41SAnshuman Khandual 132f666ad41SAnshuman Khandual for (i = 0; i < 32; i++) 133f666ad41SAnshuman Khandual regs->fpr[i] = val; 134f666ad41SAnshuman Khandual 135f666ad41SAnshuman Khandual ret = ptrace(PTRACE_SETFPREGS, child, NULL, regs); 136f666ad41SAnshuman Khandual if (ret) { 137f666ad41SAnshuman Khandual perror("ptrace(PTRACE_GETREGSET) failed"); 138f666ad41SAnshuman Khandual return TEST_FAIL; 139f666ad41SAnshuman Khandual } 140f666ad41SAnshuman Khandual return TEST_PASS; 141f666ad41SAnshuman Khandual } 142f666ad41SAnshuman Khandual 143f666ad41SAnshuman Khandual int show_ckpt_fpr(pid_t child, unsigned long *fpr) 144f666ad41SAnshuman Khandual { 145f666ad41SAnshuman Khandual struct fpr_regs *regs; 146f666ad41SAnshuman Khandual struct iovec iov; 147f666ad41SAnshuman Khandual int ret, i; 148f666ad41SAnshuman Khandual 149f666ad41SAnshuman Khandual regs = (struct fpr_regs *) malloc(sizeof(struct fpr_regs)); 150f666ad41SAnshuman Khandual iov.iov_base = regs; 151f666ad41SAnshuman Khandual iov.iov_len = sizeof(struct fpr_regs); 152f666ad41SAnshuman Khandual 153f666ad41SAnshuman Khandual ret = ptrace(PTRACE_GETREGSET, child, NT_PPC_TM_CFPR, &iov); 154f666ad41SAnshuman Khandual if (ret) { 155f666ad41SAnshuman Khandual perror("ptrace(PTRACE_GETREGSET) failed"); 156f666ad41SAnshuman Khandual return TEST_FAIL; 157f666ad41SAnshuman Khandual } 158f666ad41SAnshuman Khandual 159f666ad41SAnshuman Khandual if (fpr) { 160f666ad41SAnshuman Khandual for (i = 0; i < 32; i++) 161f666ad41SAnshuman Khandual fpr[i] = regs->fpr[i]; 162f666ad41SAnshuman Khandual } 163f666ad41SAnshuman Khandual 164f666ad41SAnshuman Khandual return TEST_PASS; 165f666ad41SAnshuman Khandual } 166f666ad41SAnshuman Khandual 167f666ad41SAnshuman Khandual int write_ckpt_fpr(pid_t child, unsigned long val) 168f666ad41SAnshuman Khandual { 169f666ad41SAnshuman Khandual struct fpr_regs *regs; 170f666ad41SAnshuman Khandual struct iovec iov; 171f666ad41SAnshuman Khandual int ret, i; 172f666ad41SAnshuman Khandual 173f666ad41SAnshuman Khandual regs = (struct fpr_regs *) malloc(sizeof(struct fpr_regs)); 174f666ad41SAnshuman Khandual iov.iov_base = regs; 175f666ad41SAnshuman Khandual iov.iov_len = sizeof(struct fpr_regs); 176f666ad41SAnshuman Khandual 177f666ad41SAnshuman Khandual ret = ptrace(PTRACE_GETREGSET, child, NT_PPC_TM_CFPR, &iov); 178f666ad41SAnshuman Khandual if (ret) { 179f666ad41SAnshuman Khandual perror("ptrace(PTRACE_GETREGSET) failed"); 180f666ad41SAnshuman Khandual return TEST_FAIL; 181f666ad41SAnshuman Khandual } 182f666ad41SAnshuman Khandual 183f666ad41SAnshuman Khandual for (i = 0; i < 32; i++) 184f666ad41SAnshuman Khandual regs->fpr[i] = val; 185f666ad41SAnshuman Khandual 186f666ad41SAnshuman Khandual ret = ptrace(PTRACE_SETREGSET, child, NT_PPC_TM_CFPR, &iov); 187f666ad41SAnshuman Khandual if (ret) { 188f666ad41SAnshuman Khandual perror("ptrace(PTRACE_GETREGSET) failed"); 189f666ad41SAnshuman Khandual return TEST_FAIL; 190f666ad41SAnshuman Khandual } 191f666ad41SAnshuman Khandual return TEST_PASS; 192f666ad41SAnshuman Khandual } 193f666ad41SAnshuman Khandual 194f666ad41SAnshuman Khandual /* GPR */ 195f666ad41SAnshuman Khandual int show_gpr(pid_t child, unsigned long *gpr) 196f666ad41SAnshuman Khandual { 197f666ad41SAnshuman Khandual struct pt_regs *regs; 198f666ad41SAnshuman Khandual int ret, i; 199f666ad41SAnshuman Khandual 200f666ad41SAnshuman Khandual regs = (struct pt_regs *) malloc(sizeof(struct pt_regs)); 201f666ad41SAnshuman Khandual if (!regs) { 202f666ad41SAnshuman Khandual perror("malloc() failed"); 203f666ad41SAnshuman Khandual return TEST_FAIL; 204f666ad41SAnshuman Khandual } 205f666ad41SAnshuman Khandual 206f666ad41SAnshuman Khandual ret = ptrace(PTRACE_GETREGS, child, NULL, regs); 207f666ad41SAnshuman Khandual if (ret) { 208f666ad41SAnshuman Khandual perror("ptrace(PTRACE_GETREGSET) failed"); 209f666ad41SAnshuman Khandual return TEST_FAIL; 210f666ad41SAnshuman Khandual } 211f666ad41SAnshuman Khandual 212f666ad41SAnshuman Khandual if (gpr) { 213f666ad41SAnshuman Khandual for (i = 14; i < 32; i++) 214f666ad41SAnshuman Khandual gpr[i-14] = regs->gpr[i]; 215f666ad41SAnshuman Khandual } 216f666ad41SAnshuman Khandual 217f666ad41SAnshuman Khandual return TEST_PASS; 218f666ad41SAnshuman Khandual } 219f666ad41SAnshuman Khandual 220f666ad41SAnshuman Khandual int write_gpr(pid_t child, unsigned long val) 221f666ad41SAnshuman Khandual { 222f666ad41SAnshuman Khandual struct pt_regs *regs; 223f666ad41SAnshuman Khandual int i, ret; 224f666ad41SAnshuman Khandual 225f666ad41SAnshuman Khandual regs = (struct pt_regs *) malloc(sizeof(struct pt_regs)); 226f666ad41SAnshuman Khandual if (!regs) { 227f666ad41SAnshuman Khandual perror("malloc() failed"); 228f666ad41SAnshuman Khandual return TEST_FAIL; 229f666ad41SAnshuman Khandual } 230f666ad41SAnshuman Khandual 231f666ad41SAnshuman Khandual ret = ptrace(PTRACE_GETREGS, child, NULL, regs); 232f666ad41SAnshuman Khandual if (ret) { 233f666ad41SAnshuman Khandual perror("ptrace(PTRACE_GETREGSET) failed"); 234f666ad41SAnshuman Khandual return TEST_FAIL; 235f666ad41SAnshuman Khandual } 236f666ad41SAnshuman Khandual 237f666ad41SAnshuman Khandual for (i = 14; i < 32; i++) 238f666ad41SAnshuman Khandual regs->gpr[i] = val; 239f666ad41SAnshuman Khandual 240f666ad41SAnshuman Khandual ret = ptrace(PTRACE_SETREGS, child, NULL, regs); 241f666ad41SAnshuman Khandual if (ret) { 242f666ad41SAnshuman Khandual perror("ptrace(PTRACE_GETREGSET) failed"); 243f666ad41SAnshuman Khandual return TEST_FAIL; 244f666ad41SAnshuman Khandual } 245f666ad41SAnshuman Khandual return TEST_PASS; 246f666ad41SAnshuman Khandual } 247f666ad41SAnshuman Khandual 248f666ad41SAnshuman Khandual int show_ckpt_gpr(pid_t child, unsigned long *gpr) 249f666ad41SAnshuman Khandual { 250f666ad41SAnshuman Khandual struct pt_regs *regs; 251f666ad41SAnshuman Khandual struct iovec iov; 252f666ad41SAnshuman Khandual int ret, i; 253f666ad41SAnshuman Khandual 254f666ad41SAnshuman Khandual regs = (struct pt_regs *) malloc(sizeof(struct pt_regs)); 255f666ad41SAnshuman Khandual if (!regs) { 256f666ad41SAnshuman Khandual perror("malloc() failed"); 257f666ad41SAnshuman Khandual return TEST_FAIL; 258f666ad41SAnshuman Khandual } 259f666ad41SAnshuman Khandual 260f666ad41SAnshuman Khandual iov.iov_base = (u64 *) regs; 261f666ad41SAnshuman Khandual iov.iov_len = sizeof(struct pt_regs); 262f666ad41SAnshuman Khandual 263f666ad41SAnshuman Khandual ret = ptrace(PTRACE_GETREGSET, child, NT_PPC_TM_CGPR, &iov); 264f666ad41SAnshuman Khandual if (ret) { 265f666ad41SAnshuman Khandual perror("ptrace(PTRACE_GETREGSET) failed"); 266f666ad41SAnshuman Khandual return TEST_FAIL; 267f666ad41SAnshuman Khandual } 268f666ad41SAnshuman Khandual 269f666ad41SAnshuman Khandual if (gpr) { 270f666ad41SAnshuman Khandual for (i = 14; i < 32; i++) 271f666ad41SAnshuman Khandual gpr[i-14] = regs->gpr[i]; 272f666ad41SAnshuman Khandual } 273f666ad41SAnshuman Khandual 274f666ad41SAnshuman Khandual return TEST_PASS; 275f666ad41SAnshuman Khandual } 276f666ad41SAnshuman Khandual 277f666ad41SAnshuman Khandual int write_ckpt_gpr(pid_t child, unsigned long val) 278f666ad41SAnshuman Khandual { 279f666ad41SAnshuman Khandual struct pt_regs *regs; 280f666ad41SAnshuman Khandual struct iovec iov; 281f666ad41SAnshuman Khandual int ret, i; 282f666ad41SAnshuman Khandual 283f666ad41SAnshuman Khandual regs = (struct pt_regs *) malloc(sizeof(struct pt_regs)); 284f666ad41SAnshuman Khandual if (!regs) { 285f666ad41SAnshuman Khandual perror("malloc() failed\n"); 286f666ad41SAnshuman Khandual return TEST_FAIL; 287f666ad41SAnshuman Khandual } 288f666ad41SAnshuman Khandual iov.iov_base = (u64 *) regs; 289f666ad41SAnshuman Khandual iov.iov_len = sizeof(struct pt_regs); 290f666ad41SAnshuman Khandual 291f666ad41SAnshuman Khandual ret = ptrace(PTRACE_GETREGSET, child, NT_PPC_TM_CGPR, &iov); 292f666ad41SAnshuman Khandual if (ret) { 293f666ad41SAnshuman Khandual perror("ptrace(PTRACE_GETREGSET) failed"); 294f666ad41SAnshuman Khandual return TEST_FAIL; 295f666ad41SAnshuman Khandual } 296f666ad41SAnshuman Khandual 297f666ad41SAnshuman Khandual for (i = 14; i < 32; i++) 298f666ad41SAnshuman Khandual regs->gpr[i] = val; 299f666ad41SAnshuman Khandual 300f666ad41SAnshuman Khandual ret = ptrace(PTRACE_SETREGSET, child, NT_PPC_TM_CGPR, &iov); 301f666ad41SAnshuman Khandual if (ret) { 302f666ad41SAnshuman Khandual perror("ptrace(PTRACE_GETREGSET) failed"); 303f666ad41SAnshuman Khandual return TEST_FAIL; 304f666ad41SAnshuman Khandual } 305f666ad41SAnshuman Khandual return TEST_PASS; 306f666ad41SAnshuman Khandual } 307f666ad41SAnshuman Khandual 308f666ad41SAnshuman Khandual /* Analyse TEXASR after TM failure */ 309f666ad41SAnshuman Khandual inline unsigned long get_tfiar(void) 310f666ad41SAnshuman Khandual { 311f666ad41SAnshuman Khandual unsigned long ret; 312f666ad41SAnshuman Khandual 313f666ad41SAnshuman Khandual asm volatile("mfspr %0,%1" : "=r" (ret) : "i" (SPRN_TFIAR)); 314f666ad41SAnshuman Khandual return ret; 315f666ad41SAnshuman Khandual } 316f666ad41SAnshuman Khandual 317f666ad41SAnshuman Khandual void analyse_texasr(unsigned long texasr) 318f666ad41SAnshuman Khandual { 319f666ad41SAnshuman Khandual printf("TEXASR: %16lx\t", texasr); 320f666ad41SAnshuman Khandual 321f666ad41SAnshuman Khandual if (texasr & TEXASR_FP) 322f666ad41SAnshuman Khandual printf("TEXASR_FP "); 323f666ad41SAnshuman Khandual 324f666ad41SAnshuman Khandual if (texasr & TEXASR_DA) 325f666ad41SAnshuman Khandual printf("TEXASR_DA "); 326f666ad41SAnshuman Khandual 327f666ad41SAnshuman Khandual if (texasr & TEXASR_NO) 328f666ad41SAnshuman Khandual printf("TEXASR_NO "); 329f666ad41SAnshuman Khandual 330f666ad41SAnshuman Khandual if (texasr & TEXASR_FO) 331f666ad41SAnshuman Khandual printf("TEXASR_FO "); 332f666ad41SAnshuman Khandual 333f666ad41SAnshuman Khandual if (texasr & TEXASR_SIC) 334f666ad41SAnshuman Khandual printf("TEXASR_SIC "); 335f666ad41SAnshuman Khandual 336f666ad41SAnshuman Khandual if (texasr & TEXASR_NTC) 337f666ad41SAnshuman Khandual printf("TEXASR_NTC "); 338f666ad41SAnshuman Khandual 339f666ad41SAnshuman Khandual if (texasr & TEXASR_TC) 340f666ad41SAnshuman Khandual printf("TEXASR_TC "); 341f666ad41SAnshuman Khandual 342f666ad41SAnshuman Khandual if (texasr & TEXASR_TIC) 343f666ad41SAnshuman Khandual printf("TEXASR_TIC "); 344f666ad41SAnshuman Khandual 345f666ad41SAnshuman Khandual if (texasr & TEXASR_IC) 346f666ad41SAnshuman Khandual printf("TEXASR_IC "); 347f666ad41SAnshuman Khandual 348f666ad41SAnshuman Khandual if (texasr & TEXASR_IFC) 349f666ad41SAnshuman Khandual printf("TEXASR_IFC "); 350f666ad41SAnshuman Khandual 351f666ad41SAnshuman Khandual if (texasr & TEXASR_ABT) 352f666ad41SAnshuman Khandual printf("TEXASR_ABT "); 353f666ad41SAnshuman Khandual 354f666ad41SAnshuman Khandual if (texasr & TEXASR_SPD) 355f666ad41SAnshuman Khandual printf("TEXASR_SPD "); 356f666ad41SAnshuman Khandual 357f666ad41SAnshuman Khandual if (texasr & TEXASR_HV) 358f666ad41SAnshuman Khandual printf("TEXASR_HV "); 359f666ad41SAnshuman Khandual 360f666ad41SAnshuman Khandual if (texasr & TEXASR_PR) 361f666ad41SAnshuman Khandual printf("TEXASR_PR "); 362f666ad41SAnshuman Khandual 363f666ad41SAnshuman Khandual if (texasr & TEXASR_FS) 364f666ad41SAnshuman Khandual printf("TEXASR_FS "); 365f666ad41SAnshuman Khandual 366f666ad41SAnshuman Khandual if (texasr & TEXASR_TE) 367f666ad41SAnshuman Khandual printf("TEXASR_TE "); 368f666ad41SAnshuman Khandual 369f666ad41SAnshuman Khandual if (texasr & TEXASR_ROT) 370f666ad41SAnshuman Khandual printf("TEXASR_ROT "); 371f666ad41SAnshuman Khandual 372f666ad41SAnshuman Khandual printf("TFIAR :%lx\n", get_tfiar()); 373f666ad41SAnshuman Khandual } 374f666ad41SAnshuman Khandual 375f666ad41SAnshuman Khandual void store_gpr(unsigned long *addr); 376f666ad41SAnshuman Khandual void store_fpr(float *addr); 377