aboutsummaryrefslogtreecommitdiffstats
path: root/meta/recipes-devtools/elfutils/elfutils-0.160/arm_backend.diff
blob: c97c4e470d51b62387d9d4cf532b3a252d16ec21 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
From 0db1687eee0b4d16ccbc40db5a06b574fca6614c Mon Sep 17 00:00:00 2001
From: Hongxu Jia <hongxu.jia@windriver.com>
Date: Fri, 14 Nov 2014 15:25:42 +0800
Subject: [PATCH] Rebase arm_backend.diff from 0.159 to 0.160

Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
---
 backends/arm_init.c                 |  18 ++++-
 backends/arm_regs.c                 | 132 ++++++++++++++++++++++++++++++++++++
 backends/arm_retval.c               |  44 +++++++++++-
 backends/libebl_arm.h               |   9 +++
 libelf/elf.h                        |  11 +++
 tests/run-addrcfi.sh                |  93 ++++++++++++++++++++++++-
 tests/run-allregs.sh                |  95 +++++++++++++++++++++++++-
 tests/run-readelf-mixed-corenote.sh |  11 ++-
 8 files changed, 401 insertions(+), 12 deletions(-)
 create mode 100644 backends/libebl_arm.h

diff --git a/backends/arm_init.c b/backends/arm_init.c
index 3283c97..8b57d3f 100644
--- a/backends/arm_init.c
+++ b/backends/arm_init.c
@@ -35,21 +35,32 @@
 #define RELOC_PREFIX	R_ARM_
 #include "libebl_CPU.h"
 
+#include "libebl_arm.h"
+
 /* This defines the common reloc hooks based on arm_reloc.def.  */
 #include "common-reloc.c"
 
 
 const char *
 arm_init (elf, machine, eh, ehlen)
-     Elf *elf __attribute__ ((unused));
+     Elf *elf;
      GElf_Half machine __attribute__ ((unused));
      Ebl *eh;
      size_t ehlen;
 {
+  int soft_float = 0;
+
   /* Check whether the Elf_BH object has a sufficent size.  */
   if (ehlen < sizeof (Ebl))
     return NULL;
 
+  if (elf) {
+    GElf_Ehdr ehdr_mem;
+    GElf_Ehdr *ehdr = gelf_getehdr (elf, &ehdr_mem);
+    if (ehdr && (ehdr->e_flags & EF_ARM_SOFT_FLOAT))
+      soft_float = 1;
+  }
+
   /* We handle it.  */
   eh->name = "ARM";
   arm_init_reloc (eh);
@@ -61,7 +72,10 @@ arm_init (elf, machine, eh, ehlen)
   HOOK (eh, core_note);
   HOOK (eh, auxv_info);
   HOOK (eh, check_object_attribute);
-  HOOK (eh, return_value_location);
+  if (soft_float)
+    eh->return_value_location = arm_return_value_location_soft;
+  else
+    eh->return_value_location = arm_return_value_location_hard;
   HOOK (eh, abi_cfi);
   HOOK (eh, check_reloc_target_type);
 
diff --git a/backends/arm_regs.c b/backends/arm_regs.c
index 21c5ad3..4ee1039 100644
--- a/backends/arm_regs.c
+++ b/backends/arm_regs.c
@@ -31,6 +31,7 @@
 #endif
 
 #include <string.h>
+#include <stdio.h>
 #include <dwarf.h>
 
 #define BACKEND arm_
@@ -76,6 +77,9 @@ arm_register_info (Ebl *ebl __attribute__ ((unused)),
       break;
 
     case 16 + 0 ... 16 + 7:
+      /* AADWARF says that there are no registers in that range,
+       * but gcc maps FPA registers here
+       */
       regno += 96 - 16;
       /* Fall through.  */
     case 96 + 0 ... 96 + 7:
@@ -87,11 +91,139 @@ arm_register_info (Ebl *ebl __attribute__ ((unused)),
       namelen = 2;
       break;
 
+    case 64 + 0 ... 64 + 9:
+      *setname = "VFP";
+      *bits = 32;
+      *type = DW_ATE_float;
+      name[0] = 's';
+      name[1] = regno - 64 + '0';
+      namelen = 2;
+      break;
+
+    case 64 + 10 ... 64 + 31:
+      *setname = "VFP";
+      *bits = 32;
+      *type = DW_ATE_float;
+      name[0] = 's';
+      name[1] = (regno - 64) / 10 + '0';
+      name[2] = (regno - 64) % 10 + '0';
+      namelen = 3;
+      break;
+
+    case 104 + 0 ... 104 + 7:
+      /* XXX TODO:
+       * This can be either intel wireless MMX general purpose/control
+       * registers or xscale accumulator, which have different usage.
+       * We only have the intel wireless MMX here now.
+       * The name needs to be changed for the xscale accumulator too. */
+      *setname = "MMX";
+      *type = DW_ATE_unsigned;
+      *bits = 32;
+      memcpy(name, "wcgr", 4);
+      name[4] = regno - 104 + '0';
+      namelen = 5;
+      break;
+
+    case 112 + 0 ... 112 + 9:
+      *setname = "MMX";
+      *type = DW_ATE_unsigned;
+      *bits = 64;
+      name[0] = 'w';
+      name[1] = 'r';
+      name[2] = regno - 112 + '0';
+      namelen = 3;
+      break;
+
+    case 112 + 10 ... 112 + 15:
+      *setname = "MMX";
+      *type = DW_ATE_unsigned;
+      *bits = 64;
+      name[0] = 'w';
+      name[1] = 'r';
+      name[2] = '1';
+      name[3] = regno - 112 - 10 + '0';
+      namelen = 4;
+      break;
+
     case 128:
+      *setname = "state";
       *type = DW_ATE_unsigned;
       return stpcpy (name, "spsr") + 1 - name;
 
+    case 129:
+      *setname = "state";
+      *type = DW_ATE_unsigned;
+      return stpcpy(name, "spsr_fiq") + 1 - name;
+
+    case 130:
+      *setname = "state";
+      *type = DW_ATE_unsigned;
+      return stpcpy(name, "spsr_irq") + 1 - name;
+
+    case 131:
+      *setname = "state";
+      *type = DW_ATE_unsigned;
+      return stpcpy(name, "spsr_abt") + 1 - name;
+
+    case 132:
+      *setname = "state";
+      *type = DW_ATE_unsigned;
+      return stpcpy(name, "spsr_und") + 1 - name;
+
+    case 133:
+      *setname = "state";
+      *type = DW_ATE_unsigned;
+      return stpcpy(name, "spsr_svc") + 1 - name;
+
+    case 144 ... 150:
+      *setname = "integer";
+      *type = DW_ATE_signed;
+      *bits = 32;
+      return sprintf(name, "r%d_usr", regno - 144 + 8) + 1;
+
+    case 151 ... 157:
+      *setname = "integer";
+      *type = DW_ATE_signed;
+      *bits = 32;
+      return sprintf(name, "r%d_fiq", regno - 151 + 8) + 1;
+
+    case 158 ... 159:
+      *setname = "integer";
+      *type = DW_ATE_signed;
+      *bits = 32;
+      return sprintf(name, "r%d_irq", regno - 158 + 13) + 1;
+
+    case 160 ... 161:
+      *setname = "integer";
+      *type = DW_ATE_signed;
+      *bits = 32;
+      return sprintf(name, "r%d_abt", regno - 160 + 13) + 1;
+
+    case 162 ... 163:
+      *setname = "integer";
+      *type = DW_ATE_signed;
+      *bits = 32;
+      return sprintf(name, "r%d_und", regno - 162 + 13) + 1;
+
+    case 164 ... 165:
+      *setname = "integer";
+      *type = DW_ATE_signed;
+      *bits = 32;
+      return sprintf(name, "r%d_svc", regno - 164 + 13) + 1;
+
+    case 192 ... 199:
+     *setname = "MMX";
+      *bits = 32;
+      *type = DW_ATE_unsigned;
+      name[0] = 'w';
+      name[1] = 'c';
+      name[2] = regno - 192 + '0';
+      namelen = 3;
+      break;
+
     case 256 + 0 ... 256 + 9:
+      /* XXX TODO: Neon also uses those registers and can contain
+       * both float and integers */
       *setname = "VFP";
       *type = DW_ATE_float;
       *bits = 64;
diff --git a/backends/arm_retval.c b/backends/arm_retval.c
index 7aced74..052132e 100644
--- a/backends/arm_retval.c
+++ b/backends/arm_retval.c
@@ -48,6 +48,13 @@ static const Dwarf_Op loc_intreg[] =
 #define nloc_intreg	1
 #define nloc_intregs(n)	(2 * (n))
 
+/* f1  */ /* XXX TODO: f0 can also have number 96 if program was compiled with -mabi=aapcs */
+static const Dwarf_Op loc_fpreg[] =
+  {
+    { .atom = DW_OP_reg16 },
+  };
+#define nloc_fpreg  1
+
 /* The return value is a structure and is actually stored in stack space
    passed in a hidden argument by the caller.  But, the compiler
    helpfully returns the address of that space in r0.  */
@@ -58,8 +65,9 @@ static const Dwarf_Op loc_aggregate[] =
 #define nloc_aggregate 1
 
 
-int
-arm_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
+static int
+arm_return_value_location_ (Dwarf_Die *functypedie, const Dwarf_Op **locp,
+		            int soft_float)
 {
   /* Start with the function's type, and get the DW_AT_type attribute,
      which is the type of the return value.  */
@@ -98,14 +106,31 @@ arm_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
 	    else
 	      return -1;
 	  }
+	if (tag == DW_TAG_base_type)
+	{
+	  Dwarf_Word encoding;
+	  if (dwarf_formudata (dwarf_attr_integrate (typedie, DW_AT_encoding,
+	                       &attr_mem), &encoding) != 0)
+	    return -1;
+
+	  if ((encoding == DW_ATE_float) && !soft_float)
+	    {
+	      *locp = loc_fpreg;
+	      if (size <= 8)
+		return nloc_fpreg;
+	      goto aggregate;
+	    }
+	}
 	if (size <= 16)
 	  {
 	  intreg:
 	    *locp = loc_intreg;
 	    return size <= 4 ? nloc_intreg : nloc_intregs ((size + 3) / 4);
 	  }
+	  /* fall through. */
 
       aggregate:
+	/* XXX TODO sometimes aggregates are returned in r0 (-mabi=aapcs) */
 	*locp = loc_aggregate;
 	return nloc_aggregate;
       }
@@ -125,3 +150,18 @@ arm_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
      DWARF and might be valid.  */
   return -2;
 }
+
+/* return location for -mabi=apcs-gnu -msoft-float */
+int
+arm_return_value_location_soft (Dwarf_Die *functypedie, const Dwarf_Op **locp)
+{
+   return arm_return_value_location_ (functypedie, locp, 1);
+}
+
+/* return location for -mabi=apcs-gnu -mhard-float (current default) */
+int
+arm_return_value_location_hard (Dwarf_Die *functypedie, const Dwarf_Op **locp)
+{
+   return arm_return_value_location_ (functypedie, locp, 0);
+}
+
diff --git a/backends/libebl_arm.h b/backends/libebl_arm.h
new file mode 100644
index 0000000..c00770c
--- /dev/null
+++ b/backends/libebl_arm.h
@@ -0,0 +1,9 @@
+#ifndef _LIBEBL_ARM_H
+#define _LIBEBL_ARM_H 1
+
+#include <libdw.h>
+
+extern int arm_return_value_location_soft(Dwarf_Die *, const Dwarf_Op **locp);
+extern int arm_return_value_location_hard(Dwarf_Die *, const Dwarf_Op **locp);
+
+#endif
diff --git a/libelf/elf.h b/libelf/elf.h
index a3cce3e..0891674 100644
--- a/libelf/elf.h
+++ b/libelf/elf.h
@@ -2346,6 +2346,9 @@ typedef Elf32_Addr Elf32_Conflict;
 #define EF_ARM_EABI_VER4	0x04000000
 #define EF_ARM_EABI_VER5	0x05000000
 
+/* EI_OSABI values */
+#define ELFOSABI_ARM_AEABI    64      /* Contains symbol versioning. */
+
 /* Additional symbol types for Thumb.  */
 #define STT_ARM_TFUNC		STT_LOPROC /* A Thumb function.  */
 #define STT_ARM_16BIT		STT_HIPROC /* A Thumb label.  */
@@ -2363,12 +2366,19 @@ typedef Elf32_Addr Elf32_Conflict;
 
 /* Processor specific values for the Phdr p_type field.  */
 #define PT_ARM_EXIDX		(PT_LOPROC + 1)	/* ARM unwind segment.  */
+#define PT_ARM_UNWIND		PT_ARM_EXIDX
 
 /* Processor specific values for the Shdr sh_type field.  */
 #define SHT_ARM_EXIDX		(SHT_LOPROC + 1) /* ARM unwind section.  */
 #define SHT_ARM_PREEMPTMAP	(SHT_LOPROC + 2) /* Preemption details.  */
 #define SHT_ARM_ATTRIBUTES	(SHT_LOPROC + 3) /* ARM attributes section.  */
 
+/* Processor specific values for the Dyn d_tag field.  */
+#define DT_ARM_RESERVED1	(DT_LOPROC + 0)
+#define DT_ARM_SYMTABSZ		(DT_LOPROC + 1)
+#define DT_ARM_PREEMTMAB	(DT_LOPROC + 2)
+#define DT_ARM_RESERVED2	(DT_LOPROC + 3)
+#define DT_ARM_NUM		4
 
 /* AArch64 relocs.  */
 
@@ -2647,6 +2657,7 @@ typedef Elf32_Addr Elf32_Conflict;
 					   TLS block (LDR, STR).  */
 #define R_ARM_TLS_IE12GP	111	/* 12 bit GOT entry relative
 					   to GOT origin (LDR).  */
+/* 112 - 127 private range */
 #define R_ARM_ME_TOO		128	/* Obsolete.  */
 #define R_ARM_THM_TLS_DESCSEQ	129
 #define R_ARM_THM_TLS_DESCSEQ16	129
diff --git a/tests/run-addrcfi.sh b/tests/run-addrcfi.sh
index 5d33246..78464a8 100755
--- a/tests/run-addrcfi.sh
+++ b/tests/run-addrcfi.sh
@@ -2530,6 +2530,38 @@ dwarf_cfi_addrframe (.eh_frame): no matching address range
 	FPA reg21 (f5): undefined
 	FPA reg22 (f6): undefined
 	FPA reg23 (f7): undefined
+	VFP reg64 (s0): undefined
+	VFP reg65 (s1): undefined
+	VFP reg66 (s2): undefined
+	VFP reg67 (s3): undefined
+	VFP reg68 (s4): undefined
+	VFP reg69 (s5): undefined
+	VFP reg70 (s6): undefined
+	VFP reg71 (s7): undefined
+	VFP reg72 (s8): undefined
+	VFP reg73 (s9): undefined
+	VFP reg74 (s10): undefined
+	VFP reg75 (s11): undefined
+	VFP reg76 (s12): undefined
+	VFP reg77 (s13): undefined
+	VFP reg78 (s14): undefined
+	VFP reg79 (s15): undefined
+	VFP reg80 (s16): undefined
+	VFP reg81 (s17): undefined
+	VFP reg82 (s18): undefined
+	VFP reg83 (s19): undefined
+	VFP reg84 (s20): undefined
+	VFP reg85 (s21): undefined
+	VFP reg86 (s22): undefined
+	VFP reg87 (s23): undefined
+	VFP reg88 (s24): undefined
+	VFP reg89 (s25): undefined
+	VFP reg90 (s26): undefined
+	VFP reg91 (s27): undefined
+	VFP reg92 (s28): undefined
+	VFP reg93 (s29): undefined
+	VFP reg94 (s30): undefined
+	VFP reg95 (s31): undefined
 	FPA reg96 (f0): undefined
 	FPA reg97 (f1): undefined
 	FPA reg98 (f2): undefined
@@ -2538,7 +2570,66 @@ dwarf_cfi_addrframe (.eh_frame): no matching address range
 	FPA reg101 (f5): undefined
 	FPA reg102 (f6): undefined
 	FPA reg103 (f7): undefined
-	integer reg128 (spsr): undefined
+	MMX reg104 (wcgr0): undefined
+	MMX reg105 (wcgr1): undefined
+	MMX reg106 (wcgr2): undefined
+	MMX reg107 (wcgr3): undefined
+	MMX reg108 (wcgr4): undefined
+	MMX reg109 (wcgr5): undefined
+	MMX reg110 (wcgr6): undefined
+	MMX reg111 (wcgr7): undefined
+	MMX reg112 (wr0): undefined
+	MMX reg113 (wr1): undefined
+	MMX reg114 (wr2): undefined
+	MMX reg115 (wr3): undefined
+	MMX reg116 (wr4): undefined
+	MMX reg117 (wr5): undefined
+	MMX reg118 (wr6): undefined
+	MMX reg119 (wr7): undefined
+	MMX reg120 (wr8): undefined
+	MMX reg121 (wr9): undefined
+	MMX reg122 (wr10): undefined
+	MMX reg123 (wr11): undefined
+	MMX reg124 (wr12): undefined
+	MMX reg125 (wr13): undefined
+	MMX reg126 (wr14): undefined
+	MMX reg127 (wr15): undefined
+	state reg128 (spsr): undefined
+	state reg129 (spsr_fiq): undefined
+	state reg130 (spsr_irq): undefined
+	state reg131 (spsr_abt): undefined
+	state reg132 (spsr_und): undefined
+	state reg133 (spsr_svc): undefined
+	integer reg144 (r8_usr): undefined
+	integer reg145 (r9_usr): undefined
+	integer reg146 (r10_usr): undefined
+	integer reg147 (r11_usr): undefined
+	integer reg148 (r12_usr): undefined
+	integer reg149 (r13_usr): undefined
+	integer reg150 (r14_usr): undefined
+	integer reg151 (r8_fiq): undefined
+	integer reg152 (r9_fiq): undefined
+	integer reg153 (r10_fiq): undefined
+	integer reg154 (r11_fiq): undefined
+	integer reg155 (r12_fiq): undefined
+	integer reg156 (r13_fiq): undefined
+	integer reg157 (r14_fiq): undefined
+	integer reg158 (r13_irq): undefined
+	integer reg159 (r14_irq): undefined
+	integer reg160 (r13_abt): undefined
+	integer reg161 (r14_abt): undefined
+	integer reg162 (r13_und): undefined
+	integer reg163 (r14_und): undefined
+	integer reg164 (r13_svc): undefined
+	integer reg165 (r14_svc): undefined
+	MMX reg192 (wc0): undefined
+	MMX reg193 (wc1): undefined
+	MMX reg194 (wc2): undefined
+	MMX reg195 (wc3): undefined
+	MMX reg196 (wc4): undefined
+	MMX reg197 (wc5): undefined
+	MMX reg198 (wc6): undefined
+	MMX reg199 (wc7): undefined
 	VFP reg256 (d0): undefined
 	VFP reg257 (d1): undefined
 	VFP reg258 (d2): undefined
diff --git a/tests/run-allregs.sh b/tests/run-allregs.sh
index 6f3862e..13557d5 100755
--- a/tests/run-allregs.sh
+++ b/tests/run-allregs.sh
@@ -2671,7 +2671,28 @@ integer registers:
 	 13: sp (sp), address 32 bits
 	 14: lr (lr), address 32 bits
 	 15: pc (pc), address 32 bits
-	128: spsr (spsr), unsigned 32 bits
+	144: r8_usr (r8_usr), signed 32 bits
+	145: r9_usr (r9_usr), signed 32 bits
+	146: r10_usr (r10_usr), signed 32 bits
+	147: r11_usr (r11_usr), signed 32 bits
+	148: r12_usr (r12_usr), signed 32 bits
+	149: r13_usr (r13_usr), signed 32 bits
+	150: r14_usr (r14_usr), signed 32 bits
+	151: r8_fiq (r8_fiq), signed 32 bits
+	152: r9_fiq (r9_fiq), signed 32 bits
+	153: r10_fiq (r10_fiq), signed 32 bits
+	154: r11_fiq (r11_fiq), signed 32 bits
+	155: r12_fiq (r12_fiq), signed 32 bits
+	156: r13_fiq (r13_fiq), signed 32 bits
+	157: r14_fiq (r14_fiq), signed 32 bits
+	158: r13_irq (r13_irq), signed 32 bits
+	159: r14_irq (r14_irq), signed 32 bits
+	160: r13_abt (r13_abt), signed 32 bits
+	161: r14_abt (r14_abt), signed 32 bits
+	162: r13_und (r13_und), signed 32 bits
+	163: r14_und (r14_und), signed 32 bits
+	164: r13_svc (r13_svc), signed 32 bits
+	165: r14_svc (r14_svc), signed 32 bits
 FPA registers:
 	 16: f0 (f0), float 96 bits
 	 17: f1 (f1), float 96 bits
@@ -2689,7 +2710,72 @@ FPA registers:
 	101: f5 (f5), float 96 bits
 	102: f6 (f6), float 96 bits
 	103: f7 (f7), float 96 bits
+MMX registers:
+	104: wcgr0 (wcgr0), unsigned 32 bits
+	105: wcgr1 (wcgr1), unsigned 32 bits
+	106: wcgr2 (wcgr2), unsigned 32 bits
+	107: wcgr3 (wcgr3), unsigned 32 bits
+	108: wcgr4 (wcgr4), unsigned 32 bits
+	109: wcgr5 (wcgr5), unsigned 32 bits
+	110: wcgr6 (wcgr6), unsigned 32 bits
+	111: wcgr7 (wcgr7), unsigned 32 bits
+	112: wr0 (wr0), unsigned 64 bits
+	113: wr1 (wr1), unsigned 64 bits
+	114: wr2 (wr2), unsigned 64 bits
+	115: wr3 (wr3), unsigned 64 bits
+	116: wr4 (wr4), unsigned 64 bits
+	117: wr5 (wr5), unsigned 64 bits
+	118: wr6 (wr6), unsigned 64 bits
+	119: wr7 (wr7), unsigned 64 bits
+	120: wr8 (wr8), unsigned 64 bits
+	121: wr9 (wr9), unsigned 64 bits
+	122: wr10 (wr10), unsigned 64 bits
+	123: wr11 (wr11), unsigned 64 bits
+	124: wr12 (wr12), unsigned 64 bits
+	125: wr13 (wr13), unsigned 64 bits
+	126: wr14 (wr14), unsigned 64 bits
+	127: wr15 (wr15), unsigned 64 bits
+	192: wc0 (wc0), unsigned 32 bits
+	193: wc1 (wc1), unsigned 32 bits
+	194: wc2 (wc2), unsigned 32 bits
+	195: wc3 (wc3), unsigned 32 bits
+	196: wc4 (wc4), unsigned 32 bits
+	197: wc5 (wc5), unsigned 32 bits
+	198: wc6 (wc6), unsigned 32 bits
+	199: wc7 (wc7), unsigned 32 bits
 VFP registers:
+	 64: s0 (s0), float 32 bits
+	 65: s1 (s1), float 32 bits
+	 66: s2 (s2), float 32 bits
+	 67: s3 (s3), float 32 bits
+	 68: s4 (s4), float 32 bits
+	 69: s5 (s5), float 32 bits
+	 70: s6 (s6), float 32 bits
+	 71: s7 (s7), float 32 bits
+	 72: s8 (s8), float 32 bits
+	 73: s9 (s9), float 32 bits
+	 74: s10 (s10), float 32 bits
+	 75: s11 (s11), float 32 bits
+	 76: s12 (s12), float 32 bits
+	 77: s13 (s13), float 32 bits
+	 78: s14 (s14), float 32 bits
+	 79: s15 (s15), float 32 bits
+	 80: s16 (s16), float 32 bits
+	 81: s17 (s17), float 32 bits
+	 82: s18 (s18), float 32 bits
+	 83: s19 (s19), float 32 bits
+	 84: s20 (s20), float 32 bits
+	 85: s21 (s21), float 32 bits
+	 86: s22 (s22), float 32 bits
+	 87: s23 (s23), float 32 bits
+	 88: s24 (s24), float 32 bits
+	 89: s25 (s25), float 32 bits
+	 90: s26 (s26), float 32 bits
+	 91: s27 (s27), float 32 bits
+	 92: s28 (s28), float 32 bits
+	 93: s29 (s29), float 32 bits
+	 94: s30 (s30), float 32 bits
+	 95: s31 (s31), float 32 bits
 	256: d0 (d0), float 64 bits
 	257: d1 (d1), float 64 bits
 	258: d2 (d2), float 64 bits
@@ -2722,6 +2808,13 @@ VFP registers:
 	285: d29 (d29), float 64 bits
 	286: d30 (d30), float 64 bits
 	287: d31 (d31), float 64 bits
+state registers:
+	128: spsr (spsr), unsigned 32 bits
+	129: spsr_fiq (spsr_fiq), unsigned 32 bits
+	130: spsr_irq (spsr_irq), unsigned 32 bits
+	131: spsr_abt (spsr_abt), unsigned 32 bits
+	132: spsr_und (spsr_und), unsigned 32 bits
+	133: spsr_svc (spsr_svc), unsigned 32 bits
 EOF
 
 # See run-readelf-mixed-corenote.sh for instructions to regenerate
diff --git a/tests/run-readelf-mixed-corenote.sh b/tests/run-readelf-mixed-corenote.sh
index 01e4594..9a8a380 100755
--- a/tests/run-readelf-mixed-corenote.sh
+++ b/tests/run-readelf-mixed-corenote.sh
@@ -30,12 +30,11 @@ Note segment of 892 bytes at offset 0x274:
     pid: 11087, ppid: 11063, pgrp: 11087, sid: 11063
     utime: 0.000000, stime: 0.010000, cutime: 0.000000, cstime: 0.000000
     orig_r0: -1, fpvalid: 1
-    r0:             1  r1:   -1091672508  r2:   -1091672500
-    r3:             0  r4:             0  r5:             0
-    r6:         33728  r7:             0  r8:             0
-    r9:             0  r10:  -1225703496  r11:  -1091672844
-    r12:            0  sp:    0xbeee64f4  lr:    0xb6dc3f48
-    pc:    0x00008500  spsr:  0x60000010
+    r0:            1  r1:  -1091672508  r2:  -1091672500  r3:            0
+    r4:            0  r5:            0  r6:        33728  r7:            0
+    r8:            0  r9:            0  r10: -1225703496  r11: -1091672844
+    r12:           0  sp:   0xbeee64f4  lr:   0xb6dc3f48  pc:   0x00008500
+    spsr:  0x60000010
   CORE                 124  PRPSINFO
     state: 0, sname: R, zomb: 0, nice: 0, flag: 0x00400500
     uid: 0, gid: 0, pid: 11087, ppid: 11063, pgrp: 11087, sid: 11063
-- 
1.9.1