mirror of
https://github.com/EnderIce2/Fennix.git
synced 2025-06-07 20:27:59 +00:00
feat(kernel): ✨ add kvm cpuid structures
This commit is contained in:
parent
905b6933c9
commit
9538589c11
@ -27,6 +27,9 @@ License information can be found in the [LICENSES.md](LICENSES.md) file.
|
|||||||
## CPUID 0x7
|
## CPUID 0x7
|
||||||
- [CPUID](https://en.wikipedia.org/wiki/CPUID)
|
- [CPUID](https://en.wikipedia.org/wiki/CPUID)
|
||||||
|
|
||||||
|
## KVM CPUID
|
||||||
|
- [kernel.org KVM CPUID](https://www.kernel.org/doc/html/v6.9/virt/kvm/x86/cpuid.html?highlight=cpuid)
|
||||||
|
|
||||||
## Network
|
## Network
|
||||||
- [Beej's Guide to Network Programming](https://web.archive.org/web/20051210132103/http://users.pcnet.ro/dmoroian/beej/Beej.html)
|
- [Beej's Guide to Network Programming](https://web.archive.org/web/20051210132103/http://users.pcnet.ro/dmoroian/beej/Beej.html)
|
||||||
- [UDP Socket Programming](https://web.archive.org/web/20060229214053/http://www.cs.rutgers.edu/~pxk/417/notes/sockets/udp.html)
|
- [UDP Socket Programming](https://web.archive.org/web/20060229214053/http://www.cs.rutgers.edu/~pxk/417/notes/sockets/udp.html)
|
||||||
|
202
Kernel/include/cpu/x86/cpuid_kvm.hpp
Normal file
202
Kernel/include/cpu/x86/cpuid_kvm.hpp
Normal file
@ -0,0 +1,202 @@
|
|||||||
|
/*
|
||||||
|
This file is part of Fennix Kernel.
|
||||||
|
|
||||||
|
Fennix Kernel is free software: you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU General Public License as
|
||||||
|
published by the Free Software Foundation, either version 3 of
|
||||||
|
the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
Fennix Kernel is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with Fennix Kernel. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <types.h>
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
|
#if defined(__amd64__)
|
||||||
|
typedef uint64_t cpuid_t;
|
||||||
|
#elif defined(__i386__)
|
||||||
|
typedef uint32_t cpuid_t;
|
||||||
|
#else
|
||||||
|
typedef uint64_t cpuid_t;
|
||||||
|
#endif // __amd64__ || __i386__
|
||||||
|
|
||||||
|
#if defined(__amd64__) || defined(__i386__)
|
||||||
|
#define __kvm_cpuid_init(leaf) \
|
||||||
|
CPUID##leaf() \
|
||||||
|
{ \
|
||||||
|
asmv("cpuid" : "=a"(EAX.raw), "=b"(EBX.raw), \
|
||||||
|
"=c"(ECX.raw), "=d"(EDX.raw) : "a"(leaf)); \
|
||||||
|
if (!EAX.raw && !EBX.raw && !ECX.raw && !EDX.raw) \
|
||||||
|
warn("cpuid not supported"); \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define __kvm_cpuid_init2(leaf, leaf2, suffix) \
|
||||||
|
CPUID##leaf##suffix() \
|
||||||
|
{ \
|
||||||
|
asmv("cpuid" : "=a"(EAX.raw), "=b"(EBX.raw), \
|
||||||
|
"=c"(ECX.raw), "=d"(EDX.raw) : "a"(leaf), "c"(leaf2)); \
|
||||||
|
if (!EAX.raw && !EBX.raw && !ECX.raw && !EDX.raw) \
|
||||||
|
warn("cpuid not supported"); \
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#define __kvm_cpuid_init(leaf) \
|
||||||
|
CPUID##leaf() \
|
||||||
|
{ \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define __kvm_cpuid_init2(leaf, leaf2, suffix) \
|
||||||
|
CPUID##leaf##suffix() \
|
||||||
|
{ \
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace CPU
|
||||||
|
{
|
||||||
|
namespace x86
|
||||||
|
{
|
||||||
|
namespace KVM
|
||||||
|
{
|
||||||
|
/* KVM_CPUID_SIGNATURE */
|
||||||
|
struct CPUID0x40000000
|
||||||
|
{
|
||||||
|
__kvm_cpuid_init(0x40000000);
|
||||||
|
|
||||||
|
union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uint32_t MaximumFunction : 32;
|
||||||
|
};
|
||||||
|
cpuid_t raw;
|
||||||
|
} EAX;
|
||||||
|
|
||||||
|
union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
char Vendor[4];
|
||||||
|
};
|
||||||
|
cpuid_t raw;
|
||||||
|
} EBX;
|
||||||
|
|
||||||
|
union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
char Vendor[4];
|
||||||
|
};
|
||||||
|
cpuid_t raw;
|
||||||
|
} ECX;
|
||||||
|
|
||||||
|
union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
char Vendor[4];
|
||||||
|
};
|
||||||
|
cpuid_t raw;
|
||||||
|
} EDX;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* KVM_CPUID_FEATURES */
|
||||||
|
struct CPUID0x40000001
|
||||||
|
{
|
||||||
|
__kvm_cpuid_init(0x40000001);
|
||||||
|
|
||||||
|
union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
/** kvmclock available at msrs 0x11 and 0x12 */
|
||||||
|
uint32_t KVM_FEATURE_CLOCKSOURCE : 1;
|
||||||
|
|
||||||
|
/** not necessary to perform delays on PIO operations */
|
||||||
|
uint32_t KVM_FEATURE_NOP_IO_DELAY : 1;
|
||||||
|
|
||||||
|
/** deprecated */
|
||||||
|
uint32_t KVM_FEATURE_MMU_OP : 1;
|
||||||
|
|
||||||
|
/** kvmclock available at msrs 0x4b564d00 and 0x4b564d01 */
|
||||||
|
uint32_t KVM_FEATURE_CLOCKSOURCE2 : 1;
|
||||||
|
|
||||||
|
/** async pf can be enabled by writing to msr 0x4b564d02 */
|
||||||
|
uint32_t KVM_FEATURE_ASYNC_PF : 1;
|
||||||
|
|
||||||
|
/** steal time can be enabled by writing to msr 0x4b564d03 */
|
||||||
|
uint32_t KVM_FEATURE_STEAL_TIME : 1;
|
||||||
|
|
||||||
|
/** paravirtualized end of interrupt handler can be enabled by writing to msr 0x4b564d04 */
|
||||||
|
uint32_t KVM_FEATURE_PV_EOI : 1;
|
||||||
|
|
||||||
|
/** guest checks this feature bit before enabling paravirtualized spinlock support */
|
||||||
|
uint32_t KVM_FEATURE_PV_UNHAULT : 1;
|
||||||
|
|
||||||
|
uint32_t _reserved8 : 1;
|
||||||
|
|
||||||
|
/** guest checks this feature bit before enabling paravirtualized tlb flush */
|
||||||
|
uint32_t KVM_FEATURE_PV_TLB_FLUSH : 1;
|
||||||
|
|
||||||
|
/** paravirtualized async PF VM EXIT can be enabled by setting bit 2 when writing to msr 0x4b564d02 */
|
||||||
|
uint32_t KVM_FEATURE_ASYNC_PF_VMEXIT : 1;
|
||||||
|
|
||||||
|
/** guest checks this feature bit before enabling paravirtualized send IPIs */
|
||||||
|
uint32_t KVM_FEATURE_PV_SEND_IPI : 1;
|
||||||
|
|
||||||
|
/** host-side polling on HLT can be disabled by writing to msr 0x4b564d05 */
|
||||||
|
uint32_t KVM_FEATURE_PV_POLL_CONTROL : 1;
|
||||||
|
|
||||||
|
/** guest checks this feature bit before using paravirtualized sched yield */
|
||||||
|
uint32_t KVM_FEATURE_PV_SCHED_YIELD : 1;
|
||||||
|
|
||||||
|
uint32_t __reserved14_23 : 10;
|
||||||
|
|
||||||
|
/** host will warn if no guest-side per-cpu warps are expected in kvmclock */
|
||||||
|
uint32_t KVM_FEATURE_CLOCKSOURCE_STABLE_BIT : 1;
|
||||||
|
|
||||||
|
uint32_t __reserved25_31 : 7;
|
||||||
|
};
|
||||||
|
cpuid_t raw;
|
||||||
|
} EAX;
|
||||||
|
|
||||||
|
union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uint32_t __reserved0_31;
|
||||||
|
};
|
||||||
|
cpuid_t raw;
|
||||||
|
} EBX;
|
||||||
|
|
||||||
|
union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uint32_t __reserved0_31;
|
||||||
|
};
|
||||||
|
cpuid_t raw;
|
||||||
|
} ECX;
|
||||||
|
|
||||||
|
union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
/** guest checks this feature bit to determine that vCPUs are never preempted for an unlimited time allowing optimizations */
|
||||||
|
uint32_t KVM_HINTS_REALTIME : 1;
|
||||||
|
};
|
||||||
|
cpuid_t raw;
|
||||||
|
} EDX;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef __kvm_cpuid_init
|
||||||
|
#undef __kvm_cpuid_init2
|
Loading…
x
Reference in New Issue
Block a user