ref: 23109a6631eb21b2d849807b470c239d71d09159
parent: be21af8515dcebab0ae2991e8e952af04e06baad
author: halfwit <michaelmisch1985@gmail.com>
date: Wed Jan 28 18:56:22 EST 2026
Ensure we have the new definition of invalid
--- a/kern/arm.c
+++ b/kern/arm.c
@@ -31,9 +31,9 @@
}
void
-invalid(u32int instr)
+invalid(u32int instr, char *from)
{- print("%s: undefined instruction %.8ux @ %.8ux pid=%d", (char*)up->arg, instr, up->R[15] - 4, up->pid);+ print("%s: undefined instruction %.8ux @ %.8ux pid=%d source=%s\n", (char*)up->arg, instr, up->R[15] - 4, up->pid, from); pexit("invalid", 1);}
@@ -53,7 +53,7 @@
val = up->R[instr & 15];
if(instr & (1<<4)) {if((instr & (1<<7)) && ((instr >> 8) & 0xF) != 0)
- invalid(instr);
+ invalid(instr, "doshift");
amount = up->R[(instr >> 8) & 15] & 0xFF;
if(amount == 0)
return val;
@@ -115,7 +115,7 @@
if(instr & fI) {u8int carry = 0;
if(instr & (1<<4))
- invalid(instr);
+ invalid(instr, "single");
offset = doshift(instr, &carry);
} else
offset = instr & ((1<<12) - 1);
@@ -127,10 +127,10 @@
print("single: Rn=%d Rd=%d offset=%.8ux pid=%d\n", ((instr >> 16) & 15), ((instr >> 12) & 15), offset, up->pid);#endif
if((instr & (fW | fP)) == fW)
- invalid(instr);
+ invalid(instr, "single");
if(Rn == up->R + 15) {if(instr & fW)
- invalid(instr);
+ invalid(instr, "single");
addr = up->R[15] + 4;
} else
addr = *Rn;
@@ -178,7 +178,7 @@
print("swap: Rm=%d Rd=%d Rn=%d pid=%d\n", (instr & 15), ((instr >> 12) & 15), ((instr >> 16) & 15), up->pid);#endif
if(Rm == up->R + 15 || Rd == up->R + 15 || Rn == up->R + 15)
- invalid(instr);
+ invalid(instr, "swap");
addr = *Rn;
if((instr & fB) == 0)
addr = evenaddr(addr, 3);
@@ -236,7 +236,7 @@
Rn += 4;
}
if(Rd == up->R + 15 && (instr & fS))
- invalid(instr);
+ invalid(instr, "alu");
carry = (up->CPSR & flC) != 0;
overflow = (up->CPSR & flV) != 0;
@@ -313,13 +313,13 @@
offset = (instr & 15) | ((instr >> 4) & 0xF0);
} else {if((instr & 15) == 15)
- invalid(instr);
+ invalid(instr, "halfword");
offset = up->R[instr & 15];
}
if(!(instr & fU))
offset = - offset;
if(!(instr & fP) && (instr & fW))
- invalid(instr);
+ invalid(instr, "halfword");
Rn = up->R + ((instr >> 16) & 15);
Rd = up->R + ((instr >> 12) & 15);
#ifdef DINSTR
@@ -352,7 +352,7 @@
Segment *seg;
if(instr & (1<<22))
- invalid(instr);
+ invalid(instr,"block");
Rn = up->R +((instr >> 16) & 15);
#ifdef DINSTR
print("block: Rn=%d pid=%d\n", ((instr >> 16) & 15), up->pid);@@ -404,7 +404,7 @@
print("multiply: Rm=%d Rs=%d Rn=%d Rd=%d pid=%d\n", (instr & 15), ((instr >> 8) & 15), ((instr >> 12) & 15), ((instr >> 16) & 15), up->pid);#endif
if(Rd == Rm || Rm == up->R + 15 || Rs == up->R + 15 || Rn == up->R + 15 || Rd == up->R + 15)
- invalid(instr);
+ invalid(instr, "multiply");
res = *Rm * *Rs;
if(instr & (1<<21))
res += *Rn;
@@ -423,15 +423,15 @@
{u32int *RdH, *RdL, *Rs, *Rm;
u64int res;
-#ifdef DINSTR
- print("multiplylong pid=%d\n", up->pid);-#endif
Rm = up->R + (instr & 15);
Rs = up->R + ((instr >> 8) & 15);
RdL = up->R + ((instr >> 12) & 15);
RdH = up->R + ((instr >> 16) & 15);
- if(RdL == RdH || RdH == Rm || RdL == Rm || Rm == up->R + 15 || Rs == up->R + 15 || RdL == up->R + 15 || RdH == up->R + 15)
- invalid(instr);
+#ifdef DINSTR
+ print("multiplylong pid=%d Rm=%ux Rs=%ux RdL=%ux RdH=%ux, R15=%ux\n", up->pid, Rm, Rs, RdL, RdH, up->R[15]);+#endif
+ if(RdL == RdH || RdH == Rm || RdL == Rm || Rm == up->R[15] || Rs == up->R[15] || RdL == up->R[15] || RdH == up->R[15])
+ invalid(instr, "multiplylong");
if(instr & (1<<22))
res = ((vlong)*(int*)Rs) * *(int*)Rm;
else {@@ -464,7 +464,7 @@
Rd = up->R + ((instr >> 12) & 15);
Rn = up->R + ((instr >> 16) & 15);
if(Rd == up->R + 15 || Rn == up->R + 15)
- invalid(instr);
+ invalid(instr, "singleex");
addr = evenaddr(*Rn, 3);
if(instr & fS) {targ = vaddr(addr, 4, &seg);
@@ -475,7 +475,7 @@
} else {Rm = up->R + (instr & 15);
if(Rm == up->R + 15)
- invalid(instr);
+ invalid(instr, "singleex");
targ = vaddr(addr, 4, &seg);
*Rd = addr != up->lladdr || !cas((int*)targ, up->llval, *Rm);
segunlock(seg);
@@ -617,6 +617,6 @@
else if ((instr & 0x0F000A00) == 0x0D000A00)
vfprmtransfer(instr);
else {- invalid(instr);
+ invalid(instr, "Unsupported");
}
}
\ No newline at end of file
--
⑨