Add some IBM PS/2 support bits:

* recognize PS/2 L40 via biosmca() and biosmca_ps2model in gatea20.c, instead
  of being a compile time option
* if the system is PS/2 with MCA bus, map DTYPE_ESDI disks to ed(4) for
  COMPAT_OLDBOOT

The new code is conditional on SUPPORT_PS2 define, which is on by default
for biosboot-based bootblocks.
This commit is contained in:
jdolecek 2001-05-19 18:15:14 +00:00
parent 2a7ff4a9ab
commit e3daef46ec
6 changed files with 84 additions and 26 deletions

View File

@ -1,4 +1,4 @@
# $NetBSD: Makefile,v 1.35 2001/05/02 13:43:11 jdolecek Exp $
# $NetBSD: Makefile,v 1.36 2001/05/19 18:15:14 jdolecek Exp $
S= ${.CURDIR}/../../../../
@ -15,7 +15,7 @@ SRCS= main.c devopen.c conf.c exec.c
CLEANFILES+= ${BSSTART}
CPPFLAGS+= -DCOMPAT_OLDBOOT -DCOMPAT_386BSD_MBRPART
CPPFLAGS+= -DCOMPAT_OLDBOOT -DCOMPAT_386BSD_MBRPART -DSUPPORT_PS2
.if (${BASE} == "biosboot")
# Various serial line configurations

View File

@ -1,4 +1,4 @@
/* $NetBSD: devopen.c,v 1.9 1999/10/28 05:20:05 mycroft Exp $ */
/* $NetBSD: devopen.c,v 1.10 2001/05/19 18:15:14 jdolecek Exp $ */
/*
* Copyright (c) 1996, 1997
@ -46,6 +46,9 @@
#ifdef _STANDALONE
#include <bootinfo.h>
#endif
#ifdef SUPPORT_PS2
#include <biosmca.h>
#endif
extern int parsebootfile __P((const char *, char**, char**, unsigned int*,
unsigned int*, const char**));
@ -68,8 +71,13 @@ static struct {
},
{
"sd", 0x80
},
#ifdef SUPPORT_PS2
{
"ed", 0x80
}
#endif
#endif /* SUPPORT_PS2 */
#endif /* COMPAT_OLDBOOT */
};
#define NUMBIOSDEVS (sizeof(biosdevtab) / sizeof(biosdevtab[0]))
@ -98,22 +106,30 @@ bios2dev(biosdev, devname, unit)
char **devname;
unsigned int *unit;
{
u_int8_t devidx;
if (biosdev & 0x80) {
#if defined(COMPAT_OLDBOOT) && defined(_STANDALONE)
extern struct disklabel disklabel;
if(disklabel.d_magic == DISKMAGIC) {
if(disklabel.d_type == DTYPE_SCSI)
*devname = biosdevtab[3].name;
if (disklabel.d_magic == DISKMAGIC) {
if (disklabel.d_type == DTYPE_SCSI)
devidx = 3;
#ifdef SUPPORT_PS2
else if (disklabel.d_type == DTYPE_ESDI
&& biosmca_ps2model)
devidx = 4;
#endif
else
*devname = biosdevtab[2].name;
devidx = 2;
} else
#endif
/* call it "hd", we don't know better */
*devname = biosdevtab[1].name;
devidx = 1;
} else
*devname = biosdevtab[0].name;
devidx = 0;
*devname = biosdevtab[devidx].name;
*unit = biosdev & 0x7f;
return (0);

View File

@ -1,4 +1,4 @@
/* $NetBSD: main.c,v 1.24 2000/09/24 18:28:21 jdolecek Exp $ */
/* $NetBSD: main.c,v 1.25 2001/05/19 18:15:14 jdolecek Exp $ */
/*
* Copyright (c) 1996, 1997, 1999
@ -47,6 +47,10 @@
#include <libi386.h>
#include "devopen.h"
#ifdef SUPPORT_PS2
#include <biosmca.h>
#endif
int errno;
extern int boot_biosdev;
@ -233,6 +237,10 @@ main()
#else
initio(CONSDEV_PC);
#endif
#ifdef SUPPORT_PS2
biosmca();
#endif
gateA20();
#ifdef RESET_VIDEO

View File

@ -1,4 +1,4 @@
$NetBSD: version,v 1.9 2000/09/24 12:32:35 jdolecek Exp $
$NetBSD: version,v 1.10 2001/05/19 18:15:14 jdolecek Exp $
NOTE ANY CHANGES YOU MAKE TO THE BOOTBLOCKS HERE. The format of this
file is important - make sure the entries are appended on end, last item
@ -15,3 +15,6 @@ is taken as the current.
2.6: Support ELF boot.
2.7: Support on-the-fly switching of console devices.
2.8: Support verbose/quiet boot.
2.9: Recognize PS/2 L40 at runtime and use appropriate gate A20
initialization (rather than using a compile flag).
Recognize ESDI disks and identify them as ed(4) for COMPAT_OLDBOOT.

View File

@ -1,4 +1,4 @@
/* $NetBSD: exec.c,v 1.15 2000/02/22 07:45:04 dbj Exp $ */
/* $NetBSD: exec.c,v 1.16 2001/05/19 18:15:14 jdolecek Exp $ */
/*
* Copyright (c) 1982, 1986, 1990, 1993
@ -58,6 +58,9 @@
#include "loadfile.h"
#include "libi386.h"
#include "bootinfo.h"
#ifdef SUPPORT_PS2
#include "biosmca.h"
#endif
#ifdef COMPAT_OLDBOOT
static int dev2major __P((char *, int *));
@ -67,13 +70,23 @@ dev2major(devname, major)
char *devname;
int *major;
{
static char *devices[] = {"wd", "", "fd", "", "sd"};
#define NUMDEVICES (sizeof(devices)/sizeof(char *))
static const struct {
const char *name;
int maj;
} devices[] = {
{ "wd", 0 },
{ "fd", 2 },
{ "sd", 4 },
#ifdef SUPPORT_PS2
{ "ed", 20 },
#endif
};
#define NUMDEVICES (sizeof(devices)/sizeof(devices[0]))
int i;
for (i = 0; i < NUMDEVICES; i++)
if (!strcmp(devname, devices[i])) {
*major = i;
if (!strcmp(devname, devices[i].name)) {
*major = devices[i].maj;
return (0);
}
return (-1);
@ -166,10 +179,21 @@ exec_netbsd(file, loadaddr, boothowto)
/* generic BIOS disk, have to guess type */
struct open_file *f = &files[fd]; /* XXX */
if (biosdisk_gettype(f) == DTYPE_SCSI)
switch (biosdisk_gettype(f)) {
case DTYPE_SCSI:
devname = "sd";
else
break;
#ifdef SUPPORT_PS2
case DTYPE_ESDI:
if (biosmca_ps2model) {
devname = "ed";
break;
}
#endif
default:
devname = "wd";
break;
}
/*
* The old boot block performed the following

View File

@ -1,4 +1,4 @@
/* $NetBSD: gatea20.c,v 1.3 2000/05/11 16:11:54 jdolecek Exp $ */
/* $NetBSD: gatea20.c,v 1.4 2001/05/19 18:15:14 jdolecek Exp $ */
/* extracted from freebsd:sys/i386/boot/biosboot/io.c */
@ -8,6 +8,7 @@
#include <lib/libsa/stand.h>
#include "libi386.h"
#include "biosmca.h"
#define K_RDWR 0x60 /* keyboard data & cmds (read/write) */
#define K_STATUS 0x64 /* keyboard status */
@ -27,15 +28,19 @@
/*
* Gate A20 for high memory
*/
#ifndef IBM_L40
static unsigned char x_20 = KB_A20;
#endif
void gateA20()
{
__asm("pushfl ; cli");
#ifdef IBM_L40
outb(0x92, 0x2);
#else /* !IBM_L40 */
#ifdef SUPPORT_PS2
/*
* Check if the machine is PS/2 L40 via biosmca_model, which is
* initialized before gateA20() is called.
*/
if (biosmca_ps2model == 0xf82)
outb(0x92, 0x2);
else {
#endif
while (inb(K_STATUS) & K_IBUF_FUL);
while (inb(K_STATUS) & K_OBUF_FUL)
(void)inb(K_RDWR);
@ -46,6 +51,8 @@ void gateA20()
outb(K_RDWR, x_20);
delay(100);
while (inb(K_STATUS) & K_IBUF_FUL);
#endif /* IBM_L40 */
#ifdef SUPPORT_PS2
}
#endif
__asm("popfl");
}