Changeset View
Changeset View
Standalone View
Standalone View
head/sys/boot/i386/libi386/biosdisk.c
Show First 20 Lines • Show All 108 Lines • ▼ Show 20 Lines | |||||
#define BD_MODEINT13 0x0000 | #define BD_MODEINT13 0x0000 | ||||
#define BD_MODEEDD1 0x0001 | #define BD_MODEEDD1 0x0001 | ||||
#define BD_MODEEDD3 0x0002 | #define BD_MODEEDD3 0x0002 | ||||
#define BD_MODEMASK 0x0003 | #define BD_MODEMASK 0x0003 | ||||
#define BD_FLOPPY 0x0004 | #define BD_FLOPPY 0x0004 | ||||
int bd_type; /* BIOS 'drive type' (floppy only) */ | int bd_type; /* BIOS 'drive type' (floppy only) */ | ||||
uint16_t bd_sectorsize; /* Sector size */ | uint16_t bd_sectorsize; /* Sector size */ | ||||
uint64_t bd_sectors; /* Disk size */ | uint64_t bd_sectors; /* Disk size */ | ||||
int bd_open; /* reference counter */ | |||||
void *bd_bcache; /* buffer cache data */ | |||||
} bdinfo [MAXBDDEV]; | } bdinfo [MAXBDDEV]; | ||||
static int nbdinfo = 0; | static int nbdinfo = 0; | ||||
#define BD(dev) (bdinfo[(dev)->d_unit]) | #define BD(dev) (bdinfo[(dev)->d_unit]) | ||||
static int bd_read(struct disk_devdesc *dev, daddr_t dblk, int blks, | static int bd_read(struct disk_devdesc *dev, daddr_t dblk, int blks, | ||||
caddr_t dest); | caddr_t dest); | ||||
static int bd_write(struct disk_devdesc *dev, daddr_t dblk, int blks, | static int bd_write(struct disk_devdesc *dev, daddr_t dblk, int blks, | ||||
caddr_t dest); | caddr_t dest); | ||||
static int bd_int13probe(struct bdinfo *bd); | static int bd_int13probe(struct bdinfo *bd); | ||||
static int bd_init(void); | static int bd_init(void); | ||||
static int bd_strategy(void *devdata, int flag, daddr_t dblk, size_t size, | static int bd_strategy(void *devdata, int flag, daddr_t dblk, size_t offset, | ||||
char *buf, size_t *rsize); | |||||
static int bd_realstrategy(void *devdata, int flag, daddr_t dblk, | |||||
size_t size, char *buf, size_t *rsize); | size_t size, char *buf, size_t *rsize); | ||||
static int bd_realstrategy(void *devdata, int flag, daddr_t dblk, size_t offset, | |||||
size_t size, char *buf, size_t *rsize); | |||||
static int bd_open(struct open_file *f, ...); | static int bd_open(struct open_file *f, ...); | ||||
static int bd_close(struct open_file *f); | static int bd_close(struct open_file *f); | ||||
static int bd_ioctl(struct open_file *f, u_long cmd, void *data); | static int bd_ioctl(struct open_file *f, u_long cmd, void *data); | ||||
static void bd_print(int verbose); | static void bd_print(int verbose); | ||||
static void bd_cleanup(void); | static void bd_cleanup(void); | ||||
#ifdef LOADER_GELI_SUPPORT | #ifdef LOADER_GELI_SUPPORT | ||||
static enum isgeli { | static enum isgeli { | ||||
▲ Show 20 Lines • Show All 63 Lines • ▼ Show 20 Lines | #ifndef VIRTUALBOX | ||||
/* | /* | ||||
* Check the BIOS equipment list for number | * Check the BIOS equipment list for number | ||||
* of fixed disks. | * of fixed disks. | ||||
*/ | */ | ||||
if(base == 0x80 && | if(base == 0x80 && | ||||
(nfd >= *(unsigned char *)PTOV(BIOS_NUMDRIVES))) | (nfd >= *(unsigned char *)PTOV(BIOS_NUMDRIVES))) | ||||
break; | break; | ||||
#endif | #endif | ||||
bdinfo[nbdinfo].bd_open = 0; | |||||
bdinfo[nbdinfo].bd_bcache = NULL; | |||||
bdinfo[nbdinfo].bd_unit = unit; | bdinfo[nbdinfo].bd_unit = unit; | ||||
bdinfo[nbdinfo].bd_flags = unit < 0x80 ? BD_FLOPPY: 0; | bdinfo[nbdinfo].bd_flags = unit < 0x80 ? BD_FLOPPY: 0; | ||||
if (!bd_int13probe(&bdinfo[nbdinfo])) | if (!bd_int13probe(&bdinfo[nbdinfo])) | ||||
break; | break; | ||||
/* XXX we need "disk aliases" to make this simpler */ | /* XXX we need "disk aliases" to make this simpler */ | ||||
printf("BIOS drive %c: is disk%d\n", (unit < 0x80) ? | printf("BIOS drive %c: is disk%d\n", (unit < 0x80) ? | ||||
('A' + unit): ('C' + unit - 0x80), nbdinfo); | ('A' + unit): ('C' + unit - 0x80), nbdinfo); | ||||
nbdinfo++; | nbdinfo++; | ||||
if (base == 0x80) | if (base == 0x80) | ||||
nfd++; | nfd++; | ||||
} | } | ||||
} | } | ||||
bcache_add_dev(nbdinfo); | |||||
return(0); | return(0); | ||||
} | } | ||||
static void | static void | ||||
bd_cleanup(void) | bd_cleanup(void) | ||||
{ | { | ||||
disk_cleanup(&biosdisk); | disk_cleanup(&biosdisk); | ||||
▲ Show 20 Lines • Show All 114 Lines • ▼ Show 20 Lines | bd_open(struct open_file *f, ...) | ||||
va_list ap; | va_list ap; | ||||
va_start(ap, f); | va_start(ap, f); | ||||
dev = va_arg(ap, struct disk_devdesc *); | dev = va_arg(ap, struct disk_devdesc *); | ||||
va_end(ap); | va_end(ap); | ||||
if (dev->d_unit < 0 || dev->d_unit >= nbdinfo) | if (dev->d_unit < 0 || dev->d_unit >= nbdinfo) | ||||
return (EIO); | return (EIO); | ||||
BD(dev).bd_open++; | |||||
if (BD(dev).bd_bcache == NULL) | |||||
BD(dev).bd_bcache = bcache_allocate(); | |||||
err = disk_open(dev, BD(dev).bd_sectors * BD(dev).bd_sectorsize, | err = disk_open(dev, BD(dev).bd_sectors * BD(dev).bd_sectorsize, | ||||
BD(dev).bd_sectorsize, (BD(dev).bd_flags & BD_FLOPPY) ? | BD(dev).bd_sectorsize, (BD(dev).bd_flags & BD_FLOPPY) ? | ||||
DISK_F_NOCACHE: 0); | DISK_F_NOCACHE: 0); | ||||
#ifdef LOADER_GELI_SUPPORT | #ifdef LOADER_GELI_SUPPORT | ||||
static char gelipw[GELI_PW_MAXLEN]; | static char gelipw[GELI_PW_MAXLEN]; | ||||
char *passphrase; | char *passphrase; | ||||
▲ Show 20 Lines • Show All 69 Lines • ▼ Show 20 Lines | |||||
} | } | ||||
static int | static int | ||||
bd_close(struct open_file *f) | bd_close(struct open_file *f) | ||||
{ | { | ||||
struct disk_devdesc *dev; | struct disk_devdesc *dev; | ||||
dev = (struct disk_devdesc *)f->f_devdata; | dev = (struct disk_devdesc *)f->f_devdata; | ||||
BD(dev).bd_open--; | |||||
if (BD(dev).bd_open == 0) { | |||||
bcache_free(BD(dev).bd_bcache); | |||||
BD(dev).bd_bcache = NULL; | |||||
} | |||||
return (disk_close(dev)); | return (disk_close(dev)); | ||||
} | } | ||||
static int | static int | ||||
bd_ioctl(struct open_file *f, u_long cmd, void *data) | bd_ioctl(struct open_file *f, u_long cmd, void *data) | ||||
{ | { | ||||
struct disk_devdesc *dev; | struct disk_devdesc *dev; | ||||
dev = (struct disk_devdesc *)f->f_devdata; | dev = (struct disk_devdesc *)f->f_devdata; | ||||
switch (cmd) { | switch (cmd) { | ||||
case DIOCGSECTORSIZE: | case DIOCGSECTORSIZE: | ||||
*(u_int *)data = BD(dev).bd_sectorsize; | *(u_int *)data = BD(dev).bd_sectorsize; | ||||
break; | break; | ||||
case DIOCGMEDIASIZE: | case DIOCGMEDIASIZE: | ||||
*(off_t *)data = BD(dev).bd_sectors * BD(dev).bd_sectorsize; | *(off_t *)data = BD(dev).bd_sectors * BD(dev).bd_sectorsize; | ||||
break; | break; | ||||
default: | default: | ||||
return (ENOTTY); | return (ENOTTY); | ||||
} | } | ||||
return (0); | return (0); | ||||
} | } | ||||
static int | static int | ||||
bd_strategy(void *devdata, int rw, daddr_t dblk, size_t size, char *buf, | bd_strategy(void *devdata, int rw, daddr_t dblk, size_t offset, size_t size, | ||||
size_t *rsize) | char *buf, size_t *rsize) | ||||
{ | { | ||||
struct bcache_devdata bcd; | struct bcache_devdata bcd; | ||||
struct disk_devdesc *dev; | struct disk_devdesc *dev; | ||||
dev = (struct disk_devdesc *)devdata; | dev = (struct disk_devdesc *)devdata; | ||||
bcd.dv_strategy = bd_realstrategy; | bcd.dv_strategy = bd_realstrategy; | ||||
bcd.dv_devdata = devdata; | bcd.dv_devdata = devdata; | ||||
return (bcache_strategy(&bcd, BD(dev).bd_unit, rw, dblk + dev->d_offset, | bcd.dv_cache = BD(dev).bd_bcache; | ||||
return (bcache_strategy(&bcd, rw, dblk + dev->d_offset, offset, | |||||
size, buf, rsize)); | size, buf, rsize)); | ||||
} | } | ||||
static int | static int | ||||
bd_realstrategy(void *devdata, int rw, daddr_t dblk, size_t size, char *buf, | bd_realstrategy(void *devdata, int rw, daddr_t dblk, size_t offset, size_t size, | ||||
size_t *rsize) | char *buf, size_t *rsize) | ||||
{ | { | ||||
struct disk_devdesc *dev = (struct disk_devdesc *)devdata; | struct disk_devdesc *dev = (struct disk_devdesc *)devdata; | ||||
int blks; | int blks; | ||||
#ifdef BD_SUPPORT_FRAGS /* XXX: sector size */ | #ifdef BD_SUPPORT_FRAGS /* XXX: sector size */ | ||||
char fragbuf[BIOSDISK_SECSIZE]; | char fragbuf[BIOSDISK_SECSIZE]; | ||||
size_t fragsize; | size_t fragsize; | ||||
fragsize = size % BIOSDISK_SECSIZE; | fragsize = size % BIOSDISK_SECSIZE; | ||||
▲ Show 20 Lines • Show All 393 Lines • Show Last 20 Lines |