code: plan9front

Download patch

ref: f8fd3d5d28472644f87484c3e7ef921fc31e0af5
parent: dfb4b522830edab8f3856289d326d6cf5e930644
author: Keegan Saunders <keegan@undefinedbehaviour.org>
date: Sun Oct 1 13:26:43 EDT 2023

7l: use wider INITTEXT and INITDAT

Currently we use a 32-bit value for these values which means
that large values passed to -T will be truncated and sign-extended,
rather than stored verbatim. This means load addresses in between
low 2GB and high 2GB will not be respected.

It appears this has been fixed in 6l already, so we can leave it alone.

--- a/sys/src/cmd/7l/asm.c
+++ b/sys/src/cmd/7l/asm.c
@@ -45,8 +45,8 @@
 asmb(void)
 {
 	Prog *p;
-	long magic, etext;
-	vlong vl;
+	long magic;
+	vlong vl, etext;
 	Optab *o;
 	uchar *sbuf, *dbuf;
 
@@ -382,9 +382,9 @@
 void
 asmlc(void)
 {
-	long oldpc, oldlc;
+	vlong oldpc;
 	Prog *p;
-	long v, s;
+	long v, s, oldlc;
 
 	oldpc = INITTEXT;
 	oldlc = 0;
--- a/sys/src/cmd/7l/l.h
+++ b/sys/src/cmd/7l/l.h
@@ -253,10 +253,10 @@
 
 EXTERN	long	HEADR;			/* length of header */
 EXTERN	int	HEADTYPE;		/* type of header */
-EXTERN	long	INITDAT;		/* data location */
+EXTERN	vlong	INITDAT;		/* data location */
 EXTERN	long	INITRND;		/* data round above text location */
-EXTERN	long	INITTEXT;		/* text location */
-EXTERN	long	INITTEXTP;		/* text location (physical) */
+EXTERN	vlong	INITTEXT;		/* text location */
+EXTERN	vlong	INITTEXTP;		/* text location (physical) */
 EXTERN	char*	INITENTRY;		/* entry point */
 EXTERN	long	autosize;
 EXTERN	Biobuf	bso;
--- a/sys/src/cmd/7l/obj.c
+++ b/sys/src/cmd/7l/obj.c
@@ -162,10 +162,10 @@
 	if (INITTEXTP == -1)
 		INITTEXTP = INITTEXT;
 	if(INITDAT != 0 && INITRND != 0)
-		print("warning: -D0x%lux is ignored because of -R0x%lux\n",
+		print("warning: -D0x%llux is ignored because of -R0x%lux\n",
 			INITDAT, INITRND);
 	if(debug['v'])
-		Bprint(&bso, "HEADER = -H0x%d -T0x%lux -D0x%lux -R0x%lux\n",
+		Bprint(&bso, "HEADER = -H0x%d -T0x%llux -D0x%llux -R0x%lux\n",
 			HEADTYPE, INITTEXT, INITDAT, INITRND);
 	Bflush(&bso);
 	zprg.as = AGOK;
--- a/sys/src/cmd/7l/span.c
+++ b/sys/src/cmd/7l/span.c
@@ -21,7 +21,8 @@
 	Sym *setext, *s;
 	Optab *o;
 	int m, bflag, i;
-	long c, otxt, v;
+	vlong c, otxt;
+	long v;
 
 	if(debug['v'])
 		Bprint(&bso, "%5.2f span\n", cputime());