[OpenBIOS] [FYI 2/2] ppc: ISI/DSI WIP
Andreas Färber
andreas.faerber at web.de
Tue Nov 16 00:39:13 CET 2010
Dereference function descriptors.
---
Just putting this out there. In addition to function descriptor deref
(still in need of macros like LOAD_REG_ADDR_IMMEDIATE and LOAD_REG_ADDR)
I checked whether it makes any difference whether we simulate the original
ba by a bctr - not noticably. Also FYI my unsuccessful ldscript attempts.
arch/ppc/qemu/start.S | 30 ++++++++++++++++++++++++++++++
arch/ppc64/qemu/ldscript | 43 +++++++++++++++++++++++++++++++++++++++++--
2 files changed, 71 insertions(+), 2 deletions(-)
diff --git a/arch/ppc/qemu/start.S b/arch/ppc/qemu/start.S
index 6cf20cf..1a63082 100644
--- a/arch/ppc/qemu/start.S
+++ b/arch/ppc/qemu/start.S
@@ -274,15 +274,33 @@ GLOBL(__vectors):
call_dsi_exception:
LOAD_REG_IMMEDIATE(r3, dsi_exception)
+#ifdef __powerpc64__
+ ld r3, 0(r3)
+#endif
mtctr r3
bctrl
+#if 1
+ LOAD_REG_IMMEDIATE(r3, exception_return)
+ mtctr r3
+ bctr
+#else
b exception_return
+#endif
call_isi_exception:
LOAD_REG_IMMEDIATE(r3, isi_exception)
+#ifdef __powerpc64__
+ ld r3, 0(r3)
+#endif
mtctr r3
bctrl
+#if 1
+ LOAD_REG_IMMEDIATE(r3, exception_return)
+ mtctr r3
+ bctr
+#else
b exception_return
+#endif
exception_return:
EXCEPTION_EPILOGUE
@@ -363,6 +381,12 @@ GLOBL(__vectors_end):
/* entry */
/************************************************************************/
+#ifdef __powerpc64__
+#define LOAD_REG_ADDR(reg, name) ld (reg), name at got(r2)
+#else
+#define LOAD_REG_ADDR(reg, name) LOAD_REG_IMMEDIATE(reg, name)
+#endif
+
GLOBL(_entry):
#ifdef CONFIG_PPC_64BITSUPPORT
@@ -448,7 +472,13 @@ GLOBL(_entry):
/* save memory size in stack */
bl setup_mmu
+#if 0
+ LOAD_REG_ADDR(r3, entry)
+ mtctr r3
+ bctrl
+#else
bl entry
+#endif
1: nop
b 1b
diff --git a/arch/ppc64/qemu/ldscript b/arch/ppc64/qemu/ldscript
index 1d8aa8e..2849a45 100644
--- a/arch/ppc64/qemu/ldscript
+++ b/arch/ppc64/qemu/ldscript
@@ -26,9 +26,41 @@ SECTIONS
. = TEXT_ADDR;
/* Normal sections */
+ .rela.dyn :
+ {
+ *(.rela.opd)
+ *(.rela.init)
+ *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*)
+ *(.rela.fini)
+ *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*)
+ *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*)
+ *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*)
+ *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*)
+ *(.rela.ctors)
+ *(.rela.dtors)
+ *(.rela.got)
+ *(.rela.toc)
+ *(.rela.branch_lt)
+ *(.rela.sdata .rela.sdata.* .rela.gnu.linkonce.s.*)
+ *(.rela.sbss .rela.sbss.* .rela.gnu.linkonce.sb.*)
+ *(.rela.sdata2 .rela.sdata2.* .rela.gnu.linkonce.s2.*)
+ *(.rela.sbss2 .rela.sbss2.* .rela.gnu.linkonce.sb2.*)
+ *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*)
+ PROVIDE_HIDDEN (__rel_iplt_start = .);
+ PROVIDE_HIDDEN (__rel_iplt_end = .);
+ PROVIDE_HIDDEN (__rela_iplt_start = .);
+ *(.rela.iplt)
+ PROVIDE_HIDDEN (__rela_iplt_end = .);
+ }
+ .rela.plt :
+ {
+ *(.rela.plt)
+ }
+ .rela.tocbss : { *(.rela.tocbss) }
.text ALIGN(4096): {
*(.text)
*(.text.*)
+ *(.sfpr .glink)
}
.rodata ALIGN(4096): {
@@ -41,13 +73,20 @@ SECTIONS
_data = .;
*(.data)
*(.data.*)
- _edata = .;
}
+ .data1 : { *(.data1) }
+ .toc1 : ALIGN(8) { *(.toc1) }
+ .opd : ALIGN(8) { KEEP (*(.opd)) }
+ .got : ALIGN(8) { *(.got .toc) }
+ _edata = .;
- .bss ALIGN(4096): {
_bss = .;
+ .tocbss : ALIGN(8) { *(.tocbss) }
+ .bss ALIGN(4096): {
*(.sbss)
*(.sbss.*)
+ *(.plt)
+ *(.iplt)
*(.bss)
*(.bss.*)
*(COMMON)
--
1.7.3
More information about the OpenBIOS
mailing list