• zyf's avatar
    update · 3e6ab325
    zyf authored
    3e6ab325
system.h 11.00 KiB
/* bkerndev - Bran's Kernel Development Tutorial
*  By:   Brandon F. (friesenb@gmail.com)
*  Desc: Global function declarations and type definitions
*  Notes: No warranty expressed or implied. Use at own risk. */
#ifndef __SYSTEM_H
#define __SYSTEM_H
typedef int size_t;
typedef unsigned long int addr;
/* This defines what the stack looks like after an ISR was running */
struct regs
    unsigned int gs, fs, es, ds;
    unsigned int edi, esi, ebp, esp, ebx, edx, ecx, eax;
    unsigned int int_no, err_code;
    unsigned int eip, cs, eflags, useresp, ss;    
/* MAIN.C */
extern void* memcpy(void* dest, const void* src, int count);
extern void* memset(void* dest, unsigned char val, int count);
extern unsigned short* memsetw(unsigned short* dest, unsigned short val, int count);
extern unsigned char inportb(unsigned short _port);
extern void outportb(unsigned short _port, unsigned char _data);
/* CONSOLE.C */
extern void init_video(void);
extern void puts(unsigned char *text);
extern void putch(unsigned char c);
extern void cls();
/* GDT.C */
extern void gdt_flush();
extern void gdt_set_gate(int num, unsigned long base, unsigned long limit, unsigned char access, unsigned char gran);
extern void gdt_install();
/* IDT.C */
extern void idt_load();
extern void idt_set_gate(unsigned char num, unsigned long base, unsigned short sel, unsigned char flags);
extern void idt_install();
struct regs
	unsigned int ds;					/* data segment selector */
	unsigned int edi, esi, ebp, esp, ebx, edx, ecx, eax;	/* pushed by 'pusha' */
	unsigned int int_no, err_code;				/* our 'push byte #' and ecodes do this */
	unsigned int eip, cs, eflags, useresp, ss;              /* pushed by the processor automatically */
/* ISRS.C */
extern void isrs_install();
/* IRQ.C */
extern void irq_install_handler(int irq, void (*handler)(struct regs *r));
extern void irq_uninstall_handler(int irq);
extern void irq_install();
/* TIMER.C */
extern void timer_wait(int ticks);
extern void timer_install();
/* KEYBOARD.C */
extern void keyboard_install();
/* Macros used in the bitset algorithms */
#define INDEX_FROM_BIT(a) (a/(8*4))
#define OFFSET_FROM_BIT(a) (a%(8*4))
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
/* FRAME.C */ extern void frame_alloc(struct page* p, int is_kernel, int is_writable); extern void frame_free(struct page* p); /*kmem*/ extern addr kmalloc_a(addr size); extern addr kmalloc_p(addr size, addr* phys); extern addr kmalloc_ap(addr size, addr* phys); extern addr kmalloc(addr size); extern void kfree(addr pos); extern addr kmem_total(); extern void kmem_install(struct multiboot_info* mbt); /* Multiboot structure definitions for information passed * by GRUB to the main() function */ struct multiboot_header { unsigned long magic, flags, checksum; unsigned long header_addr; unsigned long load_addr, load_end_addr; unsigned long bss_end_addr; unsigned long entry_addr; } __attribute__((packed)); struct aout_symbol_table { unsigned long tabsize; unsigned long strsize; unsigned long addr; unsigned long reserved; } __attribute__((packed)); struct multiboot_info { unsigned long flags; unsigned long mem_lower, mem_upper; unsigned long boot_device; unsigned long cmdline; unsigned long mods_count, mods_addr; struct aout_symbol_table symbols; unsigned long mmap_length; unsigned long mmap_addr; } __attribute__((packed)); struct multiboot_memory_map { unsigned int size; unsigned long long int base_addr; unsigned long long int length; unsigned int type; } __attribute__((packed)); /*page*/ /* Structures */ typedef struct page { unsigned int present : 1; /* Page present in memory */ unsigned int rw : 1; /* Read-only if clear, read-write if set */ unsigned int user : 1; /* Supervisor level if clear */ unsigned int accessed : 1; /* Has the page been accessed since last refresh? */ unsigned int dirty : 1; /* Has the page been written since last refresh? */ unsigned int unused : 7; /* Amalgamation of unused and reserved bits */ unsigned int frame : 20; /* Frame address (shifted 12 bits */ } page_t; struct page_table { struct page pages[1024]; } __attribute__((packed));