214 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			214 lines
		
	
	
		
			6.0 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. */
 | 
						|
 | 
						|
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? */
 | 
						|
 | 
						|
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 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 $
 | 
						|
 */
 |