ref: 869a08f0807a3c5f6a5e44d64a7cdff483d17f73
parent: 52007761ac762d50ffeab1580a2180a51ba3c2ca
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());
--
⑨