Skip to content

Commit

Permalink
Expand width of rde parameter
Browse files Browse the repository at this point in the history
This change also deletes a lot of dead code from Xed.
  • Loading branch information
jart committed Nov 21, 2022
1 parent 6d14cde commit 0c5f15b
Show file tree
Hide file tree
Showing 59 changed files with 1,666 additions and 1,867 deletions.
3 changes: 2 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@ endif
o: o/$(MODE)/blink \
o/$(MODE)/test

check: o/$(MODE)/test/asm \
check: o \
o/$(MODE)/test/asm \
o/$(MODE)/third_party/cosmo

emulates: \
Expand Down
10 changes: 5 additions & 5 deletions blink/address.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,11 @@
#include "blink/modrm.h"
#include "blink/x86.h"

u64 AddressOb(struct Machine *m, u32 rde) {
u64 AddressOb(struct Machine *m, u64 rde) {
return AddSegment(m, rde, m->xedd->op.disp, m->ds);
}

u64 *(GetSegment)(struct Machine *m, u32 rde, int s) {
u64 *(GetSegment)(struct Machine *m, u64 rde, int s) {
switch (s & 7) {
case 0:
return &m->es;
Expand All @@ -48,11 +48,11 @@ u64 *(GetSegment)(struct Machine *m, u32 rde, int s) {
}
}

u64 DataSegment(struct Machine *m, u32 rde, u64 i) {
u64 DataSegment(struct Machine *m, u64 rde, u64 i) {
return AddSegment(m, rde, i, m->ds);
}

u64 AddressSi(struct Machine *m, u32 rde) {
u64 AddressSi(struct Machine *m, u64 rde) {
switch (Eamode(rde)) {
case XED_MODE_LONG:
return DataSegment(m, rde, Get64(m->si));
Expand All @@ -65,7 +65,7 @@ u64 AddressSi(struct Machine *m, u32 rde) {
}
}

u64 AddressDi(struct Machine *m, u32 rde) {
u64 AddressDi(struct Machine *m, u64 rde) {
u64 i = m->es;
switch (Eamode(rde)) {
case XED_MODE_LONG:
Expand Down
12 changes: 6 additions & 6 deletions blink/address.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@
#include "blink/machine.h"
#include "blink/modrm.h"

u64 AddressOb(struct Machine *, u32);
u64 AddressDi(struct Machine *, u32);
u64 AddressSi(struct Machine *, u32);
u64 *GetSegment(struct Machine *, u32, int);
u64 DataSegment(struct Machine *, u32, u64);
u64 AddressOb(struct Machine *, u64);
u64 AddressDi(struct Machine *, u64);
u64 AddressSi(struct Machine *, u64);
u64 *GetSegment(struct Machine *, u64, int);
u64 DataSegment(struct Machine *, u64, u64);

static inline u64 MaskAddress(u32 mode, u64 x) {
if (mode != XED_MODE_LONG) {
Expand All @@ -21,7 +21,7 @@ static inline u64 MaskAddress(u32 mode, u64 x) {
return x;
}

static inline u64 AddSegment(struct Machine *m, u32 rde, u64 i, u64 s) {
static inline u64 AddSegment(struct Machine *m, u64 rde, u64 i, u64 s) {
if (!Sego(rde)) {
return i + s;
} else {
Expand Down
10 changes: 5 additions & 5 deletions blink/alu.c
Original file line number Diff line number Diff line change
Expand Up @@ -763,7 +763,7 @@ i64 Ror16(u64 x64, u64 y, u32 *f) {
}
}

void OpDas(struct Machine *m, u32 rde) {
void OpDas(struct Machine *m, u64 rde) {
u8 al, af, cf;
af = cf = 0;
al = m->al;
Expand All @@ -779,7 +779,7 @@ void OpDas(struct Machine *m, u32 rde) {
AluFlags8(m->al, af, &m->flags, 0, cf);
}

void OpAaa(struct Machine *m, u32 rde) {
void OpAaa(struct Machine *m, u64 rde) {
u8 af, cf;
af = cf = 0;
if ((m->al & 0x0f) > 9 || GetFlag(m->flags, FLAGS_AF)) {
Expand All @@ -791,7 +791,7 @@ void OpAaa(struct Machine *m, u32 rde) {
AluFlags8(m->al, af, &m->flags, 0, cf);
}

void OpAas(struct Machine *m, u32 rde) {
void OpAas(struct Machine *m, u64 rde) {
u8 af, cf;
af = cf = 0;
if ((m->al & 0x0f) > 9 || GetFlag(m->flags, FLAGS_AF)) {
Expand All @@ -803,7 +803,7 @@ void OpAas(struct Machine *m, u32 rde) {
AluFlags8(m->al, af, &m->flags, 0, cf);
}

void OpAam(struct Machine *m, u32 rde) {
void OpAam(struct Machine *m, u64 rde) {
u8 i = m->xedd->op.uimm0;
if (!i) {
RaiseDivideError(m);
Expand All @@ -814,7 +814,7 @@ void OpAam(struct Machine *m, u32 rde) {
AluFlags8(m->al, 0, &m->flags, 0, 0);
}

void OpAad(struct Machine *m, u32 rde) {
void OpAad(struct Machine *m, u64 rde) {
u8 i = m->xedd->op.uimm0;
Put16(m->ax, (m->ah * i + m->al) & 0xff);
AluFlags8(m->al, 0, &m->flags, 0, 0);
Expand Down
44 changes: 22 additions & 22 deletions blink/alu.h
Original file line number Diff line number Diff line change
Expand Up @@ -110,28 +110,28 @@ i64 Rcl64(u64, u64, u32 *);

u64 BsuDoubleShift(int, u64, u64, u8, bool, u32 *);

void OpAluw(struct Machine *, u32);
void OpXaddEbGb(struct Machine *, u32);
void OpXaddEvqpGvqp(struct Machine *, u32);
void Op0fe(struct Machine *, u32);
void OpNegEb(struct Machine *, u32);
void OpNotEb(struct Machine *, u32);
void OpAlubAdd(struct Machine *, u32);
void OpAlubOr(struct Machine *, u32);
void OpAlubAdc(struct Machine *, u32);
void OpAlubSbb(struct Machine *, u32);
void OpAlubAnd(struct Machine *, u32);
void OpAlubSub(struct Machine *, u32);
void OpAlubXor(struct Machine *, u32);
void OpNotEvqp(struct Machine *, u32);
void OpNegEvqp(struct Machine *, u32);
void OpIncEvqp(struct Machine *, u32);
void OpDecEvqp(struct Machine *, u32);
void OpAluw(struct Machine *, u64);
void OpXaddEbGb(struct Machine *, u64);
void OpXaddEvqpGvqp(struct Machine *, u64);
void Op0fe(struct Machine *, u64);
void OpNegEb(struct Machine *, u64);
void OpNotEb(struct Machine *, u64);
void OpAlubAdd(struct Machine *, u64);
void OpAlubOr(struct Machine *, u64);
void OpAlubAdc(struct Machine *, u64);
void OpAlubSbb(struct Machine *, u64);
void OpAlubAnd(struct Machine *, u64);
void OpAlubSub(struct Machine *, u64);
void OpAlubXor(struct Machine *, u64);
void OpNotEvqp(struct Machine *, u64);
void OpNegEvqp(struct Machine *, u64);
void OpIncEvqp(struct Machine *, u64);
void OpDecEvqp(struct Machine *, u64);

void OpDas(struct Machine *, u32);
void OpAaa(struct Machine *, u32);
void OpAas(struct Machine *, u32);
void OpAam(struct Machine *, u32);
void OpAad(struct Machine *, u32);
void OpDas(struct Machine *, u64);
void OpAaa(struct Machine *, u64);
void OpAas(struct Machine *, u64);
void OpAam(struct Machine *, u64);
void OpAad(struct Machine *, u64);

#endif /* BLINK_ALU_H_ */
18 changes: 9 additions & 9 deletions blink/alu1.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
#include "blink/mop.h"
#include "blink/swap.h"

static void AluEb(struct Machine *m, u32 rde, aluop_f op) {
static void AluEb(struct Machine *m, u64 rde, aluop_f op) {
u8 *p;
p = GetModrmRegisterBytePointerWrite(m, rde);
if (!Lock(rde)) {
Expand All @@ -46,15 +46,15 @@ static void AluEb(struct Machine *m, u32 rde, aluop_f op) {
}
}

void OpNotEb(struct Machine *m, u32 rde) {
void OpNotEb(struct Machine *m, u64 rde) {
AluEb(m, rde, Not8);
}

void OpNegEb(struct Machine *m, u32 rde) {
void OpNegEb(struct Machine *m, u64 rde) {
AluEb(m, rde, Neg8);
}

void Op0fe(struct Machine *m, u32 rde) {
void Op0fe(struct Machine *m, u64 rde) {
switch (ModrmReg(rde)) {
case 0:
AluEb(m, rde, Inc8);
Expand All @@ -67,7 +67,7 @@ void Op0fe(struct Machine *m, u32 rde) {
}
}

static void AluEvqp(struct Machine *m, u32 rde, const aluop_f ops[4]) {
static void AluEvqp(struct Machine *m, u64 rde, const aluop_f ops[4]) {
u8 *p;
if (Rexw(rde)) {
p = GetModrmRegisterWordPointerWrite(m, rde, 8);
Expand Down Expand Up @@ -108,18 +108,18 @@ static void AluEvqp(struct Machine *m, u32 rde, const aluop_f ops[4]) {
}
}

void OpNotEvqp(struct Machine *m, u32 rde) {
void OpNotEvqp(struct Machine *m, u64 rde) {
AluEvqp(m, rde, kAlu[ALU_NOT]);
}

void OpNegEvqp(struct Machine *m, u32 rde) {
void OpNegEvqp(struct Machine *m, u64 rde) {
AluEvqp(m, rde, kAlu[ALU_NEG]);
}

void OpIncEvqp(struct Machine *m, u32 rde) {
void OpIncEvqp(struct Machine *m, u64 rde) {
AluEvqp(m, rde, kAlu[ALU_INC]);
}

void OpDecEvqp(struct Machine *m, u32 rde) {
void OpDecEvqp(struct Machine *m, u64 rde) {
AluEvqp(m, rde, kAlu[ALU_DEC]);
}
32 changes: 16 additions & 16 deletions blink/alu2.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
#include "blink/mop.h"
#include "blink/swap.h"

static void Alub(struct Machine *m, u32 rde, aluop_f op) {
static void Alub(struct Machine *m, u64 rde, aluop_f op) {
u8 *p, *q;
p = GetModrmRegisterBytePointerWrite(m, rde);
q = ByteRexrReg(m, rde);
Expand All @@ -50,35 +50,35 @@ static void Alub(struct Machine *m, u32 rde, aluop_f op) {
}
}

void OpAlubAdd(struct Machine *m, u32 rde) {
void OpAlubAdd(struct Machine *m, u64 rde) {
Alub(m, rde, Add8);
}

void OpAlubOr(struct Machine *m, u32 rde) {
void OpAlubOr(struct Machine *m, u64 rde) {
Alub(m, rde, Or8);
}

void OpAlubAdc(struct Machine *m, u32 rde) {
void OpAlubAdc(struct Machine *m, u64 rde) {
Alub(m, rde, Adc8);
}

void OpAlubSbb(struct Machine *m, u32 rde) {
void OpAlubSbb(struct Machine *m, u64 rde) {
Alub(m, rde, Sbb8);
}

void OpAlubAnd(struct Machine *m, u32 rde) {
void OpAlubAnd(struct Machine *m, u64 rde) {
Alub(m, rde, And8);
}

void OpAlubSub(struct Machine *m, u32 rde) {
void OpAlubSub(struct Machine *m, u64 rde) {
Alub(m, rde, Sub8);
}

void OpAlubXor(struct Machine *m, u32 rde) {
void OpAlubXor(struct Machine *m, u64 rde) {
Alub(m, rde, Xor8);
}

void OpAluw(struct Machine *m, u32 rde) {
void OpAluw(struct Machine *m, u64 rde) {
u8 *p, *q;
q = RegRexrReg(m, rde);
if (Rexw(rde)) {
Expand All @@ -91,8 +91,8 @@ void OpAluw(struct Machine *m, u32 rde) {
y = atomic_load_explicit((_Atomic(u64) *)q, memory_order_relaxed);
y = Little64(y);
do {
z = Little64(kAlu[(m->xedd->op.opcode & 070) >> 3][ALU_INT64](
Little64(x), y, &m->flags));
z = Little64(kAlu[(Opcode(rde) & 070) >> 3][ALU_INT64](Little64(x), y,
&m->flags));
} while (!atomic_compare_exchange_weak_explicit((_Atomic(u64) *)p, &x,
z, memory_order_release,
memory_order_relaxed));
Expand All @@ -108,7 +108,7 @@ void OpAluw(struct Machine *m, u32 rde) {
u64 x, y, z;
x = Load64(p);
y = Get64(q);
z = kAlu[(m->xedd->op.opcode & 070) >> 3][ALU_INT64](x, y, &m->flags);
z = kAlu[(Opcode(rde) & 070) >> 3][ALU_INT64](x, y, &m->flags);
Store64(p, z);
}
} else if (!Osz(rde)) {
Expand All @@ -120,8 +120,8 @@ void OpAluw(struct Machine *m, u32 rde) {
y = atomic_load_explicit((_Atomic(u32) *)q, memory_order_relaxed);
y = Little32(y);
do {
z = Little32(kAlu[(m->xedd->op.opcode & 070) >> 3][ALU_INT32](
Little32(x), y, &m->flags));
z = Little32(kAlu[(Opcode(rde) & 070) >> 3][ALU_INT32](Little32(x), y,
&m->flags));
} while (!atomic_compare_exchange_weak_explicit((_Atomic(u32) *)p, &x,
z, memory_order_release,
memory_order_relaxed));
Expand All @@ -132,7 +132,7 @@ void OpAluw(struct Machine *m, u32 rde) {
} else {
x = Load32(p);
y = Get32(q);
z = kAlu[(m->xedd->op.opcode & 070) >> 3][ALU_INT32](x, y, &m->flags);
z = kAlu[(Opcode(rde) & 070) >> 3][ALU_INT32](x, y, &m->flags);
Store32(p, z);
}
if (IsModrmRegister(rde)) {
Expand All @@ -144,7 +144,7 @@ void OpAluw(struct Machine *m, u32 rde) {
p = GetModrmRegisterWordPointerWrite(m, rde, 2);
x = Load16(p);
y = Get16(q);
z = kAlu[(m->xedd->op.opcode & 070) >> 3][ALU_INT16](x, y, &m->flags);
z = kAlu[(Opcode(rde) & 070) >> 3][ALU_INT16](x, y, &m->flags);
Store16(p, z);
}
}
2 changes: 1 addition & 1 deletion blink/blink.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ static int Exec(char *prog, char **argv, char **envp) {
struct Machine *o = g_machine;
unassert((g_machine = NewMachine(NewSystem(), 0)));
g_machine->system->exec = Exec;
g_machine->mode = XED_MACHINE_MODE_LONG_64;
g_machine->mode = XED_MODE_LONG;
LoadProgram(g_machine, prog, argv, envp, &elf);
if (!o) {
AddStdFd(&g_machine->system->fds, 0);
Expand Down
2 changes: 1 addition & 1 deletion blink/clmul.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ static struct clmul clmul(u64 a, u64 b) {
return (struct clmul){x, y};
}

void OpSsePclmulqdq(struct Machine *m, u32 rde) {
void OpSsePclmulqdq(struct Machine *m, u64 rde) {
struct clmul res;
res = clmul(Read64(XmmRexrReg(m, rde) + ((m->xedd->op.uimm0 & 0x01) << 3)),
Read64(GetModrmRegisterXmmPointerRead16(m, rde) +
Expand Down
4 changes: 2 additions & 2 deletions blink/cmpxchg.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
#include "blink/modrm.h"
#include "blink/mop.h"

void OpCmpxchgEbAlGb(struct Machine *m, u32 rde) {
void OpCmpxchgEbAlGb(struct Machine *m, u64 rde) {
bool didit;
if (!IsModrmRegister(rde)) {
#if !defined(__riscv) && !defined(__MICROBLAZE__)
Expand All @@ -54,7 +54,7 @@ void OpCmpxchgEbAlGb(struct Machine *m, u32 rde) {
m->flags = SetFlag(m->flags, FLAGS_ZF, didit);
}

void OpCmpxchgEvqpRaxGvqp(struct Machine *m, u32 rde) {
void OpCmpxchgEvqpRaxGvqp(struct Machine *m, u64 rde) {
bool didit;
u8 *p, *q;
q = RegRexrReg(m, rde);
Expand Down
2 changes: 1 addition & 1 deletion blink/cpuid.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
#include "blink/endian.h"
#include "blink/machine.h"

void OpCpuid(struct Machine *m, u32 rde) {
void OpCpuid(struct Machine *m, u64 rde) {
u32 ax, bx, cx, dx;
ax = 0;
bx = 0;
Expand Down
Loading

0 comments on commit 0c5f15b

Please sign in to comment.