亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
一区二区中文字幕在线| 成人黄色片在线观看| 国产欧美精品在线观看| 精品国产1区二区| 欧美综合在线视频| 国产毛片精品视频| 国内精品国产三级国产a久久| 自拍偷拍国产亚洲| 亚洲少妇最新在线视频| 亚洲情趣在线观看| 亚洲成人激情社区| 欧美aⅴ一区二区三区视频| 看电视剧不卡顿的网站| 国产成人自拍网| 9人人澡人人爽人人精品| 成人av综合一区| 欧美区在线观看| 91精品久久久久久蜜臀| 久久麻豆一区二区| 亚洲欧美日韩国产成人精品影院| 五月天国产精品| 成人精品在线视频观看| 欧美精品久久久久久久多人混战| 欧美变态tickle挠乳网站| 欧美激情中文字幕一区二区| 一区二区三区在线免费视频 | 国产精品免费视频网站| 国产精品热久久久久夜色精品三区 | 精品一区二区三区免费毛片爱| 成人av免费在线播放| 欧美视频日韩视频| 欧美成人精品高清在线播放 | 精品一区二区三区视频在线观看| 99久久久精品| 欧美激情在线一区二区三区| 国产一区二区免费视频| 北条麻妃一区二区三区| 国产网红主播福利一区二区| 精油按摩中文字幕久久| 欧美日韩中文字幕一区二区| 亚洲视频在线观看一区| 成人精品视频一区二区三区尤物| 精品日产卡一卡二卡麻豆| 日韩不卡一二三区| 欧美综合一区二区三区| 亚洲免费在线看| 色综合久久久久综合99| 精品国产乱码久久久久久老虎| 水蜜桃久久夜色精品一区的特点 | 精品免费日韩av| 捆绑调教一区二区三区| 欧美成人性福生活免费看| 韩国av一区二区三区四区| 2022国产精品视频| 国产精品一区二区黑丝| 国产精品亲子伦对白| 极品瑜伽女神91| 国产精品不卡一区| 欧美日韩五月天| 日本亚洲视频在线| 日韩三级在线观看| 老司机精品视频在线| 中文字幕精品综合| 在线一区二区三区四区五区| 日本免费新一区视频| 久久久国产综合精品女国产盗摄| 99久久免费精品高清特色大片| 综合久久久久久| 欧美一区二区性放荡片| 波多野结衣视频一区| 天堂在线亚洲视频| 国产亚洲精品7777| 91精品国产综合久久国产大片| 久久草av在线| 一区二区三区欧美日| 国产精品嫩草影院com| 日韩精品一区在线观看| 91国偷自产一区二区使用方法| 久久国产生活片100| 亚洲成人激情av| 亚洲情趣在线观看| 国产精品欧美极品| 久久综合给合久久狠狠狠97色69| 欧美系列在线观看| 欧洲精品一区二区三区在线观看| 国内精品久久久久影院一蜜桃| 中文字幕精品一区二区精品绿巨人| 成人a级免费电影| 精品在线你懂的| 青草av.久久免费一区| 亚洲午夜免费电影| 亚洲国产精品综合小说图片区| 国产欧美日韩一区二区三区在线观看 | 欧美mv和日韩mv的网站| 精品视频一区三区九区| 99国产欧美久久久精品| 日本不卡视频在线| 狠狠色丁香久久婷婷综| 五月婷婷综合在线| 亚洲猫色日本管| 亚洲女性喷水在线观看一区| 国产精品丝袜一区| 国产精品久久99| 26uuu国产日韩综合| 亚洲精品视频在线看| 一区二区高清免费观看影视大全| 久久精品人人做人人爽97| 国产精品美女一区二区三区| 国产精品国产精品国产专区不蜜| 国产欧美一区二区在线观看| 有坂深雪av一区二区精品| 亚洲欧洲日韩一区二区三区| 国产亚洲人成网站| 国产精品久久久久久户外露出 | 亚洲国产电影在线观看| 亚洲乱码日产精品bd| 美女网站在线免费欧美精品| 国产大陆精品国产| 日本道色综合久久| 欧美喷潮久久久xxxxx| 99v久久综合狠狠综合久久| 国产精品一线二线三线精华| 欧美亚洲动漫另类| 日韩亚洲国产中文字幕欧美| 欧美国产一区二区在线观看| 亚洲在线视频网站| 国产黄色精品视频| 911国产精品| 综合激情成人伊人| 91女神在线视频| 欧美视频一二三区| 中文字幕在线视频一区| 成人性生交大片免费看视频在线 | 欧日韩精品视频| 国产精品天美传媒沈樵| 奇米精品一区二区三区四区 | 欧美激情综合网| 蜜桃传媒麻豆第一区在线观看| 色哟哟在线观看一区二区三区| 久久精品一区八戒影视| 捆绑变态av一区二区三区| 6080午夜不卡| 香蕉成人啪国产精品视频综合网| av欧美精品.com| 五月天国产精品| 99riav一区二区三区| 亚洲大尺度视频在线观看| av电影在线观看一区| 国产精品美女久久久久久2018| 国产91色综合久久免费分享| 久久久久高清精品| 国内外成人在线视频| 成人欧美一区二区三区| 欧美视频三区在线播放| 免费久久精品视频| 久久综合九色综合欧美亚洲| 欧美视频三区在线播放| 国产成人精品免费| 一区二区免费看| 91精品国产手机| 国产成人在线影院| 亚洲视频一区二区在线| 精品国产一区二区三区久久久蜜月 | 99国产精品国产精品毛片| 国产精品久久久久久久久免费樱桃 | av激情成人网| 日韩va亚洲va欧美va久久| 久久久久国产免费免费| 91在线视频18| 激情五月婷婷综合| 91蜜桃传媒精品久久久一区二区| 亚洲成a人片在线观看中文| 日韩精品一区二区三区在线播放 | 欧美综合天天夜夜久久| 国产成人在线视频网站| 一区二区三区影院| 亚洲欧美色图小说| 另类人妖一区二区av| 亚洲免费观看高清在线观看| 久久久亚洲精品一区二区三区| 欧美日韩国产123区| 欧美一区二区三区免费大片 | 麻豆成人久久精品二区三区小说| 亚洲h在线观看| 国产精品国产三级国产aⅴ入口| 精品88久久久久88久久久| 欧美一区二区三区视频免费| 91精品免费在线观看| 日韩天堂在线观看| 91精品国产色综合久久不卡蜜臀| 欧美天堂一区二区三区| 在线免费观看日本欧美| av电影在线观看不卡| 欧美日韩电影在线播放| 91麻豆精品国产91久久久 | 国产精品久久久一本精品| 国产亚洲欧洲一区高清在线观看| 精品福利在线导航| 久久精品日产第一区二区三区高清版 | 日本一区二区在线不卡|