Detect APIC

This commit is contained in:
HyperAssembler 2015-04-16 21:40:57 -07:00
parent 3628eeb97c
commit 13b8912474
3 changed files with 21 additions and 22 deletions

View File

@ -1,6 +1,6 @@
global flush_gdt
global flush_tlb
global get_cpuid
global cpuid
;Functions preserve the registers rbx, rsp, rbp, r12, r13, r14, and 15
;rax, rdi, rsi, rdx, rcx, r8, r9, r10, r11 are scratch registers.
;function parameter: rdi,rsi,rdx,rcx,r8,r9
@ -40,7 +40,7 @@ ret
;void get_cpuid(int64_t* rax, int64_t* rbx, int64_t* rcx, int64_t* rdx)
get_cpuid:
cpuid:
mov rax,[rdi]
push rcx
mov rcx,[rdx]

View File

@ -3,7 +3,6 @@
#include "print.h"
#include "mm.h"
#include "multiboot.h"
#include "linked_list.h"
uint8_t g_gdt[8*9];
gdt_ptr_t g_gdt_ptr;
@ -31,9 +30,6 @@ void NATIVE64 kmain(multiboot_info_t *multiboot_info)
g_gdt_ptr.limit = 8*9-1;
flush_gdt(&g_gdt_ptr, SEG_SELECTOR(1, 0), SEG_SELECTOR(2, 0));
kprintf("Done.\n\n");
linked_list* mm_list = (linked_list*)kmalloc(sizeof(linked_list));
linked_list_init(mm_list);
kprintf("allocated:0x%x\n",(uint64_t)mm_list);
kprintf("*Checking memory information...\n");
if(multiboot_info->flags & (1 << 6))
{
@ -51,25 +47,27 @@ void NATIVE64 kmain(multiboot_info_t *multiboot_info)
}
else if ((mem_map + i)->type == MULTIBOOT_MEMORY_AVAILABLE)
{
phy_mem_info* mm_info = kmalloc(sizeof(phy_mem_info));
linked_list_node_init(&mm_info->node);
mm_info->base = (mem_map+i)->addr;
mm_info->limit = (mem_map+i)->len;
linked_list_add(mm_list,(linked_list_node*)mm_info);
total_available_mem += (mem_map + i)->len;
}
}
kprintf("Total available memory: %uB, %uKB, %uMB.\n", total_available_mem, total_available_mem / 1024, total_available_mem / 1024 / 1024);
kprintf("Total reserved memory: %uB, %uKB, %uMB.\n\n", total_reserved_mem, total_reserved_mem / 1024, total_reserved_mem / 1024 / 1024);
for(int i = 0; i < mm_list->size; i++)
{
phy_mem_info* mem_info = (phy_mem_info*)linked_list_get(mm_list,i);
kprintf("0x%X - 0x%X", mem_info->base, mem_info->limit);
}
}
else
{
kprintf("Memory information is currently unavailable.\n\n");
}
kprintf("CPUIDing \n");
cpuid_t cpuid_info;
cpuid_info.eax = 1;
cpuid_info.ebx = 0;
cpuid_info.ecx = 0;
cpuid_info.edx = 0;
BOCHS_MAGIC_BREAKPOINT();
cpuid(&cpuid_info.eax,&cpuid_info.ebx,&cpuid_info.ecx,&cpuid_info.edx);
if(cpuid_info.edx & 1 << 9)
{
kprintf("AIPC detected...");
}
HLT_CPU();
}

View File

@ -69,12 +69,13 @@ typedef struct __attribute__ ((packed))
uint64_t base;
} gdt_ptr_t;
typedef struct __attribute__ ((packed))
typedef struct __attribute__((packed))
{
linked_list_node node;
uint64_t base;
uint64_t limit;
} phy_mem_info;
uint64_t eax;
uint64_t ebx;
uint64_t ecx;
uint64_t edx;
} cpuid_t;
void*NATIVE64 kmalloc(size_t const size);
void NATIVE64 kfree(void* ptr);
@ -83,7 +84,7 @@ extern void NATIVE64 flush_gdt(gdt_ptr_t *gdt_ptr, uint64_t code_slct, uint64_t
extern void NATIVE64 flush_tlb();
extern void NATIVE64 get_cpuid(int64_t * eax, int64_t * ebx, int64_t* ecx, int64_t* edx);
extern void NATIVE64 cpuid(uint64_t * eax, uint64_t * ebx, uint64_t* ecx, uint64_t* edx);
void NATIVE64 write_segment_descriptor(void *const gdt, uint32_t const base, uint32_t const limit, uint64_t const attr);