henesyinit from p9fce6d0435 years agoHistory
335 lines · 5.0 KB · C
RawDownload
#include "u.h"#include "lib.h"#include "mem.h"#include "dat.h"#include "fns.h"#include "io.h" #include "dosfs.h" typedef struct Type Type;typedef struct Medium Medium;typedef struct Mode Mode; enum {	Maxdev		= 7,	Dany		= -1,	Nmedia		= 16,}; enum {					/* type */	Tfloppy		= 0x00,	Thard		= 0x01,	Tscsi		= 0x02,	Tether		= 0x03,	NType		= 0x04, 	Tany		= -1,}; enum {					/* flag and name */	Fnone		= 0x00, 	Fdos		= 0x01,	Ndos		= 0x00,	Fboot		= 0x02,	Nboot		= 0x01,	Fbootp		= 0x04,	Nbootp		= 0x02,	NName		= 0x03, 	Fany		= Fbootp|Fboot|Fdos, 	Fini		= 0x10,	Freverse	= 0x20,	Fprobe		= 0x80,}; enum {					/* mode */	Mauto		= 0x00,	Mlocal		= 0x01,	Manual		= 0x02,	NMode		= 0x03,}; enum{	CGAWIDTH	= 160,	CGAHEIGHT	= 24, 	NLINES		= 10,	NWIDTH		= 60,	WLOCX		= 5,	WLOCY		= 5, 	MENUATTR	= 7,	HIGHMENUATTR	= 112,}; typedef struct Type {	int	type;	int	flag;	int	(*init)(void);	long	(*read)(int, void*, long);	long	(*seek)(int, long);	Partition* (*setpart)(int, char*);	char*	name[NName]; 	int	mask;	Medium*	media;} Type; typedef struct Medium {	Type*	type;	int	flag;	Partition* partition;	Dos; 	Medium*	next;} Medium; typedef struct Mode {	char*	name;	int	mode;} Mode; static Type types[NType] = {	{	Tfloppy,		Fini|Fdos,		floppyinit, floppyread, floppyseek, 0,		{ "fd", }	},}; static Medium media[Nmedia];static Medium *curmedium = media; static Mode modes[NMode+1] = {	[Mauto]		{ "auto",   Mauto,  },	[Mlocal]	{ "local",  Mlocal, },	[Manual]	{ "manual", Manual, },}; static Medium*allocm(Type *tp){	Medium **l; 	if(curmedium >= &media[Nmedia])		return 0; 	for(l = &tp->media; *l; l = &(*l)->next)		;	*l = curmedium++;	return *l;} voidxclrscrn(int attr){	int i; 	for(i = 0; i < CGAWIDTH*CGAHEIGHT; i += 2) {		cga[i] = ' ';		cga[i+1] = attr;	}} voidxprint(int x, int y, int attr, char *fmt, ...){	uchar *p;	int out, i;	char buf[CGAWIDTH]; 	x *= 2; 	out = doprint(buf, buf+sizeof(buf), fmt, DOTDOT) - buf;	p = (uchar*)(cga + x + (y*CGAWIDTH));	for(i = 0; i < out; i++) {		*p++ = buf[i];		*p++ = attr;	}} voidxputc(int x, int y, int attr, int c){	uchar *p; 	x *= 2;	p = (uchar*)(cga + x + (y*CGAWIDTH));	p[0] = c;	p[1] = attr;} Medium*probe(int type, int flag, int dev){	Type *tp;	int d, i, m;	Medium *mp; 	for(tp = types; tp < &types[NType]; tp++){		if(type != Tany && type != tp->type)			continue; 		if(flag != Fnone){			for(mp = tp->media; mp; mp = mp->next){				if((flag & mp->flag) && (dev == Dany || dev == mp->dev))					return mp;			}		} 		if((tp->flag & Fprobe) == 0){			tp->flag |= Fprobe;			tp->mask = (*tp->init)();		} 		for(i = 0; tp->mask; i++){			if(tp->flag & Freverse){				m = 1<<(Maxdev-i);				d = (Maxdev-i);			}			else{				m = 1<<i;				d = i;			}			if((tp->mask & m) == 0)				continue;			tp->mask &= ~m; 			if((mp = allocm(tp)) == 0)				continue; 			mp->dev = d;			mp->flag = tp->flag;			mp->seek = tp->seek;			mp->read = tp->read;			mp->type = tp; 			if(mp->flag & Fboot){				if((mp->partition = (*tp->setpart)(d, "boot")) == 0)					mp->flag &= ~Fboot;				(*tp->setpart)(d, "disk");			} 			if((mp->flag & Fdos) && (dosinit(mp) < 0))				mp->flag &= ~(Fini|Fdos); 			if((flag & mp->flag) && (dev == Dany || dev == d))				return mp;		}	} 	return 0;} char n1[] = "System Boot Program";char n2[] = "  Plan 9 (TM) Copyright (c) 1995 AT&T Bell Laboratories"; voidmain(void){	Medium *mp;	int port;	char scsi[64], line[80], *p; 	i8042a20();	memset(m, 0, sizeof(Mach));	trapinit();	clockinit();	alarminit();	spllo(); 	consinit();	if((ulong)&end > (KZERO|(640*1024)))		panic("install.com too big\n"); 	xclrscrn(17);	xprint(0, 0, 116, "%-80s", n1);	xprint(0, 23, 116, "%-80s", n2); 	/*	 *  look for a floppy with DOS (should be us) and boot 9dos	 */	mp = probe(Tfloppy, Fdos, Dany);	if(mp == 0){		print("Can't find the installation floppy\n");		delay(15000);		panic("Rebooting\n");	} 	/*	 *  get configuration info	 */	*BOOTARGS = 0; 	print("\n\nBooting the Plan 9 kernel, wait...\n"); 	sprint(BOOTLINE, "%s!%d!9dos", mp->type->name[Ndos], mp->dev);	dosboot(mp, "9dos");	print("Can't boot 9dos\n");	delay(15000);	panic("Rebooting");} intgetfields(char *lp, char **fields, int n, char sep){	int i; 	for(i=0; lp && *lp && i<n; i++){		while(*lp == sep)			*lp++=0;		if(*lp == 0)			break;		fields[i]=lp;		while(*lp && *lp != sep)			lp++;	}	return i;} void*ialloc(ulong n, int align){ 	static struct {		ulong	addr;	} palloc;	ulong p; 	if(palloc.addr == 0)		palloc.addr = ((ulong)&end)&~KZERO;	if(align)		palloc.addr = PGROUND(palloc.addr);	if((palloc.addr <= 640*1024) && (palloc.addr + n > 640*1024))		palloc.addr = 2*1024*1024; 	memset((void*)(palloc.addr|KZERO), 0, n);	p = palloc.addr;	palloc.addr += n;	if(align)		palloc.addr = PGROUND(palloc.addr); 	return (void*)(p|KZERO);} enum {	Paddr=		0x70,	/* address port */	Pdata=		0x71,	/* data port */}; ucharnvramread(int offset){	outb(Paddr, offset);	return inb(Pdata);} char*getconf(char*){	return 0;}