aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ld/ChangeLog7
-rw-r--r--ld/scripttempl/pru.sc6
-rw-r--r--ld/testsuite/ld-pru/pru_irq_map-1.d17
-rw-r--r--ld/testsuite/ld-pru/pru_irq_map-2.d10
-rw-r--r--ld/testsuite/ld-pru/pru_irq_map.s20
5 files changed, 60 insertions, 0 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index cd73230..7795217 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,10 @@
+2021-11-30 Nick Clifton <nickc@redhat.com>
+
+ * scripttempl/pru.sc (.pru_irq_map): Define output section.
+ * testsuite/ld-pru/pru_irq_map-1.d: New test.
+ * testsuite/ld-pru/pru_irq_map-2.d: New test.
+ * testsuite/ld-pru/pru_irq_map.s: New test.
+
2021-11-17 Jeremy Drake <cygwin@jdrake.com>
* emultempl/pep.em (DEFAULT_DLL_CHARACTERISTICS): Set to 0 for
diff --git a/ld/scripttempl/pru.sc b/ld/scripttempl/pru.sc
index 97d8be0..56d07be 100644
--- a/ld/scripttempl/pru.sc
+++ b/ld/scripttempl/pru.sc
@@ -183,6 +183,12 @@ SECTIONS
${RELOCATING+ . += __STACK_SIZE ; }
} ${RELOCATING+ > dmem}
+ /* Remoteproc loader in Linux kernel 5.10 and later reads this section
+ to setup the PRUSS interrupt controller. The interrupt map section
+ is never referenced from PRU firmware, so there is no need to
+ place it in the target dmem memory. */
+ .pru_irq_map 0 : { *(.pru_irq_map) }
+
/* Stabs debugging sections. */
.stab 0 : { *(.stab) }
.stabstr 0 : { *(.stabstr) }
diff --git a/ld/testsuite/ld-pru/pru_irq_map-1.d b/ld/testsuite/ld-pru/pru_irq_map-1.d
new file mode 100644
index 0000000..bbdf5b6
--- /dev/null
+++ b/ld/testsuite/ld-pru/pru_irq_map-1.d
@@ -0,0 +1,17 @@
+#name: pru_irq_map special section for host
+#source: pru_irq_map.s
+#ld: --defsym=__HEAP_SIZE=0 --defsym=__STACK_SIZE=0
+#readelf: -l --wide
+
+# Ensure that .pru_irq_map section is not loaded into target memory.
+
+#...
+Program Headers:
+ +Type +Offset +VirtAddr +PhysAddr +FileSiz +MemSiz +Flg +Align
+ +LOAD +0x[0-9a-f]+ 0x0+ 0x0+ 0x0+8 0x0+8 RW 0x1
+ +LOAD +0x[0-9a-f]+ 0x20+ 0x20+ 0x0+4 0x0+4 R E 0x1
+
+ Section to Segment mapping:
+ +Segment Sections...
+ +00 +.data[ ]*
+ +01 +.text[ ]*
diff --git a/ld/testsuite/ld-pru/pru_irq_map-2.d b/ld/testsuite/ld-pru/pru_irq_map-2.d
new file mode 100644
index 0000000..3166595
--- /dev/null
+++ b/ld/testsuite/ld-pru/pru_irq_map-2.d
@@ -0,0 +1,10 @@
+#name: pru_irq_map special section for host
+#source: pru_irq_map.s
+#ld: --defsym=__HEAP_SIZE=0 --defsym=__STACK_SIZE=0
+#readelf: -S --wide
+
+# Ensure that .pru_irq_map section is present.
+
+#...
+ +\[[ 0-9]+\] +.pru_irq_map +PROGBITS +0+ +[0-9a-f]+ +0+5 +00 +0 +0 +1
+#...
diff --git a/ld/testsuite/ld-pru/pru_irq_map.s b/ld/testsuite/ld-pru/pru_irq_map.s
new file mode 100644
index 0000000..b38d037
--- /dev/null
+++ b/ld/testsuite/ld-pru/pru_irq_map.s
@@ -0,0 +1,20 @@
+
+ .text
+ .global _start
+_start:
+ nop
+
+ .data
+my_global_var:
+ .byte 10
+ .byte 11
+ .byte 12
+ .byte 13
+
+ .section .pru_irq_map,"",@progbits
+my_intc_map:
+ .byte 0
+ .byte 1
+ .byte 19
+ .byte 1
+ .byte 1