220 lines
6.2 KiB
C
220 lines
6.2 KiB
C
/* boot.h - Info between different parts of boot. Author: Kees J. Bot
|
|
*/
|
|
|
|
#ifndef DEBUG
|
|
#define DEBUG 0
|
|
#endif
|
|
|
|
/* Constants describing the metal: */
|
|
|
|
#define SECTOR_SIZE 512
|
|
#define SECTOR_SHIFT 9
|
|
#define RATIO(b) ((b) / SECTOR_SIZE)
|
|
|
|
#define PARAMSEC 1 /* Sector containing boot parameters. */
|
|
|
|
#define DSKBASE 0x1E /* Floppy disk parameter vector. */
|
|
#define DSKPARSIZE 11 /* There are this many bytes of parameters. */
|
|
|
|
#define ESC '\33' /* Escape key. */
|
|
|
|
#define HEADERPOS 0x00600L /* Place for an array of struct exec's. */
|
|
|
|
#define FREEPOS 0x08000L /* Memory from FREEPOS to caddr is free to
|
|
* play with.
|
|
*/
|
|
#if BIOS
|
|
#define MSEC_PER_TICK 55 /* Clock does 18.2 ticks per second. */
|
|
#define TICKS_PER_DAY 0x1800B0L /* After 24 hours it wraps. */
|
|
#endif
|
|
|
|
#if UNIX
|
|
#define MSEC_PER_TICK 1000 /* Clock does 18.2 ticks per second. */
|
|
#define TICKS_PER_DAY 86400L /* Doesn't wrap, but that doesn't matter. */
|
|
#endif
|
|
|
|
#define BOOTPOS 0x07C00L /* Bootstraps are loaded here. */
|
|
#define SIGNATURE 0xAA55 /* Proper bootstraps have this signature. */
|
|
#define SIGNATOFF 510 /* Offset within bootblock. */
|
|
|
|
/* BIOS video modes. */
|
|
#define MONO_MODE 0x07 /* 80x25 monochrome. */
|
|
#define COLOR_MODE 0x03 /* 80x25 color. */
|
|
|
|
|
|
/* Variables shared with boothead.s: */
|
|
#ifndef EXTERN
|
|
#define EXTERN extern
|
|
#endif
|
|
|
|
typedef struct vector { /* 8086 vector */
|
|
u16_t offset;
|
|
u16_t segment;
|
|
} vector;
|
|
|
|
EXTERN vector rem_part; /* Boot partition table entry. */
|
|
|
|
EXTERN u32_t caddr, daddr; /* Code and data address of the boot program. */
|
|
EXTERN u32_t runsize; /* Size of this program. */
|
|
|
|
EXTERN u16_t device; /* Drive being booted from. */
|
|
EXTERN u16_t cddevice; /* Drive that is CD if known. */
|
|
|
|
#define CDNAME "cd" /* Name of the CD device. */
|
|
|
|
typedef struct { /* One chunk of free memory. */
|
|
u32_t base; /* Start byte. */
|
|
u32_t size; /* Number of bytes. */
|
|
} memory;
|
|
|
|
EXTERN memory mem[3]; /* List of available memory. */
|
|
EXTERN int mon_return; /* Monitor stays in memory? */
|
|
EXTERN int cdbooted; /* Did we boot from CD? (Set by boothead.s.) */
|
|
|
|
typedef struct bios_env
|
|
{
|
|
u16_t ax;
|
|
u16_t bx;
|
|
u16_t cx;
|
|
u16_t flags;
|
|
} bios_env_t;
|
|
|
|
#define FL_CARRY 0x0001 /* carry flag */
|
|
|
|
/* Functions defined by boothead.s: */
|
|
|
|
void exit(int code);
|
|
/* Exit the monitor. */
|
|
u32_t mon2abs(void *ptr);
|
|
/* Local monitor address to absolute address. */
|
|
u32_t vec2abs(vector *vec);
|
|
/* Vector to absolute address. */
|
|
void raw_copy(u32_t dstaddr, u32_t srcaddr, u32_t count);
|
|
/* Copy bytes from anywhere to anywhere. */
|
|
u16_t get_word(u32_t addr);
|
|
/* Get a word from anywhere. */
|
|
void put_word(u32_t addr, U16_t word);
|
|
/* Put a word anywhere. */
|
|
void relocate(void);
|
|
/* Switch to a copy of this program. */
|
|
int dev_open(void), dev_close(void);
|
|
/* Open device and determine params / close device. */
|
|
int dev_boundary(u32_t sector);
|
|
/* True if sector is on a track boundary. */
|
|
int readsectors(u32_t bufaddr, u32_t sector, U8_t count);
|
|
/* Read 1 or more sectors from "device". */
|
|
int writesectors(u32_t bufaddr, u32_t sector, U8_t count);
|
|
/* Write 1 or more sectors to "device". */
|
|
|
|
int biosreadsectors(u32_t bufaddr, u32_t sector, U8_t count);
|
|
|
|
int getch(void);
|
|
/* Read a keypress. */
|
|
void scan_keyboard(void);
|
|
/* Read keypress directly from kb controller. */
|
|
void ungetch(int c);
|
|
/* Undo a keypress. */
|
|
int escape(void);
|
|
/* True if escape typed. */
|
|
void putch(int c);
|
|
/* Send a character to the screen. */
|
|
#if BIOS
|
|
void pause(void);
|
|
/* Wait for an interrupt. */
|
|
void serial_init(int line);
|
|
#endif /* Enable copying console I/O to a serial line. */
|
|
|
|
void set_mode(unsigned mode);
|
|
void clear_screen(void);
|
|
/* Set video mode / clear the screen. */
|
|
|
|
u16_t get_bus(void);
|
|
/* System bus type, XT, AT, or MCA. */
|
|
u16_t get_video(void);
|
|
/* Display type, MDA to VGA. */
|
|
u32_t get_tick(void);
|
|
/* Current value of the clock tick counter. */
|
|
|
|
void bootstrap(int device, struct part_entry *entry);
|
|
/* Execute a bootstrap routine for a different O.S. */
|
|
void minix(u32_t koff, u32_t kcs, u32_t kds,
|
|
char *bootparams, size_t paramsize, u32_t aout);
|
|
/* Start Minix. */
|
|
void int15(bios_env_t *);
|
|
|
|
|
|
/* Shared between boot.c and bootimage.c: */
|
|
|
|
/* Sticky attributes. */
|
|
#define E_SPECIAL 0x01 /* These are known to the program. */
|
|
#define E_DEV 0x02 /* The value is a device name. */
|
|
#define E_RESERVED 0x04 /* May not be set by user, e.g. 'boot' */
|
|
#define E_STICKY 0x07 /* Don't go once set. */
|
|
|
|
/* Volatile attributes. */
|
|
#define E_VAR 0x08 /* Variable */
|
|
#define E_FUNCTION 0x10 /* Function definition. */
|
|
|
|
/* Variables, functions, and commands. */
|
|
typedef struct environment {
|
|
struct environment *next;
|
|
char flags;
|
|
char *name; /* name = value */
|
|
char *arg; /* name(arg) {value} */
|
|
char *value;
|
|
char *defval; /* Safehouse for default values. */
|
|
} environment;
|
|
|
|
EXTERN environment *env; /* Lists the environment. */
|
|
|
|
char *b_value(char *name); /* Get/set the value of a variable. */
|
|
int b_setvar(int flags, char *name, char *value);
|
|
void b_unset(char *name);
|
|
|
|
void parse_code(char *code); /* Parse boot monitor commands. */
|
|
|
|
extern int fsok; /* True if the boot device contains an FS. */
|
|
EXTERN u32_t lowsec; /* Offset to the file system on the boot device. */
|
|
|
|
/* Called by boot.c: */
|
|
|
|
void bootminix(void); /* Load and start a Minix image. */
|
|
|
|
|
|
/* Called by bootimage.c: */
|
|
|
|
void readerr(off_t sec, int err);
|
|
/* Report a read error. */
|
|
char *ul2a(u32_t n, unsigned b), *ul2a10(u32_t n);
|
|
/* Transform u32_t to ASCII at base b or base 10. */
|
|
long a2l(const char *a);
|
|
/* Cheap atol(). */
|
|
unsigned a2x(const char *a);
|
|
/* ASCII to hex. */
|
|
dev_t name2dev(char *name);
|
|
/* Translate a device name to a device number. */
|
|
int numprefix(char *s, char **ps);
|
|
/* True for a numeric prefix. */
|
|
int numeric(char *s);
|
|
/* True for a numeric string. */
|
|
char *unix_err(int err);
|
|
/* Give a descriptive text for some UNIX errors. */
|
|
int run_trailer(void);
|
|
/* Run the trailer function. */
|
|
|
|
#if DOS
|
|
/* The monitor runs under MS-DOS. */
|
|
extern char PSP[256]; /* Program Segment Prefix. */
|
|
EXTERN char *vdisk; /* Name of the virtual disk. */
|
|
EXTERN char *drun; /* Initial command from DOS command line. */
|
|
#else
|
|
/* The monitor uses only the BIOS. */
|
|
#define DOS 0
|
|
#endif
|
|
|
|
void readblock(off_t, char *, int);
|
|
void delay(char *);
|
|
|
|
/*
|
|
* $PchId: boot.h,v 1.12 2002/02/27 19:42:45 philip Exp $
|
|
*/
|