daca9de450
ow that the image has grown beyond the 1.44M that fits on a floppy. (previously, the floppy emulation mode was used for cd's.) the boot cd now uses 'no emulation mode,' where an image is provided on the cd that is loaded and executed directly. this is the boot monitor. in order to make this work (the entry point is the same as where the image is loaded, and the boot monitor needs its a.out header too) and keep compatability with the same code being used for regular booting, i prepended 16 bytes that jumps over its header so execution can start there. to be able to read the CD (mostly in order to read the boot image), boot has to use the already present 'extended read' call, but address the CD using 2k sectors.
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(char *a);
|
|
/* Cheap atol(). */
|
|
unsigned a2x(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 $
|
|
*/
|