Skip to content

Commit fcc10de

Browse files
committed
add verw
1 parent d81c0bb commit fcc10de

3 files changed

Lines changed: 23 additions & 0 deletions

File tree

include/remill/Arch/Runtime/HyperCall.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ class SyncHyperCall {
3535
kX86LoadInterruptDescriptorTable,
3636
kX86LoadAccessRights,
3737
kX86VerifySegmentReadable,
38+
kX86VerifySegmentWritable,
3839
kX86ReadModelSpecificRegister,
3940
kX86WriteModelSpecificRegister,
4041
kX86WriteBackInvalidate,

lib/Arch/Runtime/HyperCall.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,19 @@ Memory *__remill_sync_hyper_call(State &state, Memory *mem,
155155
break;
156156
}
157157

158+
case SyncHyperCall::kX86VerifySegmentWritable: {
159+
const auto selector = static_cast<uint16_t>(state.addr_to_load);
160+
uint8_t zf = 0;
161+
asm volatile("verw %[src] \n\t"
162+
"setz %[zf]"
163+
: [zf] "=qm"(zf)
164+
: [src] "rm"(selector)
165+
: "cc");
166+
state.rflag.zf = zf;
167+
state.aflag.zf = zf;
168+
break;
169+
}
170+
158171
case SyncHyperCall::kX86ReadModelSpecificRegister:
159172
asm volatile("rdmsr"
160173
: "=c"(state.gpr.rcx.dword)

lib/Arch/X86/Semantics/SYSTEM.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,13 @@ DEF_SEM(VERR, S src) {
9292
SyncHyperCall::kX86VerifySegmentReadable);
9393
}
9494

95+
template <typename S>
96+
DEF_SEM(VERW, S src) {
97+
state.addr_to_load = ZExtTo<uint64_t>(TruncTo<uint16_t>(Read(src)));
98+
return __remill_sync_hyper_call(state, memory,
99+
SyncHyperCall::kX86VerifySegmentWritable);
100+
}
101+
95102
DEF_SEM(LGDT, M32 src) {
96103
memory =
97104
__remill_sync_hyper_call(state, memory, SyncHyperCall::kAssertPrivileged);
@@ -250,6 +257,8 @@ DEF_ISEL(LSL_GPRv_GPRz_32) = LSL<R32W, R32, R32>;
250257
IF_64BIT(DEF_ISEL(LSL_GPRv_GPRz_64) = LSL<R64W, R64, R32>;)
251258
DEF_ISEL(VERR_MEMw) = VERR<M16>;
252259
DEF_ISEL(VERR_GPR16) = VERR<R16>;
260+
DEF_ISEL(VERW_MEMw) = VERW<M16>;
261+
DEF_ISEL(VERW_GPR16) = VERW<R16>;
253262
DEF_ISEL(MOV_CR_CR_GPR32_CR0) =
254263
WRITE_CONTROL_REG_32<SyncHyperCall::kX86SetControlReg0>;
255264
DEF_ISEL(MOV_CR_CR_GPR32_CR1) =

0 commit comments

Comments
 (0)