//functions.h //05/07/03 Josh Holtrop //for HOS //Modified: 02/26/04 #ifndef __HOS_FUNCTIONS__ #define __HOS_FUNCTIONS__ __HOS_FUNCTIONS__ #include "hos_defines.h" #include "sys/io.h" #ifdef __cplusplus extern "C" { #endif extern u32_t _code; extern u32_t _bss; extern u32_t _end; #ifdef __cplusplus } #endif //Enables (SeTs) Interrupt Flag on the processor static inline void enable_ints() { asm("sti"); } //Disables (CLears) Interrupt Flag on the processor static inline void disable_ints() { asm("cli"); } //Restarts the computer static inline void restart() { enable_ints(); byte temp; do { temp = inportb(0x64); if (temp & 1) inportb(0x60); } while(temp & 2); outportb (0x64, 0xfe); for (;;) {} } //Halts (freezes) the computer static inline void halt() { asm("cli"); asm("hlt"); while (1) ; } //Initializes 8253 Programmable Interrupt Timer static inline void timer_init(u32_t freq) { u32_t wait = 1193180 / freq; //how many ticks the PIT must wait before issuing an interrupt outportb(0x43, 0x34); outportb(0x40, wait); //lsb outportb(0x40, wait >> 8); //msb } //Returns the size of the kernel (code & data & bss) // - this should be 4kb aligned per the linker script // - this is the amount of RAM the kernel code, data, & bss take static inline u32_t kernel_size_used() { return (u32_t)(&_end)-(u32_t)(&_code); } //Returns the size of the kernel (code & data) // - this does not include the bss section // - this should be 4kb aligned per the linker script // - this should be the size of kernel.bin static inline u32_t kernel_size() { return (u32_t)(&_bss)-(u32_t)(&_code); } //converts a binary-coded-decimal byte to its decimal equivalent static inline byte bcd2byte(byte bcd) { return (10 * ((bcd & 0xF0) >> 4)) + (bcd & 0x0F); } //converts a binary-coded-decimal byte to its decimal equivalent static inline byte byte2bcd(byte bite) { return ((bite / 10) << 4) | (bite % 10); } // get the maximum of two values static inline u32_t max(u32_t v1, u32_t v2) { return ( (v2 > v1) ? v2 : v1 ); } // get the minimum of two values static inline u32_t min(u32_t v1, u32_t v2) { return ( (v2 > v1) ? v1 : v2 ); } #endif