* Read from segment selector, control and general purpose register of VMCB. */
| 161 | * Read from segment selector, control and general purpose register of VMCB. |
| 162 | */ |
| 163 | int |
| 164 | vmcb_read(struct svm_softc *sc, int vcpu, int ident, uint64_t *retval) |
| 165 | { |
| 166 | struct vmcb *vmcb; |
| 167 | struct vmcb_state *state; |
| 168 | struct vmcb_segment *seg; |
| 169 | int err; |
| 170 | |
| 171 | vmcb = svm_get_vmcb(sc, vcpu); |
| 172 | state = &vmcb->state; |
| 173 | err = 0; |
| 174 | |
| 175 | if (VMCB_ACCESS_OK(ident)) |
| 176 | return (vmcb_access(sc, vcpu, 0, ident, retval)); |
| 177 | |
| 178 | switch (ident) { |
| 179 | case VM_REG_GUEST_CR0: |
| 180 | *retval = state->cr0; |
| 181 | break; |
| 182 | |
| 183 | case VM_REG_GUEST_CR2: |
| 184 | *retval = state->cr2; |
| 185 | break; |
| 186 | |
| 187 | case VM_REG_GUEST_CR3: |
| 188 | *retval = state->cr3; |
| 189 | break; |
| 190 | |
| 191 | case VM_REG_GUEST_CR4: |
| 192 | *retval = state->cr4; |
| 193 | break; |
| 194 | |
| 195 | case VM_REG_GUEST_DR6: |
| 196 | *retval = state->dr6; |
| 197 | break; |
| 198 | |
| 199 | case VM_REG_GUEST_DR7: |
| 200 | *retval = state->dr7; |
| 201 | break; |
| 202 | |
| 203 | case VM_REG_GUEST_EFER: |
| 204 | *retval = state->efer; |
| 205 | break; |
| 206 | |
| 207 | case VM_REG_GUEST_RAX: |
| 208 | *retval = state->rax; |
| 209 | break; |
| 210 | |
| 211 | case VM_REG_GUEST_RFLAGS: |
| 212 | *retval = state->rflags; |
| 213 | break; |
| 214 | |
| 215 | case VM_REG_GUEST_RIP: |
| 216 | *retval = state->rip; |
| 217 | break; |
| 218 | |
| 219 | case VM_REG_GUEST_RSP: |
| 220 | *retval = state->rsp; |
no test coverage detected