Lines Matching +full:segment +full:-

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
52 * - instructions or events in the guest to intercept
53 * - control bits that modify execution environment of the guest
54 * - guest processor state (e.g. general purpose registers)
58 * Return VMCB segment area.
66 state = &vmcb->state; in vmcb_segptr()
70 seg = &state->cs; in vmcb_segptr()
74 seg = &state->ds; in vmcb_segptr()
78 seg = &state->es; in vmcb_segptr()
82 seg = &state->fs; in vmcb_segptr()
86 seg = &state->gs; in vmcb_segptr()
90 seg = &state->ss; in vmcb_segptr()
94 seg = &state->gdt; in vmcb_segptr()
98 seg = &state->idt; in vmcb_segptr()
102 seg = &state->ldt; in vmcb_segptr()
106 seg = &state->tr; in vmcb_segptr()
159 * Read from segment selector, control and general purpose register of VMCB.
170 state = &vmcb->state; in vmcb_read()
178 *retval = state->cr0; in vmcb_read()
182 *retval = state->cr2; in vmcb_read()
186 *retval = state->cr3; in vmcb_read()
190 *retval = state->cr4; in vmcb_read()
194 *retval = state->dr6; in vmcb_read()
198 *retval = state->dr7; in vmcb_read()
202 *retval = state->efer; in vmcb_read()
206 *retval = state->rax; in vmcb_read()
210 *retval = state->rflags; in vmcb_read()
214 *retval = state->rip; in vmcb_read()
218 *retval = state->rsp; in vmcb_read()
230 KASSERT(seg != NULL, ("%s: unable to get segment %d from VMCB", in vmcb_read()
232 *retval = seg->selector; in vmcb_read()
239 KASSERT(seg != NULL, ("%s: unable to get segment %d from VMCB", in vmcb_read()
241 *retval = seg->base; in vmcb_read()
244 *retval = state->kernelgsbase; in vmcb_read()
248 *retval = vlapic_get_cr8(vm_lapic(vcpu->vcpu)); in vmcb_read()
253 /* GDTR and IDTR don't have segment selectors */ in vmcb_read()
265 * Write to segment selector, control and general purpose register of VMCB.
276 state = &vmcb->state; in vmcb_write()
285 state->cr0 = val; in vmcb_write()
290 state->cr2 = val; in vmcb_write()
295 state->cr3 = val; in vmcb_write()
300 state->cr4 = val; in vmcb_write()
305 state->dr6 = val; in vmcb_write()
310 state->dr7 = val; in vmcb_write()
316 state->efer = val | EFER_SVM; in vmcb_write()
321 state->rax = val; in vmcb_write()
325 state->rflags = val; in vmcb_write()
329 state->rip = val; in vmcb_write()
333 state->rsp = val; in vmcb_write()
346 KASSERT(seg != NULL, ("%s: unable to get segment %d from VMCB", in vmcb_write()
348 seg->selector = val; in vmcb_write()
355 /* GDTR and IDTR don't have segment selectors */ in vmcb_write()
390 KASSERT(seg != NULL, ("%s: invalid segment descriptor %d", in vmcb_setdesc()
393 seg->base = desc->base; in vmcb_setdesc()
394 seg->limit = desc->limit; in vmcb_setdesc()
399 * SVM uses the 'P' bit in the segment attributes to indicate a in vmcb_setdesc()
400 * NULL segment so clear it if the segment is marked unusable. in vmcb_setdesc()
402 attrib = ((desc->access & 0xF000) >> 4) | (desc->access & 0xFF); in vmcb_setdesc()
403 if (SEG_DESC_UNUSABLE(desc->access)) { in vmcb_setdesc()
406 seg->attrib = attrib; in vmcb_setdesc()
410 "attrib (%#x)", reg, seg->base, seg->limit, seg->attrib); in vmcb_setdesc()
438 KASSERT(seg != NULL, ("%s: invalid segment descriptor %d", in vmcb_getdesc()
441 desc->base = seg->base; in vmcb_getdesc()
442 desc->limit = seg->limit; in vmcb_getdesc()
443 desc->access = 0; in vmcb_getdesc()
447 desc->access = ((seg->attrib & 0xF00) << 4) | in vmcb_getdesc()
448 (seg->attrib & 0xFF); in vmcb_getdesc()
451 * VT-x uses bit 16 to indicate a segment that has been loaded in vmcb_getdesc()
452 * with a NULL selector (aka unusable). The 'desc->access' in vmcb_getdesc()
453 * field is interpreted in the VT-x format by the in vmcb_getdesc()
454 * processor-independent code. in vmcb_getdesc()
457 * convert it into the VT-x format. For more details refer to in vmcb_getdesc()
458 * section "Segment State in the VMCB" in APMv2. in vmcb_getdesc()
461 if ((desc->access & 0x80) == 0) in vmcb_getdesc()
462 desc->access |= 0x10000; /* Unusable segment */ in vmcb_getdesc()
509 if (meta->op == VM_SNAPSHOT_SAVE) { in vmcb_snapshot_desc()
517 } else if (meta->op == VM_SNAPSHOT_RESTORE) { in vmcb_snapshot_desc()
541 if (meta->op == VM_SNAPSHOT_SAVE) { in vmcb_snapshot_any()
547 } else if (meta->op == VM_SNAPSHOT_RESTORE) { in vmcb_snapshot_any()