[OpenBIOS] [commit] r1018 - in trunk/openbios-devel/arch: ppc ppc/qemu ppc64/qemu

repository service svn at openbios.org
Sun Jan 30 14:07:41 CET 2011


Author: blueswirl
Date: Sun Jan 30 14:07:40 2011
New Revision: 1018
URL: http://tracker.coreboot.org/trac/openbios/changeset/1018

Log:
ppc: avoid runtime relocations

Because the sizes of cells and pointers do not match on PPC64,
relocations of an ucell array using the address of the array itself
can't be computed by the linker.

Use a fixed address on PPC64 for the array, so we can use a fixed
ucell sized constant for the relocation offset.

Signed-off-by: Blue Swirl <blauwirbel at gmail.com>

Modified:
   trunk/openbios-devel/arch/ppc/build.xml
   trunk/openbios-devel/arch/ppc/qemu/kernel.c
   trunk/openbios-devel/arch/ppc/qemu/ofmem.c
   trunk/openbios-devel/arch/ppc64/qemu/ldscript

Modified: trunk/openbios-devel/arch/ppc/build.xml
==============================================================================
--- trunk/openbios-devel/arch/ppc/build.xml	Sun Jan 30 14:07:37 2011	(r1017)
+++ trunk/openbios-devel/arch/ppc/build.xml	Sun Jan 30 14:07:40 2011	(r1018)
@@ -60,11 +60,7 @@
 
  <executable name="target/include/qemu-dict.h" target="target" condition="QEMU">
   <rule><![CDATA[
-	$(call quiet-command,true, "  GEN   $(TARGET_DIR)$@")
-	@echo "static const char forth_dictionary[] = {" > $@
-	@cat $< | hexdump -ve '1/0 "\t" 8/1 "0x%02x, " 1/0 "\n"' \
-					| sed 's/0x  ,//g' >> $@
-	@echo "};" >> $@]]></rule>
+	$(call quiet-command,$(ODIR)/forthstrap -x -D $@ -d $< </dev/null, "  GEN   $(TARGET_DIR)$@")]]></rule>
   <external-object source="openbios-qemu.dict"/>
  </executable>
 

Modified: trunk/openbios-devel/arch/ppc/qemu/kernel.c
==============================================================================
--- trunk/openbios-devel/arch/ppc/qemu/kernel.c	Sun Jan 30 14:07:37 2011	(r1017)
+++ trunk/openbios-devel/arch/ppc/qemu/kernel.c	Sun Jan 30 14:07:40 2011	(r1018)
@@ -17,7 +17,6 @@
  *
  */
 
-#include "qemu-dict.h"
 #include "config.h"
 #include "dict.h"
 #include "libopenbios/bindings.h"
@@ -27,7 +26,19 @@
 #include "kernel.h"
 
 #define MEMORY_SIZE	(256*1024)	/* 256K ram for hosted system */
-#define DICTIONARY_SIZE	(512*1024)	/* 512K for the dictionary   */
+/* 512K for the dictionary  */
+#define DICTIONARY_SIZE (512 * 1024 / sizeof(ucell))
+#ifdef __powerpc64__
+#define DICTIONARY_BASE 0xfff08000 /* this must match the value in ldscript! */
+#define DICTIONARY_SECTION __attribute__((section(".data.dict")))
+#else
+#define DICTIONARY_BASE ((ucell)((char *)&forth_dictionary))
+#define DICTIONARY_SECTION
+#endif
+
+static ucell forth_dictionary[DICTIONARY_SIZE] DICTIONARY_SECTION = {
+#include "qemu-dict.h"
+};
 
 static ucell 		*memory;
 
@@ -82,10 +93,12 @@
 int
 initialize_forth( void )
 {
-	dict = malloc(DICTIONARY_SIZE);
-	dictlimit = DICTIONARY_SIZE;
+        dict = (unsigned char *)forth_dictionary;
+        dicthead = (ucell)FORTH_DICTIONARY_END;
+        last = (ucell *)((unsigned char *)forth_dictionary +
+                         FORTH_DICTIONARY_LAST);
+        dictlimit = sizeof(forth_dictionary);
 
-	load_dictionary( forth_dictionary, sizeof(forth_dictionary) );
 	forth_init();
 
 	PUSH_xt( bind_noname_func(arch_of_init) );

Modified: trunk/openbios-devel/arch/ppc/qemu/ofmem.c
==============================================================================
--- trunk/openbios-devel/arch/ppc/qemu/ofmem.c	Sun Jan 30 14:07:37 2011	(r1017)
+++ trunk/openbios-devel/arch/ppc/qemu/ofmem.c	Sun Jan 30 14:07:40 2011	(r1018)
@@ -55,7 +55,7 @@
 #define HASH_BITS		15
 #endif
 #define HASH_SIZE		(2 << HASH_BITS)
-#define OFMEM_SIZE		(2 * 1024 * 1024)
+#define OFMEM_SIZE		(1 * 1024 * 1024 + 512 * 1024)
 
 #define	SEGR_USER		BIT(2)
 #define SEGR_BASE		0x0400

Modified: trunk/openbios-devel/arch/ppc64/qemu/ldscript
==============================================================================
--- trunk/openbios-devel/arch/ppc64/qemu/ldscript	Sun Jan 30 14:07:37 2011	(r1017)
+++ trunk/openbios-devel/arch/ppc64/qemu/ldscript	Sun Jan 30 14:07:40 2011	(r1018)
@@ -6,6 +6,7 @@
 BASE_ADDR = 0xfff00000;
 
 /* As NVRAM is at 0xfff04000, the .text needs to be after that
+ * The value in arch/ppc/qemu/kernel.c must match this value!
  */
 TEXT_ADDR = 0xfff08000;
 
@@ -26,6 +27,12 @@
 
     . = TEXT_ADDR;
     /* Normal sections */
+    .data.dict ALIGN(4096): {
+        _dict_start = .;
+        *(.data.dict)
+        _dict_end = .;
+    }
+
     .text ALIGN(4096): {
         *(.text)
         *(.text.*)



More information about the OpenBIOS mailing list