shithub: drawcpu

Download patch

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
--