亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? bios_wini.c

?? minix3的源碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* This file contains the "device dependent" part of a hard disk driver that * uses the ROM BIOS.  It makes a call and just waits for the transfer to * happen.  It is not interrupt driven and thus will (*) have poor performance. * The advantage is that it should work on virtually any PC, XT, 386, PS/2 * or clone.  The demo disk uses this driver.  It is suggested that all * MINIX users try the other drivers, and use this one only as a last resort, * if all else fails. * * (*) The performance is within 10% of the AT driver for reads on any disk *     and writes on a 2:1 interleaved disk, it will be DMA_BUF_SIZE bytes *     per revolution for a minimum of 60 kb/s for writes to 1:1 disks. * * The file contains one entry point: * *	 bios_winchester_task:	main entry when system is brought up * * * Changes: *	30 Apr 1992 by Kees J. Bot: device dependent/independent split. *	14 May 2000 by Kees J. Bot: d-d/i rewrite. */#include "../drivers.h"#include "../libdriver/driver.h"#include "../libdriver/drvlib.h"#include <minix/sysutil.h>#include <minix/keymap.h>#include <sys/ioc_disk.h>#include <ibm/int86.h>#include <assert.h>#define ME "BIOS_WINI"/* Error codes */#define ERR		 (-1)	/* general error *//* Parameters for the disk drive. */#define MAX_DRIVES         8	/* this driver supports 8 drives (d0 - d7)*/#define MAX_SECS	 255	/* bios can transfer this many sectors */#define NR_MINORS      (MAX_DRIVES * DEV_PER_DRIVE)#define SUB_PER_DRIVE	(NR_PARTITIONS * NR_PARTITIONS)#define NR_SUBDEVS	(MAX_DRIVES * SUB_PER_DRIVE)PRIVATE int pc_at = 1;	/* What about PC XTs? *//* Variables. */PRIVATE struct wini {		/* main drive struct, one entry per drive */  unsigned cylinders;		/* number of cylinders */  unsigned heads;		/* number of heads */  unsigned sectors;		/* number of sectors per track */  unsigned open_ct;		/* in-use count */  int drive_id;			/* Drive ID at BIOS level */  int present;			/* Valid drive */  int int13ext;			/* IBM/MS INT 13 extensions supported? */  struct device part[DEV_PER_DRIVE];	/* disks and partitions */  struct device subpart[SUB_PER_DRIVE]; /* subpartitions */} wini[MAX_DRIVES], *w_wn;PRIVATE int w_drive;			/* selected drive */PRIVATE struct device *w_dv;		/* device's base and size */PRIVATE vir_bytes bios_buf_vir, bios_buf_size;PRIVATE phys_bytes bios_buf_phys;PRIVATE int remap_first = 0;		/* Remap drives for CD HD emulation */_PROTOTYPE(int main, (void) );FORWARD _PROTOTYPE( struct device *w_prepare, (int device) );FORWARD _PROTOTYPE( char *w_name, (void) );FORWARD _PROTOTYPE( int w_transfer, (int proc_nr, int opcode, off_t position,					iovec_t *iov, unsigned nr_req) );FORWARD _PROTOTYPE( int w_do_open, (struct driver *dp, message *m_ptr) );FORWARD _PROTOTYPE( int w_do_close, (struct driver *dp, message *m_ptr) );FORWARD _PROTOTYPE( void w_init, (void) );FORWARD _PROTOTYPE( void w_geometry, (struct partition *entry));FORWARD _PROTOTYPE( int w_other, (struct driver *dp, message *m_ptr)    );/* Entry points to this driver. */PRIVATE struct driver w_dtab = {  w_name,	/* current device's name */  w_do_open,	/* open or mount request, initialize device */  w_do_close,	/* release device */  do_diocntl,	/* get or set a partition's geometry */  w_prepare,	/* prepare for I/O on a given minor device */  w_transfer,	/* do the I/O */  nop_cleanup,	/* no cleanup needed */  w_geometry,	/* tell the geometry of the disk */  nop_signal,		/* no cleanup needed on shutdown */  nop_alarm,		/* ignore leftover alarms */  nop_cancel,		/* ignore CANCELs */  nop_select,		/* ignore selects */  w_other,		/* catch-all for unrecognized commands and ioctls */  NULL			/* leftover hardware interrupts */};/*===========================================================================* *				bios_winchester_task			     * *===========================================================================*/PUBLIC int main(){  long v;  struct sigaction sa;  sa.sa_handler = SIG_MESS;  sigemptyset(&sa.sa_mask);  sa.sa_flags = 0;  if (sigaction(SIGTERM,&sa,NULL)<0) panic("bios_wini","sigaction failed", errno);  signal(SIGTERM, SIG_IGN);  v= 0;  env_parse("bios_remap_first", "d", 0, &v, 0, 1);  remap_first= v;/* Set special disk parameters then call the generic main loop. */  driver_task(&w_dtab);  return(OK);}/*===========================================================================* *				w_prepare				     * *===========================================================================*/PRIVATE struct device *w_prepare(device)int device;{/* Prepare for I/O on a device. */  if (device < NR_MINORS) {			/* d0, d0p[0-3], d1, ... */	w_drive = device / DEV_PER_DRIVE;	/* save drive number */	w_wn = &wini[w_drive];	w_dv = &w_wn->part[device % DEV_PER_DRIVE];  } else  if ((unsigned) (device -= MINOR_d0p0s0) < NR_SUBDEVS) {/*d[0-7]p[0-3]s[0-3]*/	w_drive = device / SUB_PER_DRIVE;	w_wn = &wini[w_drive];	w_dv = &w_wn->subpart[device % SUB_PER_DRIVE];  } else {	return(NIL_DEV);  }  if (w_drive >= MAX_DRIVES || !w_wn->present)  	return NIL_DEV;  return(w_dv);}/*===========================================================================* *				w_name					     * *===========================================================================*/PRIVATE char *w_name(){/* Return a name for the current device. */  static char name[] = "bios-d0";  name[6] = '0' + w_drive;  return name;}/*===========================================================================* *				w_transfer				     * *===========================================================================*/PRIVATE int w_transfer(proc_nr, opcode, position, iov, nr_req)int proc_nr;			/* process doing the request */int opcode;			/* DEV_GATHER or DEV_SCATTER */off_t position;			/* offset on device to read or write */iovec_t *iov;			/* pointer to read or write request vector */unsigned nr_req;		/* length of request vector */{  struct wini *wn = w_wn;  iovec_t *iop, *iov_end = iov + nr_req;  int r, errors;  unsigned nbytes, count, chunk;  unsigned long block;  vir_bytes i13e_rw_off, rem_buf_size;  unsigned long dv_size = cv64ul(w_dv->dv_size);  unsigned secspcyl = wn->heads * wn->sectors;  struct int13ext_rw {	u8_t	len;	u8_t	res1;	u16_t	count;	u16_t	addr[2];	u32_t	block[2];  } i13e_rw;  struct reg86u reg86;  /* Check disk address. */  if ((position & SECTOR_MASK) != 0) return(EINVAL);  errors = 0;  i13e_rw_off= bios_buf_size-sizeof(i13e_rw);  rem_buf_size= (i13e_rw_off & ~SECTOR_MASK);  assert(rem_buf_size != 0);  while (nr_req > 0) {	/* How many bytes to transfer? */	nbytes = 0;	for (iop = iov; iop < iov_end; iop++) {		if (nbytes + iop->iov_size > rem_buf_size) {			/* Don't do half a segment if you can avoid it. */			if (nbytes == 0) nbytes = rem_buf_size;			break;		}		nbytes += iop->iov_size;	}	if ((nbytes & SECTOR_MASK) != 0) return(EINVAL);	/* Which block on disk and how close to EOF? */	if (position >= dv_size) return(OK);		/* At EOF */	if (position + nbytes > dv_size) nbytes = dv_size - position;	block = div64u(add64ul(w_dv->dv_base, position), SECTOR_SIZE);	/* Degrade to per-sector mode if there were errors. */	if (errors > 0) nbytes = SECTOR_SIZE;	if (opcode == DEV_SCATTER) {		/* Copy from user space to the DMA buffer. */		count = 0;		for (iop = iov; count < nbytes; iop++) {			chunk = iov->iov_size;			if (count + chunk > nbytes) chunk = nbytes - count;			assert(chunk <= rem_buf_size);			r= sys_vircopy(proc_nr, D, iop->iov_addr,				SYSTEM, D, bios_buf_vir+count, 				chunk);			if (r != OK)				panic(ME, "sys_vircopy failed", r);			count += chunk;		}	}	/* Do the transfer */	if (wn->int13ext) {		i13e_rw.len = 0x10;		i13e_rw.res1 = 0;		i13e_rw.count = nbytes >> SECTOR_SHIFT;		i13e_rw.addr[0] = bios_buf_phys % HCLICK_SIZE;		i13e_rw.addr[1] = bios_buf_phys / HCLICK_SIZE;		i13e_rw.block[0] = block;		i13e_rw.block[1] = 0;		r= sys_vircopy(SELF, D, (vir_bytes)&i13e_rw,			SYSTEM, D, (bios_buf_vir+i13e_rw_off), 			sizeof(i13e_rw));		if (r != OK)			panic(ME, "sys_vircopy failed", r);		/* Set up an extended read or write BIOS call. */		reg86.u.b.intno = 0x13;		reg86.u.w.ax = opcode == DEV_SCATTER ? 0x4300 : 0x4200;		reg86.u.b.dl = wn->drive_id;		reg86.u.w.si = (bios_buf_phys + i13e_rw_off) % HCLICK_SIZE;		reg86.u.w.ds = (bios_buf_phys + i13e_rw_off) / HCLICK_SIZE;	} else {		/* Set up an ordinary read or write BIOS call. */		unsigned cylinder = block / secspcyl;		unsigned sector = (block % wn->sectors) + 1;		unsigned head = (block % secspcyl) / wn->sectors;		reg86.u.b.intno = 0x13;		reg86.u.b.ah = opcode == DEV_SCATTER ? 0x03 : 0x02;		reg86.u.b.al = nbytes >> SECTOR_SHIFT;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国内精品第一页| 国产精品亚洲一区二区三区妖精 | 久久精品夜色噜噜亚洲a∨| 欧美高清视频不卡网| 欧美色综合网站| 欧美挠脚心视频网站| 欧美日韩久久一区| 欧美一区二区视频免费观看| 欧美一三区三区四区免费在线看| 欧美日韩综合一区| 日韩亚洲欧美成人一区| 日韩欧美国产一区二区三区| 久久在线观看免费| 国产精品色一区二区三区| ㊣最新国产の精品bt伙计久久| 亚洲免费观看高清| 五月激情综合婷婷| 国产一区二区三区美女| 91在线视频播放| 欧美嫩在线观看| 久久久久久电影| 亚洲黄网站在线观看| 亚洲高清久久久| 国产一区二区三区精品欧美日韩一区二区三区| 久久精品99国产精品日本| 国产精品一区二区久激情瑜伽| 91在线视频在线| 91精品久久久久久蜜臀| 国产女主播在线一区二区| 亚洲三级在线观看| 日韩成人伦理电影在线观看| 成人精品视频一区二区三区| 欧美疯狂性受xxxxx喷水图片| 久久影视一区二区| 亚洲一区二区精品视频| 国产美女视频一区| 欧美午夜精品久久久久久超碰| 日韩免费视频一区| 一区二区三区久久| 国产成人av电影| 91精品国产综合久久婷婷香蕉| wwwwww.欧美系列| 五月天激情小说综合| 成人精品亚洲人成在线| 欧美成人精品高清在线播放| 一二三四社区欧美黄| 国产一区二区三区美女| 91精品国产高清一区二区三区| 一区视频在线播放| 国产suv一区二区三区88区| 91精品国产综合久久小美女| 一区二区三区成人在线视频| 国产91色综合久久免费分享| 欧美成人官网二区| 亚洲丶国产丶欧美一区二区三区| 成人在线视频首页| 久久色成人在线| 久久精品国产亚洲a| 欧美日韩高清一区二区不卡| 亚洲乱码中文字幕| 成人美女视频在线观看| 久久精品视频在线看| 久久精品噜噜噜成人av农村| 欧美精品一级二级| 亚洲高清免费一级二级三级| 在线精品观看国产| 一个色综合网站| 欧美综合亚洲图片综合区| 亚洲女与黑人做爰| 91成人免费网站| 亚洲精品v日韩精品| 91视视频在线观看入口直接观看www| 久久婷婷一区二区三区| 国产一区二区日韩精品| 精品国产一二三区| 国产激情一区二区三区| 久久久国产精品麻豆| 国产综合色视频| 国产日韩欧美亚洲| www.66久久| 一区二区三区在线观看网站| 欧美无砖专区一中文字| 丝袜亚洲另类丝袜在线| 欧美不卡在线视频| 国产老女人精品毛片久久| 中文字幕av一区二区三区免费看| 成人一区在线观看| 亚洲蜜臀av乱码久久精品蜜桃| 色一区在线观看| 成人免费三级在线| 亚洲人成7777| 欧美日韩国产bt| 激情深爱一区二区| 国产精品亲子乱子伦xxxx裸| 色噜噜狠狠成人网p站| 亚洲成人你懂的| 精品电影一区二区| 不卡的电影网站| 亚洲成人一二三| 久久精品一区蜜桃臀影院| 9久草视频在线视频精品| 亚洲欧美激情视频在线观看一区二区三区 | 中文字幕一区二区三区乱码在线| 色噜噜狠狠成人网p站| 免费看黄色91| 亚洲欧洲国产专区| 欧美一区二区视频网站| 不卡的av在线| 奇米影视7777精品一区二区| 国产欧美日韩中文久久| 成人99免费视频| 日韩二区在线观看| 日韩毛片视频在线看| 日韩午夜在线观看视频| 成人动漫av在线| 日本午夜一区二区| 最近日韩中文字幕| 精品免费国产一区二区三区四区| 91麻豆精东视频| 久久精品国产亚洲高清剧情介绍 | 26uuu国产日韩综合| 91久久精品一区二区二区| 国产一区二区三区观看| 亚洲大片精品永久免费| 国产精品高清亚洲| 精品国产乱码久久久久久免费| 在线看不卡av| 99久久婷婷国产综合精品| 韩国av一区二区三区| 免费久久精品视频| 水野朝阳av一区二区三区| 亚洲欧美乱综合| 国产精品久久久久精k8| 久久久国产精华| 日韩精品一区在线| 91.麻豆视频| 欧美精品123区| 欧美人妖巨大在线| 欧美日韩一卡二卡三卡| 91蜜桃视频在线| 91色视频在线| 一本色道综合亚洲| 91在线视频免费观看| 99久久综合国产精品| 成人激情av网| a4yy欧美一区二区三区| 成人高清免费观看| 波多野结衣中文一区| av电影在线观看完整版一区二区| 国产成人丝袜美腿| 高清在线不卡av| 成人免费av资源| 91天堂素人约啪| 日本道精品一区二区三区| 色综合久久天天| 91福利精品视频| 欧美高清视频www夜色资源网| 欧美一区二区三区的| 日韩免费一区二区| 久久看人人爽人人| 国产精品理论片在线观看| 国产精品成人免费在线| 怡红院av一区二区三区| 亚洲高清中文字幕| 奇米四色…亚洲| 国产精品456露脸| caoporn国产精品| 91精品国产欧美一区二区| 欧美大片国产精品| 国产网站一区二区三区| 亚洲精品国产精品乱码不99 | 美国十次了思思久久精品导航| 蜜臀av性久久久久av蜜臀妖精| 国内成+人亚洲+欧美+综合在线| 大陆成人av片| 欧美日韩电影在线播放| 26uuu久久综合| 一区二区三区欧美视频| 经典一区二区三区| 91亚洲精品久久久蜜桃| 日韩西西人体444www| 国产精品女上位| 三级精品在线观看| 国产成人aaaa| 欧美一区二区三级| 国产精品萝li| 免费久久99精品国产| 99久久精品久久久久久清纯| 91精品婷婷国产综合久久性色| 久久先锋影音av| 亚洲一区二区三区四区中文字幕 | av中文字幕不卡| 欧美日韩免费观看一区二区三区| 精品国产不卡一区二区三区| 亚洲嫩草精品久久| 国产原创一区二区| 欧美日高清视频| 亚洲天堂免费看| 国产传媒日韩欧美成人| 欧美疯狂做受xxxx富婆|