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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? scsi-generic.c

?? QEMU 0.91 source code, supports ARM processor including S3C24xx series
?? C
?? 第 1 頁 / 共 2 頁
字號:
    if (ret == -1) {        scsi_command_complete(r, -EINVAL);        return 1;    }    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->buf;}static int scsi_length(uint8_t *cmd, int blocksize, int *cmdlen, uint32_t *len){    switch (cmd[0] >> 5) {    case 0:        *len = cmd[4];        *cmdlen = 6;        break;    case 1:    case 2:        *len = cmd[8] | (cmd[7] << 8);        *cmdlen = 10;        break;    case 4:        *len = cmd[13] | (cmd[12] << 8) | (cmd[11] << 16) | (cmd[10] << 24);        *cmdlen = 16;        break;    case 5:        *len = cmd[9] | (cmd[8] << 8) | (cmd[7] << 16) | (cmd[6] << 24);        *cmdlen = 12;        break;    default:        return -1;    }    switch(cmd[0]) {    case TEST_UNIT_READY:    case REZERO_UNIT:    case START_STOP:    case SEEK_6:    case WRITE_FILEMARKS:    case SPACE:    case ERASE:    case ALLOW_MEDIUM_REMOVAL:    case VERIFY:    case SEEK_10:    case SYNCHRONIZE_CACHE:    case LOCK_UNLOCK_CACHE:    case LOAD_UNLOAD:    case SET_CD_SPEED:    case SET_LIMITS:    case WRITE_LONG:    case MOVE_MEDIUM:    case UPDATE_BLOCK:        *len = 0;        break;    case MODE_SENSE:        break;    case WRITE_SAME:        *len = 1;        break;    case READ_CAPACITY:        *len = 8;        break;    case READ_BLOCK_LIMITS:        *len = 6;        break;    case READ_POSITION:        *len = 20;        break;    case SEND_VOLUME_TAG:        *len *= 40;        break;    case MEDIUM_SCAN:        *len *= 8;        break;    case WRITE_10:        cmd[1] &= ~0x08;	/* disable FUA */    case WRITE_VERIFY:    case WRITE_6:    case WRITE_12:    case WRITE_VERIFY_12:        *len *= blocksize;        break;    case READ_10:        cmd[1] &= ~0x08;	/* disable FUA */    case READ_6:    case READ_REVERSE:    case RECOVER_BUFFERED_DATA:    case READ_12:        *len *= blocksize;        break;    }    return 0;}static int is_write(int command){    switch (command) {    case COPY:    case COPY_VERIFY:    case COMPARE:    case CHANGE_DEFINITION:    case LOG_SELECT:    case MODE_SELECT:    case MODE_SELECT_10:    case SEND_DIAGNOSTIC:    case WRITE_BUFFER:    case FORMAT_UNIT:    case REASSIGN_BLOCKS:    case RESERVE:    case SEARCH_EQUAL:    case SEARCH_HIGH:    case SEARCH_LOW:    case WRITE_6:    case WRITE_10:    case WRITE_VERIFY:    case UPDATE_BLOCK:    case WRITE_LONG:    case WRITE_SAME:    case SEARCH_HIGH_12:    case SEARCH_EQUAL_12:    case SEARCH_LOW_12:    case WRITE_12:    case WRITE_VERIFY_12:    case SET_WINDOW:    case MEDIUM_SCAN:    case SEND_VOLUME_TAG:    case WRITE_LONG_2:        return 1;    }    return 0;}/* 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 *cmd, int lun){    SCSIDeviceState *s = d->state;    uint32_t len;    int cmdlen;    SCSIRequest *r;    int ret;    /* ??? Tags are not unique for different luns.  We only implement a       single lun, so this should not matter.  */    if (lun != s->lun || (cmd[1] >> 5) != s->lun) {        DPRINTF("Unimplemented LUN %d\n", lun ? lun : cmd[1] >> 5);        s->completion(s->opaque, SCSI_REASON_DONE, tag, ILLEGAL_REQUEST);        return 0;    }    if (scsi_length(cmd, s->blocksize, &cmdlen, &len) == -1) {        BADF("Unsupported command length, command %x\n", cmd[0]);        return 0;    }    DPRINTF("Command: lun=%d tag=0x%x data=0x%02x len %d\n", lun, tag,            cmd[0], len);    r = scsi_find_request(s, tag);    if (r) {        BADF("Tag 0x%x already in use %p\n", tag, r);        scsi_cancel_io(d, tag);    }    r = scsi_new_request(s, tag);    memcpy(r->cmd, cmd, cmdlen);    r->cmdlen = cmdlen;    if (len == 0) {        if (r->buf != NULL)            free(r->buf);        r->buflen = 0;        r->buf = NULL;        ret = execute_command(s->bdrv, r, SG_DXFER_NONE, scsi_command_complete);        if (ret == -1) {            scsi_command_complete(r, -EINVAL);            return 0;        }        return 0;    }    if (r->buflen != len) {        if (r->buf != NULL)            free(r->buf);        r->buf = qemu_malloc(len);        r->buflen = len;    }    memset(r->buf, 0, r->buflen);    r->len = len;    if (is_write(cmd[0])) {        r->len = 0;        return -len;    }    return len;}static int get_blocksize(BlockDriverState *bdrv){    uint8_t cmd[10];    uint8_t buf[8];    uint8_t sensebuf[8];    sg_io_hdr_t io_header;    int ret;    memset(cmd, sizeof(cmd), 0);    memset(buf, sizeof(buf), 0);    cmd[0] = READ_CAPACITY;    memset(&io_header, 0, sizeof(io_header));    io_header.interface_id = 'S';    io_header.dxfer_direction = SG_DXFER_FROM_DEV;    io_header.dxfer_len = sizeof(buf);    io_header.dxferp = buf;    io_header.cmdp = cmd;    io_header.cmd_len = sizeof(cmd);    io_header.mx_sb_len = sizeof(sensebuf);    io_header.sbp = sensebuf;    io_header.timeout = 6000; /* XXX */    ret = bdrv_pwrite(bdrv, -1, &io_header, sizeof(io_header));    if (ret == -1)        return -1;    while ((ret = bdrv_pread(bdrv, -1, &io_header, sizeof(io_header))) == -1 &&           errno == EINTR);    if (ret == -1)        return -1;    return (buf[4] << 24) | (buf[5] << 16) | (buf[6] << 8) | buf[7];}static void scsi_destroy(SCSIDevice *d){    SCSIRequest *r, *n;    r = d->state->requests;    while (r) {        n = r->next;        qemu_free(r);        r = n;    }    r = free_requests;    while (r) {        n = r->next;        qemu_free(r);        r = n;    }    qemu_free(d->state);    qemu_free(d);}SCSIDevice *scsi_generic_init(BlockDriverState *bdrv, int tcq,                              scsi_completionfn completion, void *opaque){    int sg_version;    SCSIDevice *d;    SCSIDeviceState *s;    struct sg_scsi_id scsiid;    /* check we are really using a /dev/sg* file */    if (!bdrv_is_sg(bdrv))        return NULL;    /* check we are using a driver managing SG_IO (version 3 and after */    if (bdrv_ioctl(bdrv, SG_GET_VERSION_NUM, &sg_version) < 0 ||        sg_version < 30000)        return NULL;    /* get LUN of the /dev/sg? */    if (bdrv_ioctl(bdrv, SG_GET_SCSI_ID, &scsiid))        return NULL;    /* define device state */    s = (SCSIDeviceState *)qemu_mallocz(sizeof(SCSIDeviceState));    s->bdrv = bdrv;    s->requests = NULL;    s->completion = completion;    s->opaque = opaque;    s->lun = scsiid.lun;    s->blocksize = get_blocksize(s->bdrv);    s->driver_status = 0;    memset(s->sensebuf, 0, sizeof(s->sensebuf));    /* removable media returns 0 if not present */    if (s->blocksize <= 0)        s->blocksize = 2048;    /* define function to manage device */    d = (SCSIDevice *)qemu_mallocz(sizeof(SCSIDevice));    d->state = s;    d->destroy = scsi_destroy;    d->send_command = scsi_send_command;    d->read_data = scsi_read_data;    d->write_data = scsi_write_data;    d->cancel_io = scsi_cancel_io;    d->get_buf = scsi_get_buf;    return d;}#endif /* __linux__ */

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产mv日韩mv欧美| 国产精品中文字幕一区二区三区| 91麻豆精品国产91久久久| 国产一区二区精品久久99| 亚洲网友自拍偷拍| 国产精品久久久久久久浪潮网站| 欧美群妇大交群的观看方式| www.av亚洲| 韩国精品主播一区二区在线观看 | 欧美日韩高清一区二区不卡| 盗摄精品av一区二区三区| 在线免费观看日韩欧美| 精品亚洲aⅴ乱码一区二区三区| 日韩毛片视频在线看| 国产视频视频一区| 欧美一区二区在线免费观看| 色综合久久中文综合久久牛| 国产乱码精品一区二区三区忘忧草| 亚洲福中文字幕伊人影院| 亚洲日本在线a| 欧美经典三级视频一区二区三区| 日韩欧美另类在线| 在线成人高清不卡| 欧美色爱综合网| 色婷婷综合久久久久中文 | 日本不卡高清视频| 亚洲午夜电影在线观看| 亚洲欧美日韩久久| 国产精品天天看| 久久精品亚洲国产奇米99| 欧美一个色资源| 91精品国产欧美日韩| 欧美在线999| 91官网在线观看| 99久久伊人网影院| 99久久国产综合精品色伊| 懂色av中文一区二区三区| 国产精品一区三区| 国内精品视频一区二区三区八戒| 免费看欧美女人艹b| 日本不卡一区二区| 人人狠狠综合久久亚洲| 卡一卡二国产精品 | 亚洲一区视频在线观看视频| 亚洲欧美电影一区二区| 亚洲视频中文字幕| 亚洲欧美日韩国产另类专区| 一区二区高清免费观看影视大全 | 在线影院国内精品| 91黄视频在线| 欧美精品一二三| 日韩女同互慰一区二区| 欧美电影免费观看高清完整版在线| 欧美一区二区三区四区在线观看| 欧美一区二区在线不卡| 日韩免费视频一区二区| 久久先锋影音av| 欧美高清在线精品一区| 亚洲乱码国产乱码精品精98午夜| 亚洲综合区在线| 日韩精品视频网| 激情偷乱视频一区二区三区| 国产福利精品一区二区| 91麻豆自制传媒国产之光| 在线免费观看一区| 日韩欧美国产综合一区| 国产亚洲美州欧州综合国| 综合网在线视频| 亚洲国产一区视频| 精品亚洲免费视频| 成人久久18免费网站麻豆 | 一区二区在线电影| 免费在线视频一区| 成人永久免费视频| 欧美在线免费观看视频| 精品国产三级电影在线观看| 国产精品久久久久久妇女6080| 亚洲午夜免费电影| 国产一区二区免费在线| 色综合天天天天做夜夜夜夜做| 制服丝袜av成人在线看| 中文字幕巨乱亚洲| 亚洲第一搞黄网站| 国产成人精品亚洲777人妖| 欧洲视频一区二区| 欧美成人国产一区二区| 成人欧美一区二区三区| 日韩电影免费一区| 99在线热播精品免费| 7777精品久久久大香线蕉| 日本一区二区三区四区在线视频 | 亚洲乱码国产乱码精品精小说| 久久疯狂做爰流白浆xx| 色婷婷精品久久二区二区蜜臀av| 精品国产精品一区二区夜夜嗨| 亚洲欧美日韩精品久久久久| 国模冰冰炮一区二区| 欧美午夜免费电影| 国产欧美日韩久久| 日韩不卡一区二区| 在线亚洲+欧美+日本专区| 久久久99免费| 男女男精品网站| 91高清在线观看| 国产精品麻豆一区二区| 精品无人码麻豆乱码1区2区 | 波多野结衣亚洲一区| 日韩一区二区三| 亚洲香蕉伊在人在线观| 成人v精品蜜桃久久一区| 欧美成人bangbros| 香蕉久久夜色精品国产使用方法 | 精品一区二区三区的国产在线播放| 91精品福利在线| 国产精品乱码一区二三区小蝌蚪| 另类欧美日韩国产在线| 91麻豆精品国产| 香蕉成人啪国产精品视频综合网| 99久久精品国产一区| 久久精品免费在线观看| 麻豆精品一区二区三区| 欧美日韩国产区一| 亚洲一区二区3| 色婷婷av一区二区三区大白胸 | 亚洲精品视频一区| 成人美女在线观看| 国产精品美女久久久久aⅴ| 国产福利一区二区| 国产喂奶挤奶一区二区三区| 久久国产福利国产秒拍| 日韩精品一区二区三区在线观看 | 国产肉丝袜一区二区| 国内精品伊人久久久久av影院 | 激情综合亚洲精品| 欧美电影免费观看高清完整版| 日韩福利电影在线观看| 欧美一区二区三区四区在线观看 | 国产性色一区二区| 国产在线国偷精品产拍免费yy| 日韩欧美资源站| 日韩精品一级中文字幕精品视频免费观看 | 久久美女艺术照精彩视频福利播放| 另类欧美日韩国产在线| 欧美成人精品福利| 国产一区二区三区美女| 国产网红主播福利一区二区| 国产成人亚洲精品青草天美| 国产日产精品一区| 成人精品gif动图一区| 亚洲欧洲国产日韩| 91在线一区二区三区| 亚洲狠狠丁香婷婷综合久久久| 在线免费观看视频一区| 天天操天天色综合| 日韩欧美一卡二卡| 国产另类ts人妖一区二区| 中文字幕二三区不卡| 一本大道av伊人久久综合| 亚洲一区二区三区中文字幕在线| 欧美人xxxx| 国产精品综合av一区二区国产馆| 国产欧美一二三区| 在线观看成人小视频| 免费人成在线不卡| 国产无遮挡一区二区三区毛片日本| 99免费精品视频| 香蕉影视欧美成人| 久久久99久久| 色猫猫国产区一区二在线视频| 日韩电影免费在线看| 中文字幕乱码一区二区免费| 在线精品视频一区二区| 麻豆极品一区二区三区| 亚洲欧洲成人精品av97| 欧美男男青年gay1069videost| 国内成人精品2018免费看| 自拍av一区二区三区| 91超碰这里只有精品国产| 国产乱码精品一品二品| 一区二区三区日韩欧美| 精品第一国产综合精品aⅴ| 97精品视频在线观看自产线路二| 日本不卡一二三| 最新不卡av在线| 日韩精品一区在线观看| 91视频一区二区三区| 久久国产精品免费| 久久综合中文字幕| 午夜精品一区二区三区免费视频| 欧美另类z0zxhd电影| 韩国视频一区二区| 亚洲一区在线电影| 精品少妇一区二区三区在线播放 | 石原莉奈在线亚洲二区| 国产亚洲欧洲997久久综合| 日本精品视频一区二区三区| 国产乱子轮精品视频| 亚洲欧美国产毛片在线| 日韩欧美成人一区| 不卡的看片网站|