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

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

?? scsi-disk.c

?? QEMU 0.91 source code, supports ARM processor including S3C24xx series
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* * SCSI Device emulation * * Copyright (c) 2006 CodeSourcery. * Based on code by Fabrice Bellard * * Written by Paul Brook * * This code is licenced under the LGPL. * * Note that this file only handles the SCSI architecture model and device * commands.  Emultion of interface/link layer protocols is handled by * the host adapter emulation. *///#define DEBUG_SCSI#ifdef DEBUG_SCSI#define DPRINTF(fmt, args...) \do { printf("scsi-disk: " fmt , ##args); } while (0)#else#define DPRINTF(fmt, args...) do {} while(0)#endif#define BADF(fmt, args...) \do { fprintf(stderr, "scsi-disk: " fmt , ##args); } while (0)#include "qemu-common.h"#include "block.h"#include "scsi-disk.h"#define SENSE_NO_SENSE        0#define SENSE_NOT_READY       2#define SENSE_HARDWARE_ERROR  4#define SENSE_ILLEGAL_REQUEST 5#define SCSI_DMA_BUF_SIZE    65536typedef struct SCSIRequest {    SCSIDeviceState *dev;    uint32_t tag;    /* ??? We should probably keep track of whether the data trasfer is       a read or a write.  Currently we rely on the host getting it right.  */    /* Both sector and sector_count are in terms of qemu 512 byte blocks.  */    int sector;    int sector_count;    /* The amounnt of data in the buffer.  */    int buf_len;    uint8_t *dma_buf;    BlockDriverAIOCB *aiocb;    struct SCSIRequest *next;} SCSIRequest;struct SCSIDeviceState{    BlockDriverState *bdrv;    SCSIRequest *requests;    /* The qemu block layer uses a fixed 512 byte sector size.       This is the number of 512 byte blocks in a single scsi sector.  */    int cluster_size;    int sense;    int tcq;    /* Completion functions may be called from either scsi_{read,write}_data       or from the AIO completion routines.  */    scsi_completionfn completion;    void *opaque;};/* Global pool of SCSIRequest structures.  */static SCSIRequest *free_requests = NULL;static SCSIRequest *scsi_new_request(SCSIDeviceState *s, uint32_t tag){    SCSIRequest *r;    if (free_requests) {        r = free_requests;        free_requests = r->next;    } else {        r = qemu_malloc(sizeof(SCSIRequest));        r->dma_buf = qemu_memalign(512, SCSI_DMA_BUF_SIZE);    }    r->dev = s;    r->tag = tag;    r->sector_count = 0;    r->buf_len = 0;    r->aiocb = NULL;    r->next = s->requests;    s->requests = r;    return r;}static void scsi_remove_request(SCSIRequest *r){    SCSIRequest *last;    SCSIDeviceState *s = r->dev;    if (s->requests == r) {        s->requests = r->next;    } else {        last = s->requests;        while (last && last->next != r)            last = last->next;        if (last) {            last->next = r->next;        } else {            BADF("Orphaned request\n");        }    }    r->next = free_requests;    free_requests = r;}static SCSIRequest *scsi_find_request(SCSIDeviceState *s, uint32_t tag){    SCSIRequest *r;    r = s->requests;    while (r && r->tag != tag)        r = r->next;    return r;}/* Helper function for command completion.  */static void scsi_command_complete(SCSIRequest *r, int sense){    SCSIDeviceState *s = r->dev;    uint32_t tag;    DPRINTF("Command complete tag=0x%x sense=%d\n", r->tag, sense);    s->sense = sense;    tag = r->tag;    scsi_remove_request(r);    s->completion(s->opaque, SCSI_REASON_DONE, tag, sense);}/* Cancel a pending data transfer.  */static void scsi_cancel_io(SCSIDevice *d, uint32_t tag){    SCSIDeviceState *s = d->state;    SCSIRequest *r;    DPRINTF("Cancel tag=0x%x\n", tag);    r = scsi_find_request(s, tag);    if (r) {        if (r->aiocb)            bdrv_aio_cancel(r->aiocb);        r->aiocb = NULL;        scsi_remove_request(r);    }}static void scsi_read_complete(void * opaque, int ret){    SCSIRequest *r = (SCSIRequest *)opaque;    SCSIDeviceState *s = r->dev;    if (ret) {        DPRINTF("IO error\n");        scsi_command_complete(r, SENSE_HARDWARE_ERROR);        return;    }    DPRINTF("Data ready tag=0x%x len=%d\n", r->tag, r->buf_len);    s->completion(s->opaque, SCSI_REASON_DATA, r->tag, r->buf_len);}/* Read more data from scsi device into buffer.  */static void scsi_read_data(SCSIDevice *d, uint32_t tag){    SCSIDeviceState *s = d->state;    SCSIRequest *r;    uint32_t n;    r = scsi_find_request(s, tag);    if (!r) {        BADF("Bad read tag 0x%x\n", tag);        /* ??? This is the wrong error.  */        scsi_command_complete(r, SENSE_HARDWARE_ERROR);        return;    }    if (r->sector_count == (uint32_t)-1) {        DPRINTF("Read buf_len=%d\n", r->buf_len);        r->sector_count = 0;        s->completion(s->opaque, SCSI_REASON_DATA, r->tag, r->buf_len);        return;    }    DPRINTF("Read sector_count=%d\n", r->sector_count);    if (r->sector_count == 0) {        scsi_command_complete(r, SENSE_NO_SENSE);        return;    }    n = r->sector_count;    if (n > SCSI_DMA_BUF_SIZE / 512)        n = SCSI_DMA_BUF_SIZE / 512;    r->buf_len = n * 512;    r->aiocb = bdrv_aio_read(s->bdrv, r->sector, r->dma_buf, n,                             scsi_read_complete, r);    if (r->aiocb == NULL)        scsi_command_complete(r, SENSE_HARDWARE_ERROR);    r->sector += n;    r->sector_count -= n;}static void scsi_write_complete(void * opaque, int ret){    SCSIRequest *r = (SCSIRequest *)opaque;    SCSIDeviceState *s = r->dev;    uint32_t len;    if (ret) {        fprintf(stderr, "scsi-disc: IO write error\n");        exit(1);    }    r->aiocb = NULL;    if (r->sector_count == 0) {        scsi_command_complete(r, SENSE_NO_SENSE);    } else {        len = r->sector_count * 512;        if (len > SCSI_DMA_BUF_SIZE) {            len = SCSI_DMA_BUF_SIZE;        }        r->buf_len = len;        DPRINTF("Write complete tag=0x%x more=%d\n", r->tag, len);        s->completion(s->opaque, SCSI_REASON_DATA, r->tag, len);    }}/* Write data to a scsi device.  Returns nonzero on failure.   The transfer may complete asynchronously.  */static int scsi_write_data(SCSIDevice *d, uint32_t tag){    SCSIDeviceState *s = d->state;    SCSIRequest *r;    uint32_t n;    DPRINTF("Write data tag=0x%x\n", tag);    r = scsi_find_request(s, tag);    if (!r) {        BADF("Bad write tag 0x%x\n", tag);        scsi_command_complete(r, SENSE_HARDWARE_ERROR);        return 1;    }    if (r->aiocb)        BADF("Data transfer already in progress\n");    n = r->buf_len / 512;    if (n) {        r->aiocb = bdrv_aio_write(s->bdrv, r->sector, r->dma_buf, n,                                  scsi_write_complete, r);        if (r->aiocb == NULL)            scsi_command_complete(r, SENSE_HARDWARE_ERROR);        r->sector += n;        r->sector_count -= n;    } else {        /* Invoke completion routine to fetch data from host.  */        scsi_write_complete(r, 0);    }    return 0;}/* Return a pointer to the data buffer.  */static uint8_t *scsi_get_buf(SCSIDevice *d, uint32_t tag){    SCSIDeviceState *s = d->state;    SCSIRequest *r;    r = scsi_find_request(s, tag);    if (!r) {        BADF("Bad buffer tag 0x%x\n", tag);        return NULL;    }    return r->dma_buf;}/* Execute a scsi command.  Returns the length of the data expected by the   command.  This will be Positive for data transfers from the device   (eg. disk reads), negative for transfers to the device (eg. disk writes),   and zero if the command does not transfer any data.  */static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag,                                 uint8_t *buf, int lun){    SCSIDeviceState *s = d->state;    uint64_t nb_sectors;    uint32_t lba;    uint32_t len;    int cmdlen;    int is_write;    uint8_t command;    uint8_t *outbuf;    SCSIRequest *r;    command = buf[0];    r = scsi_find_request(s, tag);    if (r) {        BADF("Tag 0x%x already in use\n", tag);        scsi_cancel_io(d, tag);    }    /* ??? Tags are not unique for different luns.  We only implement a       single lun, so this should not matter.  */    r = scsi_new_request(s, tag);    outbuf = r->dma_buf;    is_write = 0;    DPRINTF("Command: lun=%d tag=0x%x data=0x%02x", lun, tag, buf[0]);    switch (command >> 5) {    case 0:

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
免费在线一区观看| 一区二区三区日本| 国产精品中文字幕日韩精品 | 一区二区理论电影在线观看| 91视频观看视频| 一二三区精品视频| 91精品久久久久久蜜臀| 日日骚欧美日韩| 日韩欧美国产一区二区三区| 国模一区二区三区白浆| 国产欧美综合在线观看第十页| 国产一区高清在线| 中文字幕一区二区三区不卡在线| 色域天天综合网| 午夜精品久久一牛影视| 日韩精品中文字幕在线不卡尤物| 国产一区二区三区久久久| 国产精品色婷婷| 欧美三级韩国三级日本一级| 美女免费视频一区| 国产免费观看久久| 欧美怡红院视频| 极品销魂美女一区二区三区| 久久久99免费| 欧美少妇一区二区| 国产成人精品亚洲午夜麻豆| 亚洲欧美日韩人成在线播放| 日韩限制级电影在线观看| 国产不卡在线播放| 午夜精彩视频在线观看不卡| 2023国产精品| 欧美日韩高清影院| 成人中文字幕电影| 日韩成人精品在线| 中文字幕av一区二区三区 | 欧美日韩国产经典色站一区二区三区| 蜜臀精品一区二区三区在线观看| 国产精品女主播在线观看| 欧美无乱码久久久免费午夜一区| 久久精品国产99久久6| 中文字幕日韩精品一区| 日韩视频一区二区| 在线视频国产一区| 国产成人免费高清| 全国精品久久少妇| 亚洲欧美日韩久久| 国产亚洲欧洲997久久综合 | 99久久久免费精品国产一区二区| 亚洲成人先锋电影| 成人欧美一区二区三区| 久久综合色之久久综合| 欧美日韩亚洲高清一区二区| 成人免费看视频| 精品一区二区三区免费毛片爱| 夜夜精品视频一区二区 | 日韩欧美中文一区二区| 色婷婷综合在线| 丁香激情综合国产| 国产一区二区免费视频| 日韩高清国产一区在线| 一区二区三区四区国产精品| 国产三级精品在线| 精品国产一区二区精华| 欧美日韩第一区日日骚| 色天使久久综合网天天| 99综合影院在线| 国产成人免费av在线| 国内精品视频一区二区三区八戒| 午夜欧美电影在线观看| 依依成人综合视频| 最新国产の精品合集bt伙计| 欧美激情中文不卡| 蜜桃视频免费观看一区| 亚洲一区二区三区精品在线| 日韩毛片在线免费观看| 国产精品久久久久天堂| 国产亚洲综合av| 日本一区二区高清| 亚洲国产高清在线观看视频| 久久久99免费| 国产精品久久看| 1000部国产精品成人观看| 亚洲欧美日韩电影| 亚洲欧美电影院| 一区二区三区四区不卡视频| 亚洲电影中文字幕在线观看| 亚洲香肠在线观看| 日本中文一区二区三区| 麻豆精品精品国产自在97香蕉| 蜜臀av一区二区| 国产一区二区三区四区在线观看| 国产在线国偷精品免费看| 国产乱子伦视频一区二区三区| 国产成人精品影视| 91久久精品日日躁夜夜躁欧美| 91福利社在线观看| 91精品国产综合久久福利| 日韩亚洲欧美一区| 国产精品理论片在线观看| 亚洲日本在线观看| 午夜精品福利一区二区蜜股av| 日日夜夜一区二区| 国产综合久久久久久久久久久久| 国产福利一区二区三区在线视频| 成人黄色在线网站| 欧美日韩1234| 国产婷婷一区二区| 玉足女爽爽91| 久久国产精品99久久久久久老狼| 国产传媒日韩欧美成人| 一道本成人在线| 日韩一二三四区| 亚洲视频一区二区在线| 免费成人美女在线观看| 处破女av一区二区| 欧美日韩一区精品| 久久九九久精品国产免费直播| 亚洲三级久久久| 美女国产一区二区| www.综合网.com| 日韩欧美一级二级三级久久久| 国产精品久久精品日日| 五月天一区二区三区| 成人免费av网站| 日韩精品专区在线| 亚洲综合色噜噜狠狠| 国产原创一区二区| 欧美日韩一卡二卡| 国产免费观看久久| 美女视频免费一区| 欧美在线你懂得| 中文字幕高清不卡| 久久精品国产99| 日本精品视频一区二区三区| 久久久久国产精品人| 日韩制服丝袜先锋影音| 99re视频这里只有精品| 26uuu久久综合| 午夜一区二区三区视频| 91免费视频网址| 久久精品视频在线看| 视频一区视频二区在线观看| fc2成人免费人成在线观看播放| 日韩欧美在线网站| 视频在线观看91| 91国偷自产一区二区三区观看| 久久久综合精品| 日日夜夜精品免费视频| 在线欧美日韩国产| 亚洲同性gay激情无套| 国产二区国产一区在线观看| 日韩一区国产二区欧美三区| 亚洲精品水蜜桃| 99在线精品一区二区三区| 久久久久久久久伊人| 免费看黄色91| 日韩欧美另类在线| 男男视频亚洲欧美| 欧美一级高清片| 免费观看一级欧美片| 欧美一级淫片007| 日本女人一区二区三区| 欧美美女网站色| 亚洲va国产天堂va久久en| 欧美色综合网站| 亚洲国产综合色| 在线观看国产精品网站| 一区二区欧美精品| 欧美日韩国产大片| 免费精品99久久国产综合精品| 欧美裸体bbwbbwbbw| 天天色综合成人网| 日韩限制级电影在线观看| 久久国产精品色婷婷| 26uuu国产电影一区二区| 激情综合亚洲精品| 中文字幕欧美日韩一区| 成人综合在线视频| 一区二区三区久久| 欧美日韩精品一区二区| 天天影视网天天综合色在线播放| 欧美日韩在线三级| 免费看欧美美女黄的网站| 久久综合九色综合欧美亚洲| 国产激情精品久久久第一区二区| 久久久亚洲高清| 99在线精品观看| 亚洲综合区在线| 日韩欧美在线综合网| 国产精品亚洲视频| 日韩一区中文字幕| 欧美日韩大陆一区二区| 久草在线在线精品观看| 亚洲国产高清aⅴ视频| 色噜噜狠狠色综合中国| 三级一区在线视频先锋| 国产日韩欧美制服另类| 91在线观看高清| 蜜臀久久99精品久久久久宅男| 久久久精品影视|