Re: [PATCH v2 0/9] sparc: unify sparc/boot/piggyback

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, Jan 3, 2011 at 02:50, Sam Ravnborg <sam@xxxxxxxxxxxx> wrote:
>>
>> That said, I know that my old endian fixed version of piggyback_64
>> works, so I'll do a quick check first to ensure that your version
>> produces the same output.
>
> Testing like this would be great.

Update:

I've found an old laptop with a serial port to use as a serial console
and resurrected my Ultra 1e. I decided to upgrade it to the latest
Debian Squeeze, and it now won't load SILO. *sigh*. On boot, it fails
with the message "Fast data access MMU miss" before SILO even prints
anything. Apparently these messages are due to things being too large
according to the ubuntu forums, but this occurs before SILO even
loads, which makes me suspicious. I'll have to investigate further,
but that means I'll have to take a trip to an installer environment -
and given that I now lack the machine I had set up for installing them
off, that's going to be difficult at best. I'm thinking a complete
re-install might be an idea, but I've had persistent issues getting my
Ultra 5 to install in the past, so I'm concerned that this might not
happen.

So, the net result of that machine becoming FUBAR is that I now have
no way to compile anything for SPARC as that was my last working SPARC
compilation platform. ARGH!

I've attached my endian fix patch for piggyback_64.c. I have
previously confirmed - by generating piggyback files with an empty
root-image - that this produces identical files (same SHA1 sums) to
the original version before any cleanup patches under a sparc64
environment. If you'd perform the same test between the output of a
version with this patch and your new version you should be able to
confirm that it's working properly.

Sorry about all this fuckup, but .... that's life =(

At least it gives me more reason to get my Ultra 5 running. (It's the
one that I've been unable to install)

Thanks,

-- 

Julian Calaby

Email: julian.calaby@xxxxxxxxx
Profile: http://www.google.com/profiles/julian.calaby/
.Plan: http://sites.google.com/site/juliancalaby/
diff --git a/arch/sparc/boot/piggyback_64.c b/arch/sparc/boot/piggyback_64.c
index a26a686..06e0917 100644
--- a/arch/sparc/boot/piggyback_64.c
+++ b/arch/sparc/boot/piggyback_64.c
@@ -32,6 +32,24 @@
 /* Note: run this on an a.out kernel (use elftoaout for it), as PROM looks for a.out image onlly
    usage: piggyback vmlinux System.map tail, where tail is gzipped fs of the initial ramdisk */
 
+unsigned short ld2(char *p)
+{
+	return (p[0] << 8) | p[1];
+}
+
+unsigned int ld4(char *p)
+{
+	return (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3];
+}
+
+void st4(char *p, unsigned int x)
+{
+	p[0] = x >> 24;
+	p[1] = x >> 16;
+	p[2] = x >> 8;
+	p[3] = x;
+}
+
 static void die(char *str)
 {
 	perror (str);
@@ -40,6 +58,7 @@ static void die(char *str)
 
 int main(int argc,char **argv)
 {
+	static char aout_magic[] = { 0x01, 0x03, 0x01, 0x07 };
 	char buffer [1024], *q, *r;
 	unsigned int i, j, k, start, end, offset;
 	FILE *map;
@@ -60,13 +79,12 @@ int main(int argc,char **argv)
 	if ((image = open(argv[1],O_RDWR)) < 0) die(argv[1]);
 	if (read(image,buffer,512) != 512) die(argv[1]);
 	if (!memcmp (buffer, "\177ELF", 4)) {
-		unsigned int *p = (unsigned int *)(buffer + *(unsigned int *)(buffer + 28));
-		
-		i = p[1] + *(unsigned int *)(buffer + 24) - p[2];
+		q = buffer + ld4(buffer + 28);
+		i = ld4(q + 4) + ld4(buffer + 24) - ld4(q + 8);
 		if (lseek(image,i,0) < 0) die("lseek");
 		if (read(image,buffer,512) != 512) die(argv[1]);
 		j = 0;
-	} else if (*(unsigned int *)buffer == 0x01030107) {
+	} else if (memcmp(buffer, aout_magic, 4) == 0) {
 		i = j = 32;
 	} else {
 		fprintf (stderr, "Not ELF nor a.out. Don't blame me.\n");
@@ -76,7 +94,7 @@ int main(int argc,char **argv)
 	if (j == 32 && buffer[40] == 'H' && buffer[41] == 'd' && buffer[42] == 'r' && buffer[43] == 'S') {
 		offset = 40 + 10;
 	} else {
-		i += ((*(unsigned short *)(buffer + j + 2))<<2) - 512;
+		i += (ld2(buffer + j + 2) << 2) - 512;
 		if (lseek(image,i,0) < 0) die("lseek");
 		if (read(image,buffer,1024) != 1024) die(argv[1]);
 		for (q = buffer, r = q + 512; q < r; q += 4) {
@@ -90,15 +108,15 @@ int main(int argc,char **argv)
 		offset = i + (q - buffer) + 10;
 	}
 	if (lseek(image, offset, 0) < 0) die ("lseek");
-	*(unsigned *)buffer = 0;
-	*(unsigned *)(buffer + 4) = 0x01000000;
-	*(unsigned *)(buffer + 8) = ((end + 32 + 8191) & ~8191);
-	*(unsigned *)(buffer + 12) = s.st_size;
+	st4(buffer, 0);
+	st4(buffer + 4, 0x01000000);
+	st4(buffer + 8, (end + 32 + 8191) & ~8191);
+	st4(buffer + 12, s.st_size);
 	if (write(image,buffer+2,14) != 14) die (argv[1]);
 	if (lseek(image, 4, 0) < 0) die ("lseek");
-	*(unsigned *)buffer = ((end + 32 + 8191) & ~8191) - (start & ~0x3fffffUL) + s.st_size;
-	*(unsigned *)(buffer + 4) = 0;
-	*(unsigned *)(buffer + 8) = 0;
+	st4(buffer, ((end + 32 + 8191) & ~8191) - (start & ~0x3fffffUL) + s.st_size);
+	st4(buffer + 4, 0);
+	st4(buffer + 8, 0);
 	if (write(image,buffer,12) != 12) die (argv[1]);
 	if (lseek(image, k - start + ((end + 32 + 8191) & ~8191), 0) < 0) die ("lseek");
 	if ((tail = open(argv[3],O_RDONLY)) < 0) die(argv[3]);

[Index of Archives]     [Kernel Development]     [DCCP]     [Linux ARM Development]     [Linux]     [Photo]     [Yosemite Help]     [Linux ARM Kernel]     [Linux SCSI]     [Linux x86_64]     [Linux Hams]

  Powered by Linux