An error occurred while loading the file. Please try again.
-
zyf authored3e6ab325
/* 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));