summaryrefslogtreecommitdiff
path: root/sys/src/cmd/5e/arm.c
diff options
context:
space:
mode:
authoraiju <aiju@phicode.de>2011-06-24 15:10:22 +0200
committeraiju <aiju@phicode.de>2011-06-24 15:10:22 +0200
commit81d393942d8834b6e071ab0957b655a99e737486 (patch)
treea4b6c1cc206c87d46f390139502e03dafddd9c2a /sys/src/cmd/5e/arm.c
parenta3e9415aa8cdba6059c972c582e3645c4c112139 (diff)
updated 5e
Diffstat (limited to 'sys/src/cmd/5e/arm.c')
-rw-r--r--sys/src/cmd/5e/arm.c32
1 files changed, 16 insertions, 16 deletions
diff --git a/sys/src/cmd/5e/arm.c b/sys/src/cmd/5e/arm.c
index fcaab3fb4..507c46361 100644
--- a/sys/src/cmd/5e/arm.c
+++ b/sys/src/cmd/5e/arm.c
@@ -22,7 +22,7 @@ enum {
static void
invalid(u32int instr)
{
- sysfatal("undefined instruction %8ux @ %8ux", instr, P->R[15] - 4);
+ suicide("undefined instruction %8ux @ %8ux", instr, P->R[15] - 4);
}
static u32int
@@ -81,7 +81,7 @@ single(u32int instr)
addr = *Rn;
if(instr & fP)
addr += offset;
- targ = vaddr(addr, &seg);
+ targ = vaddr(addr, 4, &seg);
switch(instr & (fB | fL)) {
case 0:
*(u32int*) targ = *Rd;
@@ -120,7 +120,7 @@ swap(u32int instr)
Rn = P->R + ((instr >> 16) & 15);
if(Rm == P->R + 15 || Rd == P->R + 15 || Rn == P->R + 15)
invalid(instr);
- targ = (u32int *) vaddr(*Rn, &seg);
+ targ = (u32int *) vaddr(*Rn, 4, &seg);
lock(&seg->lock);
if(instr & fB) {
tmp = *(u8int*) targ;
@@ -256,11 +256,11 @@ halfword(u32int instr)
if(instr & fP)
target += offset;
switch(instr & (fSg | fH | fL)) {
- case fSg: *(u8int*) vaddr(target, &seg) = *Rd; break;
- case fSg | fL: *Rd = (long) *(char*) vaddr(target, &seg); break;
- case fH: case fSg | fH: *(u16int*) vaddr(target, &seg) = *Rd; break;
- case fH | fL: *Rd = *(u16int*) vaddr(target, &seg); break;
- case fH | fL | fSg: *Rd = (long) *(short*) vaddr(target, &seg); break;
+ case fSg: *(u8int*) vaddr(target, 1, &seg) = *Rd; break;
+ case fSg | fL: *Rd = (long) *(char*) vaddr(target, 1, &seg); break;
+ case fH: case fSg | fH: *(u16int*) vaddr(target, 2, &seg) = *Rd; break;
+ case fH | fL: *Rd = *(u16int*) vaddr(target, 2, &seg); break;
+ case fH | fL | fSg: *Rd = (long) *(short*) vaddr(target, 2, &seg); break;
}
segunlock(seg);
if(!(instr & fP))
@@ -289,9 +289,9 @@ block(u32int instr)
if(instr & fP)
targ += 4;
if(instr & fL)
- P->R[i] = *(u32int*) vaddr(targ, &seg);
+ P->R[i] = *(u32int*) vaddr(targ, 4, &seg);
else
- *(u32int*) vaddr(targ, &seg) = P->R[i];
+ *(u32int*) vaddr(targ, 4, &seg) = P->R[i];
segunlock(seg);
if(!(instr & fP))
targ += 4;
@@ -303,9 +303,9 @@ block(u32int instr)
if(instr & fP)
targ -= 4;
if(instr & fL)
- P->R[i] = *(u32int*) vaddr(targ, &seg);
+ P->R[i] = *(u32int*) vaddr(targ, 4, &seg);
else
- *(u32int*) vaddr(targ, &seg) = P->R[i];
+ *(u32int*) vaddr(targ, 4, &seg) = P->R[i];
segunlock(seg);
if(!(instr & fP))
targ -= 4;
@@ -382,7 +382,7 @@ singleex(u32int instr)
if(Rd == P->R + 15 || Rn == P->R + 15)
invalid(instr);
if(instr & fS) {
- targ = vaddr(*Rn, &seg);
+ targ = vaddr(*Rn, 4, &seg);
lock(&seg->lock);
*Rd = *targ;
segunlock(seg);
@@ -390,11 +390,11 @@ singleex(u32int instr)
Rm = P->R + (instr & 15);
if(Rm == P->R + 15)
invalid(instr);
- targ = vaddr(*Rn, &seg);
+ targ = vaddr(*Rn, 4, &seg);
if(canlock(&seg->lock)) {
*Rd = 1;
} else {
- *targ = *Rd;
+ *targ = *Rm;
unlock(&seg->lock);
*Rd = 0;
}
@@ -408,7 +408,7 @@ step(void)
u32int instr;
Segment *seg;
- instr = *(u32int*) vaddr(P->R[15], &seg);
+ instr = *(u32int*) vaddr(P->R[15], 4, &seg);
segunlock(seg);
if(fulltrace) {
print("%d ", P->pid);