[OpenBIOS] r68 - in openbios-devel: arch/sparc64 config/examples include/openbios include/sparc64 kernel

svn@openbios.org svn at openbios.org
Tue Jul 18 23:42:16 CEST 2006


Author: stepan
Date: 2006-07-18 23:42:16 +0200 (Tue, 18 Jul 2006)
New Revision: 68

Modified:
   openbios-devel/arch/sparc64/entry.S
   openbios-devel/arch/sparc64/openbios.c
   openbios-devel/config/examples/sparc64_rules.xml
   openbios-devel/include/openbios/stack.h
   openbios-devel/include/sparc64/io.h
   openbios-devel/include/sparc64/pci.h
   openbios-devel/include/sparc64/types.h
   openbios-devel/kernel/bootstrap.c
   openbios-devel/kernel/cross.h
   openbios-devel/kernel/dict.c
   openbios-devel/kernel/forth.c
   openbios-devel/kernel/stack.c
Log:
64-bit fixes

General 64-bit fixes and a hack for x86 to Sparc64 crosscompiling problem,
where x86 misses 128-bit types.



Modified: openbios-devel/arch/sparc64/entry.S
===================================================================
--- openbios-devel/arch/sparc64/entry.S	2006-07-18 21:38:42 UTC (rev 67)
+++ openbios-devel/arch/sparc64/entry.S	2006-07-18 21:42:16 UTC (rev 68)
@@ -35,6 +35,7 @@
         ! Extract NWINDOWS from %ver
         rdpr    %ver, %g1
         and     %g1, 0xf, %g1
+        dec     %g1
         wrpr    %g1, 0, %cleanwin
         wrpr    %g1, 0, %cansave
         wrpr    %g0, 0, %canrestore
@@ -102,9 +103,9 @@
 	bne	1b
 	 nop
 
-	! setup .rodata
+	! setup .rodata, also make .text readable
 	setx	_data, %g7, %g5
-	setx	_rodata, %g7, %g4
+	setx	_start, %g7, %g4
         sub     %g5, %g4, %g5
         srlx    %g5, 16, %g6			! %g6 = # of 64k .rodata pages
 	set	48, %g7

Modified: openbios-devel/arch/sparc64/openbios.c
===================================================================
--- openbios-devel/arch/sparc64/openbios.c	2006-07-18 21:38:42 UTC (rev 67)
+++ openbios-devel/arch/sparc64/openbios.c	2006-07-18 21:42:16 UTC (rev 68)
@@ -49,8 +49,8 @@
 	 * than that we have serious bloat.
 	 */
 
-	PUSH((unsigned int)&_heap);
-	PUSH((unsigned int)&_eheap);
+	PUSH((ucell)&_heap);
+	PUSH((ucell)&_eheap);
 }
 
 static void
@@ -128,6 +128,5 @@
 #endif
 
 	enterforth((xt_t)PC);
-
 	return 0;
 }

Modified: openbios-devel/config/examples/sparc64_rules.xml
===================================================================
--- openbios-devel/config/examples/sparc64_rules.xml	2006-07-18 21:38:42 UTC (rev 67)
+++ openbios-devel/config/examples/sparc64_rules.xml	2006-07-18 21:42:16 UTC (rev 68)
@@ -10,6 +10,9 @@
 ODIR := obj-$(ARCH)
 HOSTCC := gcc
 HOSTCFLAGS := -O2 -g -Wall -W -DFCOMPILER -DBOOTSTRAP $(CROSSCFLAGS)
+HOSTCFLAGS+= -Wa,-xarch=v9 -Wa,-64 -m64 -mcpu=ultrasparc -mcmodel=medany
+HOSTCFLAGS+= -Wredundant-decls -Wshadow -Wpointer-arith -Wstrict-prototypes -Wmissing-declarations
+HOSTCFLAGS+= -Wundef -Wendif-labels -Wstrict-aliasing
 HOSTINCLUDES := -Iinclude -Ikernel/include -I$(ODIR)/target/include
 
 CC := gcc

Modified: openbios-devel/include/openbios/stack.h
===================================================================
--- openbios-devel/include/openbios/stack.h	2006-07-18 21:38:42 UTC (rev 67)
+++ openbios-devel/include/openbios/stack.h	2006-07-18 21:42:16 UTC (rev 68)
@@ -52,15 +52,27 @@
 }
 
 static inline void DPUSH(ducell value) {
+#ifdef NEED_FAKE_INT128_T
+	dstack[++dstackcnt] = (cell) value.lo;
+	dstack[++dstackcnt] = (cell) value.hi;
+#else
 	dstack[++dstackcnt] = (cell) value;
 	dstack[++dstackcnt] = (cell) (value >> bitspercell);
+#endif
 }
 
 static inline ducell DPOP(void) {
+#ifdef NEED_FAKE_INT128_T
 	ducell du;
+	du.hi = (ucell) dstack[dstackcnt--];
+	du.lo = (ucell) dstack[dstackcnt--];
+	return du;
+#else
+	ducell du;
 	du = ((ducell) ((ucell) dstack[dstackcnt--]) << bitspercell);
 	du |= (ucell) dstack[dstackcnt--];
 	return du;
+#endif
 }
 
 static inline ucell GETTOS(void) {

Modified: openbios-devel/include/sparc64/io.h
===================================================================
--- openbios-devel/include/sparc64/io.h	2006-07-18 21:38:42 UTC (rev 67)
+++ openbios-devel/include/sparc64/io.h	2006-07-18 21:42:16 UTC (rev 68)
@@ -74,13 +74,15 @@
 
 static inline int in_le16(volatile unsigned short *addr)
 {
-    int ret;
+    int ret, tmp;
 
     // XXX
     __asm__ __volatile__("lduha [%1] 0x15, %0\n\t"
                          :"=r"(ret):"r"(addr):"memory");
 
-    return ret;
+    tmp = (ret << 8) & 0xff00;
+    tmp |= (ret >> 8) & 0xff;
+    return tmp;
 }
 
 static inline int in_be16(volatile unsigned short *addr)
@@ -95,9 +97,13 @@
 
 static inline void out_le16(volatile unsigned short *addr, int val)
 {
+    unsigned tmp;
+
     // XXX
+    tmp = (val << 8) & 0xff00;
+    tmp |= (val >> 8) & 0xff;
     __asm__ __volatile__("stha %0, [%1] 0x15\n\t"
-                         : : "r"(val), "r"(addr):"memory");
+                         : : "r"(tmp), "r"(addr):"memory");
 }
 
 static inline void out_be16(volatile unsigned short *addr, int val)
@@ -108,13 +114,17 @@
 
 static inline unsigned in_le32(volatile unsigned *addr)
 {
-    unsigned ret;
+    unsigned ret, tmp;
 
     // XXX
     __asm__ __volatile__("lduwa [%1] 0x15, %0\n\t"
                          :"=r"(ret):"r"(addr):"memory");
 
-    return ret;
+    tmp = ret << 24;
+    tmp |= (ret << 8) & 0xff0000;
+    tmp |= (ret >> 8) & 0xff00;
+    tmp |= (ret >> 24) & 0xff;
+    return tmp;
 }
 
 static inline unsigned in_be32(volatile unsigned *addr)
@@ -129,9 +139,14 @@
 
 static inline void out_le32(volatile unsigned *addr, int val)
 {
+    unsigned tmp;
     // XXX
+    tmp = val << 24;
+    tmp |= (val << 8) & 0xff0000;
+    tmp |= (val >> 8) & 0xff00;
+    tmp |= (val >> 24) & 0xff;
     __asm__ __volatile__("stwa %0, [%1] 0x15\n\t"
-                         : : "r"(val), "r"(addr):"memory");
+                         : : "r"(tmp), "r"(addr):"memory");
 }
 
 static inline void out_be32(volatile unsigned *addr, int val)

Modified: openbios-devel/include/sparc64/pci.h
===================================================================
--- openbios-devel/include/sparc64/pci.h	2006-07-18 21:38:42 UTC (rev 67)
+++ openbios-devel/include/sparc64/pci.h	2006-07-18 21:42:16 UTC (rev 68)
@@ -24,42 +24,43 @@
 #define PCI_FN(pcidev) ((uint8_t) ((pcidev) >> 8) & 7)
 
 #define APB_SPECIAL_BASE     0x1fe00000000ULL
-#define PCI_CONFIG           (APB_SPECIAL_BASE + 0x2000)
+#define PCI_CONFIG           (APB_SPECIAL_BASE + 0x1000000ULL)
+#define APB_MEM_BASE	     0x1ff00000000ULL
 
 static inline uint8_t pci_config_read8(pci_addr dev, uint8_t reg)
 {
-    out_be32((void *)PCI_CONFIG, dev | (reg & ~3));
-    return in_8((void *)(PCI_CONFIG | (reg & 3)));
+    out_le32((void *)PCI_CONFIG, dev | (reg & ~3));
+    return in_8((void *)(APB_MEM_BASE | (reg & 3)));
 }
 
 static inline uint16_t pci_config_read16(pci_addr dev, uint8_t reg)
 {
-    out_be32((void *)PCI_CONFIG, dev | (reg & ~3));
-    return in_be16((void *)(PCI_CONFIG | (reg & 2)));
+    out_le32((void *)PCI_CONFIG, dev | (reg & ~3));
+    return in_le16((void *)(APB_MEM_BASE | (reg & 2)));
 }
 
 static inline uint32_t pci_config_read32(pci_addr dev, uint8_t reg)
 {
-    out_be32((void *)PCI_CONFIG, dev | reg);
-    return in_be32((void *)(PCI_CONFIG | reg));
+    out_le32((void *)PCI_CONFIG, dev | reg);
+    return in_le32((void *)(APB_MEM_BASE | reg));
 }
 
 static inline void pci_config_write8(pci_addr dev, uint8_t reg, uint8_t val)
 {
-    out_be32((void *)PCI_CONFIG, dev | (reg & ~3));
-    out_8((void *)(PCI_CONFIG | (reg & 3)), val);
+    out_le32((void *)PCI_CONFIG, dev | (reg & ~3));
+    out_8((void *)(APB_MEM_BASE | (reg & 3)), val);
 }
 
 static inline void pci_config_write16(pci_addr dev, uint8_t reg, uint16_t val)
 {
-    out_be32((void *)PCI_CONFIG, dev | (reg & ~3));
-    out_be16((void *)(PCI_CONFIG | (reg & 2)), val);
+    out_le32((void *)PCI_CONFIG, dev | (reg & ~3));
+    out_le16((void *)(APB_MEM_BASE | (reg & 2)), val);
 }
 
 static inline void pci_config_write32(pci_addr dev, uint8_t reg, uint32_t val)
 {
-    out_be32((void *)PCI_CONFIG, dev | reg);
-    out_be32((void *)(PCI_CONFIG | reg), val);
+    out_le32((void *)PCI_CONFIG, dev | reg);
+    out_le32((void *)(APB_MEM_BASE | reg), val);
 }
 
 #else /* !PCI_CONFIG_1 */

Modified: openbios-devel/include/sparc64/types.h
===================================================================
--- openbios-devel/include/sparc64/types.h	2006-07-18 21:38:42 UTC (rev 67)
+++ openbios-devel/include/sparc64/types.h	2006-07-18 21:42:16 UTC (rev 68)
@@ -13,6 +13,16 @@
 
 #include <stdint.h>
 
+#ifdef NEED_FAKE_INT128_T
+typedef struct {
+    uint64_t hi;
+    uint64_t lo;
+} blob_128_t;
+
+typedef blob_128_t __int128_t;
+typedef blob_128_t __uint128_t;
+#endif
+
 /* cell based types */
 typedef int64_t		 cell;
 typedef uint64_t	ucell;

Modified: openbios-devel/kernel/bootstrap.c
===================================================================
--- openbios-devel/kernel/bootstrap.c	2006-07-18 21:38:42 UTC (rev 67)
+++ openbios-devel/kernel/bootstrap.c	2006-07-18 21:42:16 UTC (rev 68)
@@ -43,11 +43,11 @@
 static int segfault = 0;
 int verbose = 0;
 
-static FILE *srcfiles[64];
+static FILE *srcfiles[128];
 static unsigned int cursrc = 0;
 
 #ifdef NATIVE_BITWIDTH_SMALLER_THAN_HOST_BITWIDTH
-unsigned long base_address;
+ucell base_address;
 #endif
 
 /* include path handling */
@@ -116,7 +116,7 @@
 		bit=i&~(-BITS);
 		
 		if(d1[i]==d2[i]) {
-			reloc_table[pos] &= target_ucell(~(1UL<<bit));
+			reloc_table[pos] &= target_ucell(~((ucell)1UL<<bit));
 			
 			// This check might bring false positives in data.
 			//if(d1[i] >= pointer2cell(dict_one) &&
@@ -124,7 +124,7 @@
 			//	printk("\nWARNING: inconsistent relocation (%x:%x)!\n", d1[i], d2[i]);
 		} else {
 			/* This is a pointer, it needs relocation, d2==dict */
-			reloc_table[pos] |= target_ucell(1UL<<bit);
+			reloc_table[pos] |= target_ucell((ucell)1UL<<bit);
 			d2[i] = target_ucell(target_ucell(d2[i]) - pointer2cell(d2));
 		}
 	}
@@ -792,9 +792,9 @@
 		addr = read_cell(cell2pointer(PC));
 
 	printk("panic: segmentation violation at %p\n", (char *)si->si_addr);
-	printk("dict=%p here=%p(dict+0x%x) pc=0x%x(dict+0x%x)\n",
+	printk("dict=%p here=%p(dict+0x%" FMT_CELL_x ") pc=0x%" FMT_CELL_x "(dict+0x%" FMT_CELL_x ")\n",
 	       dict, dict + dicthead, dicthead, PC, PC - pointer2cell(dict));
-	printk("dstackcnt=%d rstackcnt=%d instruction=%x\n",
+	printk("dstackcnt=%d rstackcnt=%d instruction=%" FMT_CELL_x "\n",
 	       dstackcnt, rstackcnt, addr);
 
 	printdstack();
@@ -833,7 +833,7 @@
 		printk(" undefined word.\n");
 		break;
 	default:
-		printk("\nError %d occured.\n", no);
+		printk("\nError %" FMT_CELL_d " occured.\n", no);
 	}
 	exit(1);
 }

Modified: openbios-devel/kernel/cross.h
===================================================================
--- openbios-devel/kernel/cross.h	2006-07-18 21:38:42 UTC (rev 67)
+++ openbios-devel/kernel/cross.h	2006-07-18 21:42:16 UTC (rev 68)
@@ -46,10 +46,15 @@
 #define target_ucell(value) (target_long(value))
 #define target_cell(value) (target_long(value))
 #elif BITS==64
+#ifdef NATIVE_BITWIDTH_LARGER_THAN_HOST_BITWIDTH
+#define target_ucell(value) ( ((ucell)target_long((value)&0xffffffff))<<32 )
+#define target_cell(value) ( ((cell)target_long((value)&0xffffffff))<<32 )
+#else
 #define target_ucell(value) ( ((ucell)target_long((value)&0xffffffff))<<32 | \
 			   ((ucell)target_long((value)>>32)) )
 #define target_cell(value) ( ((cell)target_long((value)&0xffffffff))<<32 | \
 			   ((cell)target_long((value)>>32)) )
+#endif
 #else
 #error "Endianness not supported. Please report."
 #endif
@@ -103,17 +108,23 @@
 #ifdef NATIVE_BITWIDTH_EQUALS_HOST_BITWIDTH
 #define pointer2cell(x) ((ucell)(x))
 #define cell2pointer(x) ((u8 *)(x))
+#define FMT_CELL_x "x"
+#define FMT_CELL_d "d"
 #endif
 
 #ifdef NATIVE_BITWIDTH_SMALLER_THAN_HOST_BITWIDTH
-extern unsigned long base_address;
-#define pointer2cell(x) ((ucell)(((unsigned long)x)-base_address))
-#define cell2pointer(x) ((u8 *)(((unsigned long)x)+base_address))
+extern ucell base_address;
+#define pointer2cell(x) ((ucell)(((unsigned long)(x))-base_address))
+#define cell2pointer(x) ((u8 *)(((unsigned long)(x))+base_address))
+#define FMT_CELL_x "x"
+#define FMT_CELL_d "d"
 #endif
 
 #ifdef NATIVE_BITWIDTH_LARGER_THAN_HOST_BITWIDTH
-#define pointer2cell(x) ((ucell)(x))
-#define cell2pointer(x) ((u8 *)((unsigned long)x&0xFFFFFFFFUL))
+#define pointer2cell(x) ((ucell)(unsigned long)(x))
+#define cell2pointer(x) ((u8 *)((unsigned long)(x)&0xFFFFFFFFUL))
+#define FMT_CELL_x "llx"
+#define FMT_CELL_d "lld"
 #endif
 
 #endif

Modified: openbios-devel/kernel/dict.c
===================================================================
--- openbios-devel/kernel/dict.c	2006-07-18 21:38:42 UTC (rev 67)
+++ openbios-devel/kernel/dict.c	2006-07-18 21:42:16 UTC (rev 68)
@@ -119,7 +119,7 @@
 	printk("  relocation:  %s\n", header->relocation?"yes":"no");
 	printk("  checksum:    %08x\n", target_long(header->checksum));
 	printk("  length:      %08x\n", target_long(header->length));
-	printk("  last:        %08x\n", target_cell(header->last));
+	printk("  last:        %0" FMT_CELL_x "\n", target_cell(header->last));
 }
 
 ucell load_dictionary(const char *data, ucell len)

Modified: openbios-devel/kernel/forth.c
===================================================================
--- openbios-devel/kernel/forth.c	2006-07-18 21:38:42 UTC (rev 67)
+++ openbios-devel/kernel/forth.c	2006-07-18 21:42:16 UTC (rev 68)
@@ -330,8 +330,13 @@
 {
 	const ucell b = POP();
 	const ducell a = DPOP();
+#ifdef NEED_FAKE_INT128_T
+        fprintf(stderr, "mudivmode called\n");
+        exit(-1);
+#else
 	PUSH(a % b);
 	DPUSH(a / b);
+#endif
 }
 
 
@@ -475,7 +480,12 @@
 {
 	const dcell d2 = DPOP();
 	const dcell d1 = DPOP();
+#ifdef NEED_FAKE_INT128_T
+        fprintf(stderr, "dplus called\n");
+        exit(-1);
+#else
 	DPUSH(d1 + d2);
+#endif
 }
 
 
@@ -487,7 +497,12 @@
 {
 	const dcell d2 = DPOP();
 	const dcell d1 = DPOP();
+#ifdef NEED_FAKE_INT128_T
+        fprintf(stderr, "dminus called\n");
+        exit(-1);
+#else
 	DPUSH(d1 - d2);
+#endif
 }
 
 
@@ -499,7 +514,12 @@
 {
 	const cell u2 = POP();
 	const cell u1 = POP();
+#ifdef NEED_FAKE_INT128_T
+        fprintf(stderr, "mmult called\n");
+        exit(-1);
+#else
 	DPUSH((dcell) u1 * u2);
+#endif
 }
 
 
@@ -511,7 +531,12 @@
 {
 	const ucell u2 = POP();
 	const ucell u1 = POP();
+#ifdef NEED_FAKE_INT128_T
+        fprintf(stderr, "ummult called\n");
+        exit(-1);
+#else
 	DPUSH((ducell) u1 * u2);
+#endif
 }
 
 

Modified: openbios-devel/kernel/stack.c
===================================================================
--- openbios-devel/kernel/stack.c	2006-07-18 21:38:42 UTC (rev 67)
+++ openbios-devel/kernel/stack.c	2006-07-18 21:42:16 UTC (rev 68)
@@ -9,6 +9,7 @@
 
 #include "openbios/config.h"
 #include "openbios/stack.h"
+#include "cross.h"
 
 #define dstacksize 512
 int dstackcnt = 0;
@@ -24,7 +25,7 @@
 	int i;
 	printk("dstack:");
 	for (i = 0; i <= dstackcnt; i++) {
-		printk(" 0x%x", dstack[i]);
+		printk(" 0x%" FMT_CELL_x , dstack[i]);
 	}
 	printk("\n");
 }
@@ -35,7 +36,7 @@
 	int i;
 	printk("rstack:");
 	for (i = 0; i <= rstackcnt; i++) {
-		printk(" 0x%x", rstack[i]);
+		printk(" 0x%" FMT_CELL_x , rstack[i]);
 	}
 	printk("\n");
 }




More information about the OpenBIOS mailing list