From 627150b17061fb503b543812958cde27dd189a35 Mon Sep 17 00:00:00 2001 From: Quinten Kock Date: Sat, 30 Jan 2021 22:10:11 +0100 Subject: [PATCH] implement CPUID --- kernel/src/arch/i386/i386.zig | 1 + kernel/src/arch/x86/cpuid.zig | 54 +++++++++++++++++++++++++++++++ kernel/src/arch/x86/x86.zig | 1 + kernel/src/arch/x86_64/x86_64.zig | 2 +- 4 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 kernel/src/arch/x86/cpuid.zig diff --git a/kernel/src/arch/i386/i386.zig b/kernel/src/arch/i386/i386.zig index e69de29..d0435af 100644 --- a/kernel/src/arch/i386/i386.zig +++ b/kernel/src/arch/i386/i386.zig @@ -0,0 +1 @@ +usingnamespace @import("../x86/x86.zig"); \ No newline at end of file diff --git a/kernel/src/arch/x86/cpuid.zig b/kernel/src/arch/x86/cpuid.zig new file mode 100644 index 0000000..b259236 --- /dev/null +++ b/kernel/src/arch/x86/cpuid.zig @@ -0,0 +1,54 @@ +const std = @import("std"); +const cpuid_c = @cImport(@cInclude("cpuid.h")); + +const cpuid_ret = struct { + eax: u32, + ebx: u32, + ecx: u32, + edx: u32, +}; + +// static inline int cpuid_string(int code, uint32_t where[4]) { +// asm volatile("cpuid":"=a"(*where),"=b"(*(where+1)), +// "=c"(*(where+2)),"=d"(*(where+3)):"a"(code)); +// return (int)where[0]; +// } + +fn getcpuid(leaf: u32) [4]u32 { + // cpuid_c.__cpuid(leaf, &ret.eax, &ret.ebx, &ret.ecx, &ret.edx); + var eax: u32 = undefined; + var ebx: u32 = undefined; + var ecx: u32 = undefined; + var edx: u32 = undefined; + asm volatile("cpuid" + : [eax] "={eax}" (eax), + [ebx] "={ebx}" (ebx), + [ecx] "={ecx}" (ecx), + [edx] "={edx}" (edx), + : [leaf] "{eax}" (leaf) + : + ); + std.log.info("cpuid {x}: {x} {x} {x} {x}", .{leaf, eax, ebx, ecx, edx}); + return .{eax, ebx, ecx, edx}; +} + +var vendor: [12]u8 = undefined; +pub fn getVendor() [12]u8 { + const v = getcpuid(0); + @memcpy(@ptrCast([*]u8, &vendor[0]), @ptrCast([*]const u8, &v[1]), 4); + @memcpy(@ptrCast([*]u8, &vendor[4]), @ptrCast([*]const u8, &v[3]), 4); + @memcpy(@ptrCast([*]u8, &vendor[8]), @ptrCast([*]const u8, &v[2]), 4); + std.log.notice("CPU vendor: {}", .{std.mem.span(&vendor)}); + return vendor; +} + +var name: [48]u8 = undefined; +pub fn getName() []u8 { + var i: u32 = 0x80000002; + while(i <= 0x80000004) : (i+=1) { + const v = getcpuid(i); + @memcpy(@ptrCast([*]u8, &name[(i-0x80000002)*16]), @ptrCast([*]const u8, &v), 16); + } + std.log.notice("CPU model name: {}", .{std.mem.span(&name)}); + return std.mem.span(&name); +} \ No newline at end of file diff --git a/kernel/src/arch/x86/x86.zig b/kernel/src/arch/x86/x86.zig index e69de29..3107aa2 100644 --- a/kernel/src/arch/x86/x86.zig +++ b/kernel/src/arch/x86/x86.zig @@ -0,0 +1 @@ +pub const cpuid = @import("cpuid.zig"); \ No newline at end of file diff --git a/kernel/src/arch/x86_64/x86_64.zig b/kernel/src/arch/x86_64/x86_64.zig index f4a31e0..9c3e412 100644 --- a/kernel/src/arch/x86_64/x86_64.zig +++ b/kernel/src/arch/x86_64/x86_64.zig @@ -1,4 +1,4 @@ -const x86 = @import("src/arch/x86/x86.zig"); +usingnamespace @import("../x86/x86.zig"); pub const paging = @import("paging.zig"); pub const interrupt = @import("interrupt.zig");