CPUID
This commit is contained in:
parent
c0ded6f3a7
commit
6c504cff34
2
Makefile
2
Makefile
|
@ -172,7 +172,7 @@ $(KOBJDIR)/%.o: %.c $(INCLUDEDIR)/*/*.h $(KALEIDDIR)/*/*/*.h | $(KOBJDIR)
|
||||||
@echo ${CL2}[$@] ${CL}Compiled.${CL3}
|
@echo ${CL2}[$@] ${CL}Compiled.${CL3}
|
||||||
|
|
||||||
test: all
|
test: all
|
||||||
@qemu-system-x86_64 -soundhw pcspk -rtc base=localtime -m 4G -hda $(BUILDDIR)/bin/disk.img \
|
@qemu-system-x86_64 -cpu core2duo -soundhw pcspk -rtc base=localtime -m 4G -hda $(BUILDDIR)/bin/disk.img \
|
||||||
-d cpu_reset,guest_errors,pcall,int 2> $(BUILDDIR)/qemu.log &
|
-d cpu_reset,guest_errors,pcall,int 2> $(BUILDDIR)/qemu.log &
|
||||||
|
|
||||||
test32: all
|
test32: all
|
||||||
|
|
|
@ -31,9 +31,6 @@
|
||||||
|
|
||||||
// -------------------------------------------------------------------------- //
|
// -------------------------------------------------------------------------- //
|
||||||
|
|
||||||
typedef struct Registers_t Registers_t;
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------- //
|
|
||||||
|
|
||||||
// CPU features masks
|
// CPU features masks
|
||||||
enum {
|
enum {
|
||||||
|
@ -98,13 +95,21 @@ enum {
|
||||||
|
|
||||||
// -------------------------------------------------------------------------- //
|
// -------------------------------------------------------------------------- //
|
||||||
|
|
||||||
struct Registers_t
|
// Issue a single request to CPUID. Fits 'intel features', for instance
|
||||||
|
// note that even if only "eax" and "edx" are of interest, other registers
|
||||||
|
// will be modified by the operation, so we need to tell the compiler about it.
|
||||||
|
static inline void CpuCpuid(int code, uint *a, uint *d)
|
||||||
{
|
{
|
||||||
ulong ds;
|
asm volatile("cpuid":"=a"(*a),"=d"(*d):"a"(code):"ecx","ebx");
|
||||||
ulong rdi, rsi, rbp, rsp, rbx, rdx, rcx, rax;
|
}
|
||||||
ulong intNo, errCode;
|
|
||||||
ulong rip, cs, eflags, useresp, ss;
|
// Issue a complete request, storing general registers output as a string
|
||||||
} __attribute__((packed));
|
static inline int CpuCpuidString(int code, uint where[4])
|
||||||
|
{
|
||||||
|
asm volatile("cpuid":"=a"(*where),"=b"(*(where+1)),
|
||||||
|
"=c"(*(where+3)),"=d"(*(where+2)):"a"(code));
|
||||||
|
return (int)where[0];
|
||||||
|
}
|
||||||
|
|
||||||
// -------------------------------------------------------------------------- //
|
// -------------------------------------------------------------------------- //
|
||||||
|
|
||||||
|
|
|
@ -24,8 +24,3 @@
|
||||||
|
|
||||||
%include "kaleid/kernel/cpu/cpuf.inc"
|
%include "kaleid/kernel/cpu/cpuf.inc"
|
||||||
|
|
||||||
CpuCpuid:
|
|
||||||
pushAll
|
|
||||||
mov rax, rsi
|
|
||||||
cpuid
|
|
||||||
popAll
|
|
||||||
|
|
|
@ -24,8 +24,9 @@
|
||||||
|
|
||||||
#include <kernel/cpuid.h>
|
#include <kernel/cpuid.h>
|
||||||
|
|
||||||
char *KeGetVendorString(void) {
|
char* CpuGetVendorString(void) {
|
||||||
return "Null";
|
uint where[5] = { 0 };
|
||||||
|
return (char *)&where[1];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -62,7 +62,8 @@ noreturn void BtStartKern(multiboot_info_t *mbInfo, uint mbMagic, void *codeSeg)
|
||||||
IoGetRtcTimeChar();
|
IoGetRtcTimeChar();
|
||||||
IoPrintRtcTime();
|
IoPrintRtcTime();
|
||||||
|
|
||||||
KernLog("%d\n",realKernelEnd);
|
extern void PrintVendorString(void);
|
||||||
|
PrintVendorString();
|
||||||
|
|
||||||
KeStartShell();
|
KeStartShell();
|
||||||
|
|
||||||
|
|
|
@ -139,7 +139,7 @@ void *MmGetFirstAvailZone(void *start) {
|
||||||
|
|
||||||
// Because the kernel is the kernel
|
// Because the kernel is the kernel
|
||||||
if ((ulong)start < (ulong)BtLoaderInfo.kernelEndAddr) {
|
if ((ulong)start < (ulong)BtLoaderInfo.kernelEndAddr) {
|
||||||
return MmGetFirstAvailZone(BtLoaderInfo.kernelEndAddr);
|
return MmGetFirstAvailZone(BtLoaderInfo.kernelEndAddr+1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Search the zone where the start address is
|
// Search the zone where the start address is
|
||||||
|
|
Loading…
Reference in New Issue