1 /* 2 * ----------------------------------------------------------------------- 3 * 4 * Copyright 1994-2008 H. Peter Anvin - All Rights Reserved 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation, Inc., 53 Temple Place Ste 330, 9 * Boston MA 02111-1307, USA; either version 2 of the License, or 10 * (at your option) any later version; incorporated herein by reference. 11 * 12 * ----------------------------------------------------------------------- 13 * 14 * 15 * bios.h 16 * 17 * Header file for the BIOS data structures etc. 18 */ 19 20 #ifndef _BIOS_H 21 #define _BIOS_H 22 23 #include <sys/io.h> 24 25 /* 26 * Interrupt vectors 27 */ 28 #define BIOS_timer_hook (4 * 0x1C) 29 #define fdctab (4 * 0x1E) 30 #define fdctab1 fdctab 31 #define fdctab2 (fdctab + 2) 32 33 #define SERIAL_BASE 0x0400 /* Base address for 4 serial ports */ 34 #define BIOS_fbm 0x0413 /* Free Base Memory (kilobytes) */ 35 #define BIOS_page 0x0462 /* Current video page */ 36 #define BIOS_timer 0x046C /* Timer ticks */ 37 #define BIOS_magic 0x0472 /* BIOS reset magic */ 38 #define BIOS_vidrows 0x0484 /* Number of screen rows */ 39 40 static inline uint16_t bios_fbm(void) 41 { 42 return *(volatile uint16_t *)BIOS_fbm; 43 } 44 45 static inline void set_bios_fbm(uint16_t mem) 46 { 47 *(volatile uint16_t *)BIOS_fbm = mem; 48 } 49 50 #define serial_buf_size 4096 51 #define IO_DELAY_PORT 0x80 /* Invalid port (we hope!) */ 52 53 static inline void io_delay(void) 54 { 55 outb(0x0, IO_DELAY_PORT); 56 outb(0x0, IO_DELAY_PORT); 57 } 58 59 /* 60 * Sometimes we need to access screen coordinates as separate 8-bit 61 * entities and sometimes we need to use them as 16-bit entities. Using 62 * this structure allows the compiler to do it for us. 63 */ 64 union screen { 65 struct { 66 uint8_t col; /* Cursor column for message file */ 67 uint8_t row; /* Cursor row for message file */ 68 } b; 69 uint16_t dx; 70 }; 71 extern union screen _cursor; 72 extern union screen _screensize; 73 74 #define CursorDX _cursor.dx 75 #define CursorCol _cursor.b.col 76 #define CursorRow _cursor.b.row 77 78 #define ScreenSize _screensize.dx 79 #define VidCols _screensize.b.col 80 #define VidRows _screensize.b.row 81 82 /* font.c */ 83 extern void use_font(void); 84 extern void bios_adjust_screen(void); 85 86 /* serirq.c */ 87 extern char *SerialHead; 88 extern char *SerialTail; 89 90 extern void bios_init(void); 91 92 static inline uint16_t get_serial_port(uint16_t port) 93 { 94 /* Magic array in BIOS memory, contains four entries */ 95 const uint16_t * const serial_ports = (const uint16_t *)SERIAL_BASE; 96 97 /* 98 * If port > 3 then the port is simply the I/O base address 99 */ 100 if (port > 3) 101 return port; 102 103 /* Get the I/O port from the BIOS */ 104 return serial_ports[port]; 105 } 106 107 #endif /* _BIOS_H */ 108