diff --git a/repos/base/include/spec/x86/cpu/vm_state.h b/repos/base/include/spec/x86/cpu/vm_state.h new file mode 100644 index 000000000..1018b44ae --- /dev/null +++ b/repos/base/include/spec/x86/cpu/vm_state.h @@ -0,0 +1,146 @@ +/* + * \brief CPU context of a virtual machine for x86 + * \author Alexander Boettcher + * \date 2018-10-09 + */ + +/* + * Copyright (C) 2018 Genode Labs GmbH + * + * This file is part of the Genode OS framework, which is distributed + * under the terms of the GNU Affero General Public License version 3. + */ + +#ifndef _INCLUDE__SPEC__X86__CPU__VM_STATE_H_ +#define _INCLUDE__SPEC__X86__CPU__VM_STATE_H_ + +#include + +namespace Genode +{ + struct Vm_state; +} + +struct Genode::Vm_state +{ + template + class Register + { + private: + + bool _valid; + T _value { }; + + public: + + Register() : _valid(false) { } + Register(T value) : _valid(true), _value(value) { } + + T value() const { return _value; } + void value(T value) { _value = value; _valid = true; } + + bool valid() const { return _valid; } + void invalid() { _valid = false; } + + Register &operator = (Register const &other) + { + _valid = other._valid; + /* keep original _value if other._valid is not valid */ + if (_valid) + _value = other._value; + + return *this; + } + }; + + struct Range { + addr_t base; + uint32_t limit; + }; + + struct Segment { + uint16_t sel, ar; + uint32_t limit; + addr_t base; + }; + + Register ax; + Register cx; + Register dx; + Register bx; + + Register bp; + Register si; + Register di; + + Register sp; + Register ip; + Register ip_len; + Register flags; + + Register es; + Register ds; + Register fs; + Register gs; + Register cs; + Register ss; + Register tr; + Register ldtr; + + Register gdtr; + Register idtr; + + Register cr0; + Register cr2; + Register cr3; + Register cr4; + + Register dr7; + + Register sysenter_ip; + Register sysenter_sp; + Register sysenter_cs; + + Register qual_primary; + Register qual_secondary; + + Register ctrl_primary; + Register ctrl_secondary; + + Register inj_info; + Register inj_error; + + Register intr_state; + Register actv_state; + + Register tsc; + Register tsc_offset; + + Register efer; + + Register pdpte_0; + Register pdpte_1; + Register pdpte_2; + Register pdpte_3; + + Register r8; + Register r9; + Register r10; + Register r11; + Register r12; + Register r13; + Register r14; + Register r15; + + Register star; + Register lstar; + Register fmask; + Register kernel_gs_base; + + Register tpr; + Register tpr_threshold; + + unsigned exit_reason; +}; + +#endif /* _INCLUDE__SPEC__X86__CPU__VM_STATE_H_ */