Skip to content

Commit 8b29ce1

Browse files
jsun26inteljren1
authored andcommitted
HV Cx: allow guest to access host idle port
with this patch guest could access idle io port and enter idle normally. Signed-off-by: Victor Sun <victor.sun@intel.com> Acked-by: Kevin Tian <kevin.tian@intel.com>
1 parent ebf184f commit 8b29ce1

File tree

3 files changed

+33
-0
lines changed

3 files changed

+33
-0
lines changed

hypervisor/arch/x86/guest/pm.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,24 @@ static void vm_setup_cpu_cx(struct vm *vm)
110110

111111
}
112112

113+
static inline void init_cx_port(struct vm *vm)
114+
{
115+
uint8_t cx_idx;
116+
117+
for (cx_idx = 2; cx_idx <= vm->pm.cx_cnt; cx_idx++) {
118+
struct cpu_cx_data *cx_data = vm->pm.cx_data + cx_idx;
119+
120+
if (cx_data->cx_reg.space_id == SPACE_SYSTEM_IO) {
121+
uint16_t port = (uint16_t)cx_data->cx_reg.address;
122+
123+
allow_guest_io_access(vm, port, 1);
124+
}
125+
}
126+
}
127+
113128
void vm_setup_cpu_state(struct vm *vm)
114129
{
115130
vm_setup_cpu_px(vm);
116131
vm_setup_cpu_cx(vm);
132+
init_cx_port(vm);
117133
}

hypervisor/arch/x86/io.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,22 @@ void free_io_emulation_resource(struct vm *vm)
190190
free(vm->arch_vm.iobitmap[1]);
191191
}
192192

193+
void allow_guest_io_access(struct vm *vm, uint32_t address, uint32_t nbytes)
194+
{
195+
uint32_t *b;
196+
uint32_t i;
197+
uint32_t a;
198+
199+
b = vm->arch_vm.iobitmap[0];
200+
for (i = 0; i < nbytes; i++) {
201+
if (address & 0x8000)
202+
b = vm->arch_vm.iobitmap[1];
203+
a = address & 0x7fff;
204+
b[a >> 5] &= ~(1 << (a & 0x1f));
205+
address++;
206+
}
207+
}
208+
193209
static void deny_guest_io_access(struct vm *vm, uint32_t address, uint32_t nbytes)
194210
{
195211
uint32_t *b;

hypervisor/include/arch/x86/io.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@ struct vm_io_handler {
170170
int io_instr_vmexit_handler(struct vcpu *vcpu);
171171
void setup_io_bitmap(struct vm *vm);
172172
void free_io_emulation_resource(struct vm *vm);
173+
void allow_guest_io_access(struct vm *vm, uint32_t address, uint32_t nbytes);
173174
void register_io_emulation_handler(struct vm *vm, struct vm_io_range *range,
174175
io_read_fn_t io_read_fn_ptr,
175176
io_write_fn_t io_write_fn_ptr);

0 commit comments

Comments
 (0)