Added screenfetch
This commit is contained in:
@@ -1,11 +1,11 @@
|
||||
OBJS = tty.o gdt.o idt.o isr.o timer.o keyboard.o \
|
||||
fs.o
|
||||
fs.o cpuid.o
|
||||
|
||||
CC = i686-elf-gcc # cross-compiler
|
||||
CFLAGS = -m32 -fno-stack-protector -ffreestanding -Wall -Wextra -Werror -g -c
|
||||
CFLAGS = -m32 -fno-stack-protector -DDEFAULT_USER=root -DDEFAULT_HOSTNAME=vulcan -ffreestanding -Wall -Wextra -Werror -g -c
|
||||
|
||||
|
||||
all:${OBJS}
|
||||
|
||||
%.o: %.c
|
||||
$(CC) $(CFLAGS) $< -o $@
|
||||
$(CC) $(CFLAGS) $< -o $@
|
||||
|
||||
195
kernel/drivers/cpuid.c
Normal file
195
kernel/drivers/cpuid.c
Normal file
@@ -0,0 +1,195 @@
|
||||
#include "cpuid.h"
|
||||
#include "../libc/string.h"
|
||||
#define INTEL_MAGIC_NUMBER 0x756e6547
|
||||
#define AMD_MAGIC_NUMBER 0x68747541
|
||||
#define UNRECOGNIZED_CPU 0xBADFF
|
||||
|
||||
static cpuid_t get_cpuid(icpuid_t cpu);
|
||||
static icpuid_t detect_cpu(void);
|
||||
static icpuid_t intel_cpu(void);
|
||||
static icpuid_t amd_cpu(void);
|
||||
static icpuid_t generic_cpu(void);
|
||||
|
||||
icpuid_t detect_cpu(void) {
|
||||
uint32_t ebx, null;
|
||||
icpuid_t i_cpu;
|
||||
|
||||
cpuid(0, null, ebx, null, null);
|
||||
|
||||
// Select CPU brand
|
||||
switch(ebx) {
|
||||
case INTEL_MAGIC_NUMBER:
|
||||
i_cpu = intel_cpu();
|
||||
break;
|
||||
case AMD_MAGIC_NUMBER:
|
||||
i_cpu = amd_cpu();
|
||||
break;
|
||||
default:
|
||||
i_cpu = generic_cpu();
|
||||
break;
|
||||
}
|
||||
|
||||
return i_cpu;
|
||||
}
|
||||
|
||||
icpuid_t intel_cpu(void) {
|
||||
uint32_t eax, ebx, null;
|
||||
icpuid_t icpu;
|
||||
|
||||
// Fill the structure
|
||||
cpuid(1, eax, ebx, null, null);
|
||||
icpu.model = (eax >> 4) & 0xF;
|
||||
icpu.family = (eax >> 8) & 0xF;
|
||||
icpu.type = (eax >> 12) & 0xF;
|
||||
icpu.brand = INTEL_MAGIC_NUMBER;
|
||||
icpu.stepping = eax & 0xF;
|
||||
icpu.reserved = eax >> 14;
|
||||
|
||||
return icpu;
|
||||
}
|
||||
|
||||
icpuid_t amd_cpu(void) {
|
||||
uint32_t eax, null;
|
||||
icpuid_t icpu;
|
||||
|
||||
// Fill the structure
|
||||
cpuid(1, eax, null, null, null);
|
||||
icpu.model = (eax >> 4) & 0xF;
|
||||
icpu.family = (eax >> 8) & 0xF;
|
||||
icpu.stepping = eax & 0xF;
|
||||
icpu.reserved = eax >> 12;
|
||||
icpu.brand = AMD_MAGIC_NUMBER;
|
||||
|
||||
return icpu;
|
||||
}
|
||||
|
||||
icpuid_t generic_cpu(void) {
|
||||
icpuid_t icpu;
|
||||
|
||||
icpu.brand = UNRECOGNIZED_CPU; // Magic number for unknown CPUs
|
||||
|
||||
return icpu;
|
||||
}
|
||||
|
||||
cpuid_t get_cpuid(icpuid_t cpu) {
|
||||
cpuid_t cpuid;
|
||||
uint8_t model[64];
|
||||
|
||||
// Recognize CPU brand
|
||||
if(cpu.brand == AMD_MAGIC_NUMBER) {
|
||||
switch(cpu.family) {
|
||||
case 4:
|
||||
strcpy(model, (uint8_t*)"486 model "); // Set model name
|
||||
strcat(model, (void*)cpu.model); // Set model version
|
||||
cpuid.model = model;
|
||||
break;
|
||||
case 5:
|
||||
switch(cpu.model) {
|
||||
case 0:
|
||||
case 1:
|
||||
case 2:
|
||||
case 3:
|
||||
case 4:
|
||||
case 5:
|
||||
case 6:
|
||||
case 7:
|
||||
strcpy(model, (uint8_t*)"K6 model "); // Set model name
|
||||
strcat(model, (void*)cpu.model); // Set model version
|
||||
cpuid.model = model;
|
||||
break;
|
||||
case 8:
|
||||
strcpy(model, (uint8_t*)"K6-2 model "); // Set model name
|
||||
strcat(model, (void*)cpu.model); // Set model version
|
||||
cpuid.model = model;
|
||||
break;
|
||||
case 9:
|
||||
strcpy(model, (uint8_t*)"K6-III model "); // Set model name
|
||||
strcat(model, (void*)cpu.model); // Set model version
|
||||
cpuid.model = model;
|
||||
break;
|
||||
default:
|
||||
strcpy(model, (uint8_t*)"K5/K6 model "); // Set model name
|
||||
strcat(model, (void*)cpu.model); // Set model version
|
||||
cpuid.model = model;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 6:
|
||||
switch(cpu.model) {
|
||||
case 1:
|
||||
case 2:
|
||||
case 3:
|
||||
cpuid.model = (uint8_t*)"Duron model 3";
|
||||
break;
|
||||
case 4:
|
||||
strcpy(model, (uint8_t*)"Athlon model ");
|
||||
strcat(model, (void*)cpu.model);
|
||||
cpuid.model = model;
|
||||
break;
|
||||
case 6:
|
||||
cpuid.model = (uint8_t*)"Athlon MP/Mobile Athlon Model 6";
|
||||
break;
|
||||
case 7:
|
||||
cpuid.model = (uint8_t*)"Mobile Duron Model 7";
|
||||
break;
|
||||
default:
|
||||
strcpy(model, (uint8_t*)"Duron/Athlon model ");
|
||||
strcat(model, (void*)cpu.model);
|
||||
cpuid.model = model;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
} else if(cpu.brand == INTEL_MAGIC_NUMBER) {
|
||||
switch(cpu.type) {
|
||||
case 0:
|
||||
cpuid.type =(uint8_t*)"Original OEM";
|
||||
break;
|
||||
case 1:
|
||||
cpuid.type = (uint8_t*)"Overdrive";
|
||||
break;
|
||||
case 2:
|
||||
cpuid.type = (uint8_t*)"Dual-capable";
|
||||
break;
|
||||
case 3:
|
||||
cpuid.type = (uint8_t*)"Reserved";
|
||||
break;
|
||||
}
|
||||
|
||||
switch(cpu.family) {
|
||||
case 3:
|
||||
cpuid.family = (uint8_t*)"i386";
|
||||
break;
|
||||
case 4:
|
||||
cpuid.family = (uint8_t*)"i486";
|
||||
break;
|
||||
case 5:
|
||||
cpuid.family = (uint8_t*)"Pentium II Model 5/Xeon/Celeron";
|
||||
break;
|
||||
case 6:
|
||||
cpuid.family = (uint8_t*)"Pentium Pro";
|
||||
break;
|
||||
case 15:
|
||||
cpuid.family = (uint8_t*)"Pentium 4";
|
||||
break;
|
||||
}
|
||||
} else if(cpu.brand == UNRECOGNIZED_CPU)
|
||||
cpuid.family = (uint8_t*)"Generic (x86) CPU";
|
||||
|
||||
return cpuid;
|
||||
}
|
||||
|
||||
uint8_t *get_cpu_type() {
|
||||
icpuid_t icpu = detect_cpu(); // Detect CPU brand(Intel, AMD or generic x86)
|
||||
cpuid_t cpu_type = get_cpuid(icpu);
|
||||
|
||||
return (uint8_t*)cpu_type.type;
|
||||
}
|
||||
|
||||
uint8_t *get_cpu_family() {
|
||||
icpuid_t icpu = detect_cpu(); // Detect CPU brand(Intel, AMD or generic x86)
|
||||
cpuid_t cpu_family = get_cpuid(icpu);
|
||||
|
||||
return (uint8_t*)cpu_family.family;
|
||||
|
||||
}
|
||||
36
kernel/drivers/cpuid.h
Normal file
36
kernel/drivers/cpuid.h
Normal file
@@ -0,0 +1,36 @@
|
||||
/**************************************
|
||||
* VulcanOS Kernel *
|
||||
* Developed by Marco 'icebit' Cetica *
|
||||
* (c) 2019-2021 *
|
||||
* Released under GPLv3 *
|
||||
* https://github.com/ice-bit/iceOS *
|
||||
***************************************/
|
||||
#ifndef CPUID_H
|
||||
#define CPUID_H
|
||||
|
||||
#include <stdint.h>
|
||||
#define cpuid(in, a, b, c, d) __asm__("cpuid": "=a" (a), "=b"(b), "=d" (d) : "a" (in));
|
||||
|
||||
typedef struct {
|
||||
uint32_t model;
|
||||
uint32_t family;
|
||||
uint32_t type;
|
||||
uint32_t brand;
|
||||
uint32_t stepping;
|
||||
uint32_t reserved;
|
||||
} icpuid_t;
|
||||
|
||||
typedef struct {
|
||||
uint8_t *model;
|
||||
uint8_t *family;
|
||||
uint8_t *type;
|
||||
uint8_t *brand;
|
||||
uint8_t *stepping;
|
||||
uint8_t *reserved;
|
||||
} cpuid_t;
|
||||
|
||||
// return type and family processor
|
||||
uint8_t *get_cpu_type();
|
||||
uint8_t *get_cpu_family();
|
||||
|
||||
#endif
|
||||
@@ -5,6 +5,8 @@
|
||||
#define VGA_PTR ((uint8_t*) VIDEO_MEM_ADDR) // Pointer to frame buffer
|
||||
// Also define a 2 byte pointer because cells are 16 bits wide
|
||||
#define UVGA_PTR ((uint16_t *)VIDEO_MEM_ADDR)
|
||||
#define STRINGIZE(x) #x
|
||||
#define STRINGIZE_VALUE_OF(x) STRINGIZE(x)
|
||||
|
||||
static uint32_t fb_col = 1; // X
|
||||
static uint32_t fb_row = 0; // Y
|
||||
@@ -95,8 +97,24 @@ void kprint_dec(uint32_t num) {
|
||||
}
|
||||
|
||||
void init_prompt() {
|
||||
uint8_t *prompt = (uint8_t*)"\nring0@iceOS-$ ";
|
||||
kprint_c(prompt, strlen(prompt), LIGHT_RED, BLACK);
|
||||
uint8_t user[64], hostname[64];
|
||||
#ifdef DEFAULT_USER
|
||||
strcpy(user, (uint8_t*)STRINGIZE_VALUE_OF(DEFAULT_USER));
|
||||
#else
|
||||
#error "-DDEFAULT_USER flag not set"
|
||||
#endif
|
||||
|
||||
#ifdef DEFAULT_HOSTNAME
|
||||
strcpy(hostname, (uint8_t*)STRINGIZE_VALUE_OF(DEFAULT_HOSTNAME));
|
||||
#else
|
||||
#error "-DDEFAULT_HOSTNAME flag not set"
|
||||
#endif
|
||||
|
||||
newline();
|
||||
kprint_c(user, strlen(user), LIGHT_GREEN, BLACK);
|
||||
kprint_c((uint8_t*)"@", 1, BROWN, BLACK);
|
||||
kprint_c(hostname, strlen(hostname), CYAN, BLACK);
|
||||
kprint_c((uint8_t*)" #> ", 4, LIGHT_BROWN, BLACK);
|
||||
}
|
||||
|
||||
void clear_prompt() {
|
||||
|
||||
@@ -46,7 +46,6 @@ enum TTY_COLORS {
|
||||
#define VGA_LOW_BYTE 15
|
||||
|
||||
/* Kernel's VGA API */
|
||||
// FIXME: Set these functions to static
|
||||
void write_cell(int16_t i, uint8_t c, uint8_t fg, uint8_t bg);
|
||||
void move_cursor(uint16_t pos);
|
||||
void cursor_adv();
|
||||
|
||||
Reference in New Issue
Block a user