From fcee25024fa8d0851c8b863c8df7ba1c70f31c32 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Mon, 25 Apr 2005 19:29:55 +0000 Subject: [PATCH] BIOS floppy handling code moved to where it will really live. --- src/arch/i386/drivers/disk/floppy.c | 100 ++++++---------------------- src/arch/i386/include/bios_disks.h | 68 +++++++++++++++++++ src/include/disk.h | 5 ++ 3 files changed, 93 insertions(+), 80 deletions(-) create mode 100644 src/arch/i386/include/bios_disks.h diff --git a/src/arch/i386/drivers/disk/floppy.c b/src/arch/i386/drivers/disk/floppy.c index 9cb0a22d..86527339 100644 --- a/src/arch/i386/drivers/disk/floppy.c +++ b/src/arch/i386/drivers/disk/floppy.c @@ -1,88 +1,28 @@ -#if (TRY_FLOPPY_FIRST > 0) +#include "console.h" +#include "disk.h" +#include "bios_disks.h" -/* - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2, or (at - * your option) any later version. - */ - -#include "etherboot.h" - -#define BOOTSECT ((char *)0x7C00) -#define BOOTSIG ((unsigned short *)BOOTSECT)[0xFF] -#define PARTTAB ((partentry *)(BOOTSECT+0x1BE)) - -typedef struct partentry { - unsigned char flags; - unsigned char start_head; - unsigned char start_sector; - unsigned char start_cylinder; - unsigned char type; - unsigned char end_head; - unsigned char end_sector; - unsigned char end_cylinder; - unsigned long offset; - unsigned long length; -} partentry; - -static unsigned int disk_read_retry(int dev,int c,int h,int s) -{ - int retry = 3,rc; - - while (retry-- && (rc = pcbios_disk_read(dev,c,h,s,BOOTSECT)) != 0); - if (BOOTSIG != 0xAA55) { - printf("not a boot sector"); - return(0xFFFF); } - return(rc); +static void fill_floppy_name ( char *buf, uint8_t drive ) { + sprintf ( buf, "fd%d", drive ); } -int bootdisk(int dev,int part) -{ - int rc; +static struct disk_operations floppy_operations = { - disk_init(); - if ((rc = disk_read_retry(dev,0,0,1)) != 0) { - readerr: - if (rc != 0xFFFF) - printf("read error (%#hhX)",rc/256); - return(0); } - if (part) { - partentry *ptr; +}; - if (part >= 5) { - int i; - for (i = 0, ptr = PARTTAB; ptr->type != 5; ptr++) - if (++i == 4) { - printf("partition not found"); - return(0); } - if ((rc = disk_read_retry(dev, - ptr->start_cylinder, - ptr->start_head, - ptr->start_sector)) != 0) - goto readerr; - part -= 4; } - if (!(ptr = PARTTAB-1+part)->type) { - printf("empty partition"); - return(0); } - if ((rc = disk_read_retry(dev, - ptr->start_cylinder, - ptr->start_head, - ptr->start_sector)) != 0) - goto readerr; } - cleanup(); - gateA20_unset(); - /* Set %edx to device number to emulate BIOS - Fortunately %edx is not used after this */ - __asm__("movl %0,%%edx" : : "g" (dev)); - xstart((unsigned long)BOOTSECT, 0, 0); - return(0); +static int floppy_probe ( struct disk *disk, + struct bios_disk_device *bios_disk ) { + + return 1; } -#endif +static void floppy_disable ( struct disk *disk, + struct bios_disk_device *bios_disk ) { + +} -/* - * Local variables: - * c-basic-offset: 8 - * End: - */ +static struct bios_disk_driver floppy_driver = + BIOS_DISK_DRIVER ( fill_floppy_name, 0x00, 0x7f ); + +DRIVER ( "floppy", disk_driver, bios_disk_driver, floppy_driver, + floppy_probe, floppy_disable ); diff --git a/src/arch/i386/include/bios_disks.h b/src/arch/i386/include/bios_disks.h new file mode 100644 index 00000000..1a2c31aa --- /dev/null +++ b/src/arch/i386/include/bios_disks.h @@ -0,0 +1,68 @@ +#ifndef BIOS_DISKS_H +#define BIOS_DISKS_H + +#include "dev.h" + +/* + * Constants + * + */ + +#define BIOS_DISK_MAX_NAME_LEN 6 + +struct bios_disk_sector { + char data[512]; +}; + +/* + * The location of a BIOS disk + * + */ +struct bios_disk_loc { + uint8_t drive; +}; + +/* + * A physical BIOS disk device + * + */ +struct bios_disk_device { + char name[BIOS_DISK_MAX_NAME_LEN]; + uint8_t drive; + uint8_t type; +}; + +/* + * A BIOS disk driver, with a valid device ID range and naming + * function. + * + */ +struct bios_disk_driver { + void ( *fill_drive_name ) ( char *buf, uint8_t drive ); + uint8_t min_drive; + uint8_t max_drive; +}; + +/* + * Define a BIOS disk driver + * + */ +#define BIOS_DISK_DRIVER( _fill_drive_name, _min_drive, _max_drive ) { \ + .fill_drive_name = _fill_drive_name, \ + .min_drive = _min_drive, \ + .max_drive = _max_drive, \ +} + +/* + * Functions in bios_disks.c + * + */ + + +/* + * bios_disk bus global definition + * + */ +extern struct bus_driver bios_disk_driver; + +#endif /* BIOS_DISKS_H */ diff --git a/src/include/disk.h b/src/include/disk.h index 739902f7..4bb8f6eb 100644 --- a/src/include/disk.h +++ b/src/include/disk.h @@ -1,6 +1,7 @@ #ifndef DISK_H #define DISK_H +#include "etherboot.h" /* for sector_t */ #include "dev.h" /* @@ -30,6 +31,9 @@ struct disk int direction; }; +struct disk_operations { +}; + extern struct disk disk; extern int url_file(const char *name, int (*fnc)(unsigned char *, unsigned int, unsigned int, int)); @@ -39,6 +43,7 @@ extern int disk_load_configuration(struct dev *dev); extern int disk_load(struct dev *dev); extern void disk_disable(void); +extern struct type_driver disk_driver; #ifndef DOWNLOAD_PROTO_DISK #define disk_disable() do { } while(0)