1da0c48c4Sopenharmony_ci/* Register names and numbers for S/390 DWARF. 2da0c48c4Sopenharmony_ci Copyright (C) 2006 Red Hat, Inc. 3da0c48c4Sopenharmony_ci This file is part of elfutils. 4da0c48c4Sopenharmony_ci 5da0c48c4Sopenharmony_ci This file is free software; you can redistribute it and/or modify 6da0c48c4Sopenharmony_ci it under the terms of either 7da0c48c4Sopenharmony_ci 8da0c48c4Sopenharmony_ci * the GNU Lesser General Public License as published by the Free 9da0c48c4Sopenharmony_ci Software Foundation; either version 3 of the License, or (at 10da0c48c4Sopenharmony_ci your option) any later version 11da0c48c4Sopenharmony_ci 12da0c48c4Sopenharmony_ci or 13da0c48c4Sopenharmony_ci 14da0c48c4Sopenharmony_ci * the GNU General Public License as published by the Free 15da0c48c4Sopenharmony_ci Software Foundation; either version 2 of the License, or (at 16da0c48c4Sopenharmony_ci your option) any later version 17da0c48c4Sopenharmony_ci 18da0c48c4Sopenharmony_ci or both in parallel, as here. 19da0c48c4Sopenharmony_ci 20da0c48c4Sopenharmony_ci elfutils is distributed in the hope that it will be useful, but 21da0c48c4Sopenharmony_ci WITHOUT ANY WARRANTY; without even the implied warranty of 22da0c48c4Sopenharmony_ci MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 23da0c48c4Sopenharmony_ci General Public License for more details. 24da0c48c4Sopenharmony_ci 25da0c48c4Sopenharmony_ci You should have received copies of the GNU General Public License and 26da0c48c4Sopenharmony_ci the GNU Lesser General Public License along with this program. If 27da0c48c4Sopenharmony_ci not, see <http://www.gnu.org/licenses/>. */ 28da0c48c4Sopenharmony_ci 29da0c48c4Sopenharmony_ci#ifdef HAVE_CONFIG_H 30da0c48c4Sopenharmony_ci# include <config.h> 31da0c48c4Sopenharmony_ci#endif 32da0c48c4Sopenharmony_ci 33da0c48c4Sopenharmony_ci#include <string.h> 34da0c48c4Sopenharmony_ci#include <dwarf.h> 35da0c48c4Sopenharmony_ci 36da0c48c4Sopenharmony_ci#define BACKEND s390_ 37da0c48c4Sopenharmony_ci#include "libebl_CPU.h" 38da0c48c4Sopenharmony_ci 39da0c48c4Sopenharmony_ci 40da0c48c4Sopenharmony_ci/* 41da0c48c4Sopenharmony_cizseries (64) 42da0c48c4Sopenharmony_ci 43da0c48c4Sopenharmony_ci0-15 gpr0-gpr15 x 44da0c48c4Sopenharmony_ci16-19 fpr[0246] 45da0c48c4Sopenharmony_ci20-24 fpr[13578] 46da0c48c4Sopenharmony_ci25-27 fpr1[024] 47da0c48c4Sopenharmony_ci28 fpr9 48da0c48c4Sopenharmony_ci29-31 fpr1[135] 49da0c48c4Sopenharmony_ci32-47 cr0-cr15 x 50da0c48c4Sopenharmony_ci48-63 ar0-ar15 x 51da0c48c4Sopenharmony_ci64 psw_mask 52da0c48c4Sopenharmony_ci65 psw_address 53da0c48c4Sopenharmony_ci*/ 54da0c48c4Sopenharmony_ci 55da0c48c4Sopenharmony_ci 56da0c48c4Sopenharmony_cissize_t 57da0c48c4Sopenharmony_cis390_register_info (Ebl *ebl __attribute__ ((unused)), 58da0c48c4Sopenharmony_ci int regno, char *name, size_t namelen, 59da0c48c4Sopenharmony_ci const char **prefix, const char **setname, 60da0c48c4Sopenharmony_ci int *bits, int *type) 61da0c48c4Sopenharmony_ci{ 62da0c48c4Sopenharmony_ci if (name == NULL) 63da0c48c4Sopenharmony_ci return 66; 64da0c48c4Sopenharmony_ci 65da0c48c4Sopenharmony_ci if (regno < 0 || regno > 65 || namelen < 7) 66da0c48c4Sopenharmony_ci return -1; 67da0c48c4Sopenharmony_ci 68da0c48c4Sopenharmony_ci *prefix = "%"; 69da0c48c4Sopenharmony_ci 70da0c48c4Sopenharmony_ci *bits = ebl->class == ELFCLASS64 ? 64 : 32; 71da0c48c4Sopenharmony_ci *type = DW_ATE_unsigned; 72da0c48c4Sopenharmony_ci if (regno < 16) 73da0c48c4Sopenharmony_ci { 74da0c48c4Sopenharmony_ci *setname = "integer"; 75da0c48c4Sopenharmony_ci *type = DW_ATE_signed; 76da0c48c4Sopenharmony_ci } 77da0c48c4Sopenharmony_ci else if (regno < 32) 78da0c48c4Sopenharmony_ci { 79da0c48c4Sopenharmony_ci *setname = "FPU"; 80da0c48c4Sopenharmony_ci *type = DW_ATE_float; 81da0c48c4Sopenharmony_ci *bits = 64; 82da0c48c4Sopenharmony_ci } 83da0c48c4Sopenharmony_ci else if (regno < 48 || regno > 63) 84da0c48c4Sopenharmony_ci *setname = "control"; 85da0c48c4Sopenharmony_ci else 86da0c48c4Sopenharmony_ci { 87da0c48c4Sopenharmony_ci *setname = "access"; 88da0c48c4Sopenharmony_ci *bits = 32; 89da0c48c4Sopenharmony_ci } 90da0c48c4Sopenharmony_ci 91da0c48c4Sopenharmony_ci switch (regno) 92da0c48c4Sopenharmony_ci { 93da0c48c4Sopenharmony_ci case 0 ... 9: 94da0c48c4Sopenharmony_ci name[0] = 'r'; 95da0c48c4Sopenharmony_ci name[1] = regno + '0'; 96da0c48c4Sopenharmony_ci namelen = 2; 97da0c48c4Sopenharmony_ci break; 98da0c48c4Sopenharmony_ci 99da0c48c4Sopenharmony_ci case 10 ... 15: 100da0c48c4Sopenharmony_ci name[0] = 'r'; 101da0c48c4Sopenharmony_ci name[1] = '1'; 102da0c48c4Sopenharmony_ci name[2] = regno - 10 + '0'; 103da0c48c4Sopenharmony_ci namelen = 3; 104da0c48c4Sopenharmony_ci break; 105da0c48c4Sopenharmony_ci 106da0c48c4Sopenharmony_ci case 16 ... 31: 107da0c48c4Sopenharmony_ci name[0] = 'f'; 108da0c48c4Sopenharmony_ci regno = (regno & 8) | ((regno & 4) >> 2) | ((regno & 3) << 1); 109da0c48c4Sopenharmony_ci namelen = 1; 110da0c48c4Sopenharmony_ci if (regno >= 10) 111da0c48c4Sopenharmony_ci { 112da0c48c4Sopenharmony_ci regno -= 10; 113da0c48c4Sopenharmony_ci name[namelen++] = '1'; 114da0c48c4Sopenharmony_ci } 115da0c48c4Sopenharmony_ci name[namelen++] = regno + '0'; 116da0c48c4Sopenharmony_ci break; 117da0c48c4Sopenharmony_ci 118da0c48c4Sopenharmony_ci case 32 + 0 ... 32 + 9: 119da0c48c4Sopenharmony_ci case 48 + 0 ... 48 + 9: 120da0c48c4Sopenharmony_ci name[0] = regno < 48 ? 'c' : 'a'; 121da0c48c4Sopenharmony_ci name[1] = (regno & 15) + '0'; 122da0c48c4Sopenharmony_ci namelen = 2; 123da0c48c4Sopenharmony_ci break; 124da0c48c4Sopenharmony_ci 125da0c48c4Sopenharmony_ci case 32 + 10 ... 32 + 15: 126da0c48c4Sopenharmony_ci case 48 + 10 ... 48 + 15: 127da0c48c4Sopenharmony_ci name[0] = regno < 48 ? 'c' : 'a'; 128da0c48c4Sopenharmony_ci name[1] = '1'; 129da0c48c4Sopenharmony_ci name[2] = (regno & 15) - 10 + '0'; 130da0c48c4Sopenharmony_ci namelen = 3; 131da0c48c4Sopenharmony_ci break; 132da0c48c4Sopenharmony_ci 133da0c48c4Sopenharmony_ci case 64: 134da0c48c4Sopenharmony_ci return stpcpy (name, "pswm") + 1 - name; 135da0c48c4Sopenharmony_ci case 65: 136da0c48c4Sopenharmony_ci *type = DW_ATE_address; 137da0c48c4Sopenharmony_ci return stpcpy (name, "pswa") + 1 - name; 138da0c48c4Sopenharmony_ci 139da0c48c4Sopenharmony_ci default: 140da0c48c4Sopenharmony_ci *setname = NULL; 141da0c48c4Sopenharmony_ci return 0; 142da0c48c4Sopenharmony_ci } 143da0c48c4Sopenharmony_ci 144da0c48c4Sopenharmony_ci name[namelen++] = '\0'; 145da0c48c4Sopenharmony_ci return namelen; 146da0c48c4Sopenharmony_ci} 147