ref: 3ba213a9d79bfe52f9a8aa6834c67eac665de136
parent: 36f4f9fcd381d0423a48edee91d13e596c740c54
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Tue Sep 18 14:18:43 EDT 2012
6c: extern register fix (import from patch/6c-extreg) to make it easy to use normal libraries (such as libdraw, libsec, and libmp) with the kernel, which uses extern register, don't stray into the external register set when allocating values to registers.
--- a/amd64/include/u.h
+++ b/amd64/include/u.h
@@ -10,7 +10,7 @@
typedef unsigned long usize;
typedef ushort Rune;
typedef union FPdbleword FPdbleword;
-typedef uvlong jmp_buf[2];
+typedef uintptr jmp_buf[2];
#define JMPBUFSP 0
#define JMPBUFPC 1
#define JMPBUFDPC 0
--- a/sys/src/cmd/6c/reg.c
+++ b/sys/src/cmd/6c/reg.c
@@ -50,6 +50,8 @@
lastr = R;
nvar = 0;
regbits = RtoB(D_SP) | RtoB(D_AX) | RtoB(D_X0);
+ if(REGEXT)
+ regbits |= RtoB(REGEXT) | RtoB(REGEXT-1);
for(z=0; z<BITS; z++) {externs.b[z] = 0;
params.b[z] = 0;
--- a/sys/src/cmd/6c/txt.c
+++ b/sys/src/cmd/6c/txt.c
@@ -1,5 +1,7 @@
#include "gc.h"
+static int resvreg[nelem(reg)];
+
void
ginit(void)
{@@ -94,6 +96,7 @@
if(0)
com64init();
+ memset(reg, 0, sizeof(reg));
for(i=0; i<nelem(reg); i++) {reg[i] = 1;
if(i >= D_AX && i <= D_R15 && i != D_SP)
@@ -101,6 +104,10 @@
if(i >= D_X0 && i <= D_X7)
reg[i] = 0;
}
+ /* keep two external registers */
+ reg[REGEXT] = 1;
+ reg[REGEXT-1] = 1;
+ memmove(resvreg, reg, sizeof(resvreg));
}
void
@@ -111,10 +118,10 @@
reg[D_SP]--;
for(i=D_AX; i<=D_R15; i++)
- if(reg[i])
+ if(reg[i] && !resvreg[i])
diag(Z, "reg %R left allocated", i);
for(i=D_X0; i<=D_X7; i++)
- if(reg[i])
+ if(reg[i] && !resvreg[i])
diag(Z, "reg %R left allocated", i);
while(mnstring)
outstring("", 1L);@@ -179,7 +186,7 @@
n = 0;
for(i=D_AX; i<=D_R15; i++)
- if(reg[i] == 0)
+ if(reg[i] == 0 && !resvreg[i])
n++;
return n;
}
@@ -337,7 +344,7 @@
goto out;
}
for(i=D_AX; i<=D_R15; i++)
- if(reg[i] == 0)
+ if(reg[i] == 0 && !resvreg[i])
goto out;
diag(tn, "out of fixed registers");
goto err;
@@ -350,7 +357,7 @@
goto out;
}
for(i=D_X0; i<=D_X7; i++)
- if(reg[i] == 0)
+ if(reg[i] == 0 && !resvreg[i])
goto out;
diag(tn, "out of float registers");
goto out;
--- a/sys/src/cmd/6l/span.c
+++ b/sys/src/cmd/6l/span.c
@@ -668,6 +668,9 @@
rex &= (0x40 | Rxr);
v = a->offset;
+ if ((vlong)v != a->offset)
+ print("asmandsz: Trying to emit %#ullx and 32 bits is not sufficient\n",+ a->offset);
t = a->type;
if(a->index != D_NONE) { if(t >= D_INDIR) {--
⑨