Skip to content

Commit fcd24b2

Browse files
committed
Create temp variable for lgdt and lidt handling
1 parent 41862cb commit fcd24b2

File tree

2 files changed

+11
-8
lines changed

2 files changed

+11
-8
lines changed

include/remill/Arch/Runtime/Intrinsics.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,7 @@ __remill_write_io_port_16(Memory *, addr_t, uint16_t);
303303
[[gnu::used, gnu::const]] extern Memory *
304304
__remill_write_io_port_32(Memory *, addr_t, uint32_t);
305305

306+
// More specific hyper calls.
306307
[[gnu::used, gnu::const]] extern Memory *
307308
__remill_aarch64_emulate_instruction(Memory *);
308309

@@ -312,4 +313,7 @@ __remill_aarch32_emulate_instruction(Memory *);
312313
[[gnu::used, gnu::const]] extern Memory *
313314
__remill_aarch32_check_not_el2(Memory *);
314315

316+
[[gnu::used, gnu::const]] extern Memory *
317+
__remill_sparc_unimplemented_instruction(Memory *);
318+
315319
} // extern C

lib/Arch/Runtime/HyperCall.cpp

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,13 @@ Memory *__remill_sync_hyper_call(State &state, Memory *mem,
4242
break;
4343

4444
case SyncHyperCall::kX86LoadGlobalDescriptorTable:
45-
asm volatile("lgdt"
46-
:
47-
: "=m"(__remill_read_memory_64(mem, state.addr_to_load)));
45+
auto read = __remill_read_memory_64(mem, state.addr_to_load);
46+
asm volatile("lgdt" : : "m"(read));
4847
break;
4948

5049
case SyncHyperCall::kX86LoadInterruptDescriptorTable:
51-
asm volatile("lidt"
52-
:
53-
: "m"(__remill_read_memory_64(mem, state.addr_to_load)));
50+
auto read = __remill_write_memory_64(mem, state.addr_to_load);
51+
asm volatile("lidt" : : "m"(read));
5452
break;
5553

5654
case SyncHyperCall::kX86ReadModelSpecificRegister:
@@ -66,7 +64,6 @@ Memory *__remill_sync_hyper_call(State &state, Memory *mem,
6664
break;
6765

6866
case SyncHyperCall::kX86WriteBackInvalidate:
69-
// NOTE(alex): This just clears cache so there's no affect on the state.
7067
asm volatile("wbinvd" :);
7168
break;
7269

@@ -138,7 +135,9 @@ Memory *__remill_sync_hyper_call(State &state, Memory *mem,
138135

139136
case SyncHyperCall::kSPARCTagOverflow: break;
140137

141-
case SyncHyperCall::kSPARCUnimplementedInstruction: break;
138+
case SyncHyperCall::kSPARCUnimplementedInstruction:
139+
mem = __remill_sparc_unimplemented_instruction(mem);
140+
break;
142141

143142
case SyncHyperCall::kSPARCUnhandledDCTI: break;
144143

0 commit comments

Comments
 (0)