86 lines
2.3 KiB
C
86 lines
2.3 KiB
C
// System information program
|
|
// Author: xamidev
|
|
// Licensed under the Unlicense. See the repo below.
|
|
// https://github.com/xamidev/blankos
|
|
|
|
#include "../kernel/sysinfo.h"
|
|
#include "../libc/stdio.h"
|
|
#include "../kernel/system.h"
|
|
#include "../libc/string.h"
|
|
|
|
extern unsigned int multiboot_info_address;
|
|
|
|
typedef struct multiboot_memory_map
|
|
{
|
|
unsigned int size;
|
|
unsigned int base_addr_low;
|
|
unsigned int base_addr_high;
|
|
unsigned int length_low;
|
|
unsigned int length_high;
|
|
unsigned int type;
|
|
} multiboot_memory_map_t;
|
|
|
|
void get_cpuid()
|
|
{
|
|
// CPUid
|
|
|
|
unsigned int eax, edx;
|
|
char vendor[13];
|
|
unsigned int* v = (unsigned int*)vendor;
|
|
|
|
asm volatile("cpuid"
|
|
: "=b"(v[0]), "=d"(v[1]), "=c"(v[2])
|
|
: "a"(0));
|
|
vendor[12] = '\0';
|
|
|
|
cpuid(1, &eax, &edx);
|
|
unsigned int model = (eax >> 4) & 0xF;
|
|
unsigned int family = (eax >> 8) & 0xF;
|
|
|
|
printf("CPU information\n\tvendor: %s\n\tfamily: %u\n\tmodel: %u\n\tfeatures: 0x%x\n", vendor, family, model, edx);
|
|
}
|
|
|
|
// Not really working anymore as it was made for multiboot1, now using multiboot2
|
|
void get_meminfo(unsigned int multiboot_info_address, int verbose)
|
|
{
|
|
// RAM
|
|
|
|
unsigned int mem_lower = *((unsigned int*)(multiboot_info_address + 4));
|
|
unsigned int mem_upper = *((unsigned int*)(multiboot_info_address + 8));
|
|
|
|
printf("RAM information\n\tLower memory: %u KB\n\tUpper memory: %u KB\n", mem_lower, mem_upper);
|
|
|
|
if (verbose)
|
|
{
|
|
multiboot_memory_map_t* mmap = (multiboot_memory_map_t*)*((unsigned int*)(multiboot_info_address + 44));
|
|
printf("Memory map:\nBase addr | Length | Type\n----------------------------------------------------\n");
|
|
|
|
while ((unsigned int)mmap < multiboot_info_address + *((unsigned int*)(multiboot_info_address + 40)))
|
|
{
|
|
/*
|
|
if (mmap->length_high != 0 && mmap->length_low != 0)
|
|
{*/
|
|
printf("0x%x%x | 0x%x%x | %u\n",
|
|
mmap->base_addr_high, mmap->base_addr_low,
|
|
mmap->length_high, mmap->length_low,
|
|
mmap->type);
|
|
//}
|
|
|
|
mmap = (multiboot_memory_map_t*)((unsigned int)mmap + mmap->size + sizeof(unsigned int));
|
|
}
|
|
}
|
|
}
|
|
|
|
void program_sysinfo(int argc, char* argv[])
|
|
{
|
|
if (argc == 1)
|
|
{
|
|
get_cpuid();
|
|
get_meminfo(g_multiboot_info_address, 0);
|
|
} else if (argc == 2 && strcmp(argv[1], "-v") == 0)
|
|
{
|
|
get_cpuid();
|
|
get_meminfo(g_multiboot_info_address, 1);
|
|
}
|
|
}
|