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

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

?? ne2000.c

?? QEMU 0.91 source code, supports ARM processor including S3C24xx series
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* * QEMU NE2000 emulation * * Copyright (c) 2003-2004 Fabrice Bellard * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */#include "hw.h"#include "pci.h"#include "pc.h"#include "net.h"/* debug NE2000 card *///#define DEBUG_NE2000#define MAX_ETH_FRAME_SIZE 1514#define E8390_CMD	0x00  /* The command register (for all pages) *//* Page 0 register offsets. */#define EN0_CLDALO	0x01	/* Low byte of current local dma addr  RD */#define EN0_STARTPG	0x01	/* Starting page of ring bfr WR */#define EN0_CLDAHI	0x02	/* High byte of current local dma addr  RD */#define EN0_STOPPG	0x02	/* Ending page +1 of ring bfr WR */#define EN0_BOUNDARY	0x03	/* Boundary page of ring bfr RD WR */#define EN0_TSR		0x04	/* Transmit status reg RD */#define EN0_TPSR	0x04	/* Transmit starting page WR */#define EN0_NCR		0x05	/* Number of collision reg RD */#define EN0_TCNTLO	0x05	/* Low  byte of tx byte count WR */#define EN0_FIFO	0x06	/* FIFO RD */#define EN0_TCNTHI	0x06	/* High byte of tx byte count WR */#define EN0_ISR		0x07	/* Interrupt status reg RD WR */#define EN0_CRDALO	0x08	/* low byte of current remote dma address RD */#define EN0_RSARLO	0x08	/* Remote start address reg 0 */#define EN0_CRDAHI	0x09	/* high byte, current remote dma address RD */#define EN0_RSARHI	0x09	/* Remote start address reg 1 */#define EN0_RCNTLO	0x0a	/* Remote byte count reg WR */#define EN0_RTL8029ID0	0x0a	/* Realtek ID byte #1 RD */#define EN0_RCNTHI	0x0b	/* Remote byte count reg WR */#define EN0_RTL8029ID1	0x0b	/* Realtek ID byte #2 RD */#define EN0_RSR		0x0c	/* rx status reg RD */#define EN0_RXCR	0x0c	/* RX configuration reg WR */#define EN0_TXCR	0x0d	/* TX configuration reg WR */#define EN0_COUNTER0	0x0d	/* Rcv alignment error counter RD */#define EN0_DCFG	0x0e	/* Data configuration reg WR */#define EN0_COUNTER1	0x0e	/* Rcv CRC error counter RD */#define EN0_IMR		0x0f	/* Interrupt mask reg WR */#define EN0_COUNTER2	0x0f	/* Rcv missed frame error counter RD */#define EN1_PHYS        0x11#define EN1_CURPAG      0x17#define EN1_MULT        0x18#define EN2_STARTPG	0x21	/* Starting page of ring bfr RD */#define EN2_STOPPG	0x22	/* Ending page +1 of ring bfr RD */#define EN3_CONFIG0	0x33#define EN3_CONFIG1	0x34#define EN3_CONFIG2	0x35#define EN3_CONFIG3	0x36/*  Register accessed at EN_CMD, the 8390 base addr.  */#define E8390_STOP	0x01	/* Stop and reset the chip */#define E8390_START	0x02	/* Start the chip, clear reset */#define E8390_TRANS	0x04	/* Transmit a frame */#define E8390_RREAD	0x08	/* Remote read */#define E8390_RWRITE	0x10	/* Remote write  */#define E8390_NODMA	0x20	/* Remote DMA */#define E8390_PAGE0	0x00	/* Select page chip registers */#define E8390_PAGE1	0x40	/* using the two high-order bits */#define E8390_PAGE2	0x80	/* Page 3 is invalid. *//* Bits in EN0_ISR - Interrupt status register */#define ENISR_RX	0x01	/* Receiver, no error */#define ENISR_TX	0x02	/* Transmitter, no error */#define ENISR_RX_ERR	0x04	/* Receiver, with error */#define ENISR_TX_ERR	0x08	/* Transmitter, with error */#define ENISR_OVER	0x10	/* Receiver overwrote the ring */#define ENISR_COUNTERS	0x20	/* Counters need emptying */#define ENISR_RDC	0x40	/* remote dma complete */#define ENISR_RESET	0x80	/* Reset completed */#define ENISR_ALL	0x3f	/* Interrupts we will enable *//* Bits in received packet status byte and EN0_RSR*/#define ENRSR_RXOK	0x01	/* Received a good packet */#define ENRSR_CRC	0x02	/* CRC error */#define ENRSR_FAE	0x04	/* frame alignment error */#define ENRSR_FO	0x08	/* FIFO overrun */#define ENRSR_MPA	0x10	/* missed pkt */#define ENRSR_PHY	0x20	/* physical/multicast address */#define ENRSR_DIS	0x40	/* receiver disable. set in monitor mode */#define ENRSR_DEF	0x80	/* deferring *//* Transmitted packet status, EN0_TSR. */#define ENTSR_PTX 0x01	/* Packet transmitted without error */#define ENTSR_ND  0x02	/* The transmit wasn't deferred. */#define ENTSR_COL 0x04	/* The transmit collided at least once. */#define ENTSR_ABT 0x08  /* The transmit collided 16 times, and was deferred. */#define ENTSR_CRS 0x10	/* The carrier sense was lost. */#define ENTSR_FU  0x20  /* A "FIFO underrun" occurred during transmit. */#define ENTSR_CDH 0x40	/* The collision detect "heartbeat" signal was lost. */#define ENTSR_OWC 0x80  /* There was an out-of-window collision. */#define NE2000_PMEM_SIZE    (32*1024)#define NE2000_PMEM_START   (16*1024)#define NE2000_PMEM_END     (NE2000_PMEM_SIZE+NE2000_PMEM_START)#define NE2000_MEM_SIZE     NE2000_PMEM_ENDtypedef struct NE2000State {    uint8_t cmd;    uint32_t start;    uint32_t stop;    uint8_t boundary;    uint8_t tsr;    uint8_t tpsr;    uint16_t tcnt;    uint16_t rcnt;    uint32_t rsar;    uint8_t rsr;    uint8_t rxcr;    uint8_t isr;    uint8_t dcfg;    uint8_t imr;    uint8_t phys[6]; /* mac address */    uint8_t curpag;    uint8_t mult[8]; /* multicast mask array */    qemu_irq irq;    PCIDevice *pci_dev;    VLANClientState *vc;    uint8_t macaddr[6];    uint8_t mem[NE2000_MEM_SIZE];} NE2000State;static void ne2000_reset(NE2000State *s){    int i;    s->isr = ENISR_RESET;    memcpy(s->mem, s->macaddr, 6);    s->mem[14] = 0x57;    s->mem[15] = 0x57;    /* duplicate prom data */    for(i = 15;i >= 0; i--) {        s->mem[2 * i] = s->mem[i];        s->mem[2 * i + 1] = s->mem[i];    }}static void ne2000_update_irq(NE2000State *s){    int isr;    isr = (s->isr & s->imr) & 0x7f;#if defined(DEBUG_NE2000)    printf("NE2000: Set IRQ to %d (%02x %02x)\n",	   isr ? 1 : 0, s->isr, s->imr);#endif    qemu_set_irq(s->irq, (isr != 0));}#define POLYNOMIAL 0x04c11db6/* From FreeBSD *//* XXX: optimize */static int compute_mcast_idx(const uint8_t *ep){    uint32_t crc;    int carry, i, j;    uint8_t b;    crc = 0xffffffff;    for (i = 0; i < 6; i++) {        b = *ep++;        for (j = 0; j < 8; j++) {            carry = ((crc & 0x80000000L) ? 1 : 0) ^ (b & 0x01);            crc <<= 1;            b >>= 1;            if (carry)                crc = ((crc ^ POLYNOMIAL) | carry);        }    }    return (crc >> 26);}static int ne2000_buffer_full(NE2000State *s){    int avail, index, boundary;    index = s->curpag << 8;    boundary = s->boundary << 8;    if (index < boundary)        avail = boundary - index;    else        avail = (s->stop - s->start) - (index - boundary);    if (avail < (MAX_ETH_FRAME_SIZE + 4))        return 1;    return 0;}static int ne2000_can_receive(void *opaque){    NE2000State *s = opaque;    if (s->cmd & E8390_STOP)        return 1;    return !ne2000_buffer_full(s);}#define MIN_BUF_SIZE 60static void ne2000_receive(void *opaque, const uint8_t *buf, int size){    NE2000State *s = opaque;    uint8_t *p;    unsigned int total_len, next, avail, len, index, mcast_idx;    uint8_t buf1[60];    static const uint8_t broadcast_macaddr[6] =        { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };#if defined(DEBUG_NE2000)    printf("NE2000: received len=%d\n", size);#endif    if (s->cmd & E8390_STOP || ne2000_buffer_full(s))        return;    /* XXX: check this */    if (s->rxcr & 0x10) {        /* promiscuous: receive all */    } else {        if (!memcmp(buf,  broadcast_macaddr, 6)) {            /* broadcast address */            if (!(s->rxcr & 0x04))                return;        } else if (buf[0] & 0x01) {            /* multicast */            if (!(s->rxcr & 0x08))                return;            mcast_idx = compute_mcast_idx(buf);            if (!(s->mult[mcast_idx >> 3] & (1 << (mcast_idx & 7))))                return;        } else if (s->mem[0] == buf[0] &&                   s->mem[2] == buf[1] &&                   s->mem[4] == buf[2] &&                   s->mem[6] == buf[3] &&                   s->mem[8] == buf[4] &&                   s->mem[10] == buf[5]) {            /* match */        } else {            return;        }    }    /* if too small buffer, then expand it */    if (size < MIN_BUF_SIZE) {        memcpy(buf1, buf, size);        memset(buf1 + size, 0, MIN_BUF_SIZE - size);        buf = buf1;        size = MIN_BUF_SIZE;    }    index = s->curpag << 8;    /* 4 bytes for header */    total_len = size + 4;    /* address for next packet (4 bytes for CRC) */    next = index + ((total_len + 4 + 255) & ~0xff);    if (next >= s->stop)        next -= (s->stop - s->start);    /* prepare packet header */    p = s->mem + index;    s->rsr = ENRSR_RXOK; /* receive status */    /* XXX: check this */    if (buf[0] & 0x01)        s->rsr |= ENRSR_PHY;    p[0] = s->rsr;    p[1] = next >> 8;    p[2] = total_len;    p[3] = total_len >> 8;    index += 4;    /* write packet data */    while (size > 0) {        if (index <= s->stop)            avail = s->stop - index;        else            avail = 0;        len = size;        if (len > avail)            len = avail;        memcpy(s->mem + index, buf, len);        buf += len;        index += len;        if (index == s->stop)            index = s->start;        size -= len;    }    s->curpag = next >> 8;    /* now we can signal we have received something */    s->isr |= ENISR_RX;    ne2000_update_irq(s);}static void ne2000_ioport_write(void *opaque, uint32_t addr, uint32_t val){    NE2000State *s = opaque;    int offset, page, index;    addr &= 0xf;#ifdef DEBUG_NE2000    printf("NE2000: write addr=0x%x val=0x%02x\n", addr, val);#endif    if (addr == E8390_CMD) {        /* control register */        s->cmd = val;        if (!(val & E8390_STOP)) { /* START bit makes no sense on RTL8029... */            s->isr &= ~ENISR_RESET;            /* test specific case: zero length transfer */            if ((val & (E8390_RREAD | E8390_RWRITE)) &&                s->rcnt == 0) {                s->isr |= ENISR_RDC;                ne2000_update_irq(s);            }            if (val & E8390_TRANS) {                index = (s->tpsr << 8);                /* XXX: next 2 lines are a hack to make netware 3.11 work */                if (index >= NE2000_PMEM_END)                    index -= NE2000_PMEM_SIZE;                /* fail safe: check range on the transmitted length  */                if (index + s->tcnt <= NE2000_PMEM_END) {                    qemu_send_packet(s->vc, s->mem + index, s->tcnt);                }                /* signal end of transfer */                s->tsr = ENTSR_PTX;                s->isr |= ENISR_TX;                s->cmd &= ~E8390_TRANS;                ne2000_update_irq(s);            }        }    } else {        page = s->cmd >> 6;        offset = addr | (page << 4);        switch(offset) {        case EN0_STARTPG:            s->start = val << 8;            break;        case EN0_STOPPG:            s->stop = val << 8;            break;        case EN0_BOUNDARY:            s->boundary = val;            break;        case EN0_IMR:            s->imr = val;            ne2000_update_irq(s);            break;        case EN0_TPSR:            s->tpsr = val;            break;        case EN0_TCNTLO:            s->tcnt = (s->tcnt & 0xff00) | val;            break;        case EN0_TCNTHI:            s->tcnt = (s->tcnt & 0x00ff) | (val << 8);            break;        case EN0_RSARLO:            s->rsar = (s->rsar & 0xff00) | val;            break;        case EN0_RSARHI:            s->rsar = (s->rsar & 0x00ff) | (val << 8);            break;        case EN0_RCNTLO:            s->rcnt = (s->rcnt & 0xff00) | val;            break;        case EN0_RCNTHI:            s->rcnt = (s->rcnt & 0x00ff) | (val << 8);            break;        case EN0_RXCR:            s->rxcr = val;            break;        case EN0_DCFG:            s->dcfg = val;            break;        case EN0_ISR:            s->isr &= ~(val & 0x7f);            ne2000_update_irq(s);            break;        case EN1_PHYS ... EN1_PHYS + 5:            s->phys[offset - EN1_PHYS] = val;            break;        case EN1_CURPAG:            s->curpag = val;            break;        case EN1_MULT ... EN1_MULT + 7:            s->mult[offset - EN1_MULT] = val;            break;        }    }}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
www激情久久| 亚洲免费大片在线观看| 免费看精品久久片| 欧美日本一区二区在线观看| 国产精品少妇自拍| 成人黄页在线观看| 最新国产成人在线观看| 99久久国产综合色|国产精品| 久久免费视频一区| 成人精品高清在线| 国产精品综合视频| 亚洲精品一区二区精华| 精品一区二区三区免费| 精品久久国产老人久久综合| 国产精品一区二区在线观看不卡| 欧美大黄免费观看| 国产成人aaaa| 五月综合激情婷婷六月色窝| 欧美哺乳videos| 色偷偷88欧美精品久久久| 亚洲国产毛片aaaaa无费看| 欧美日韩黄色影视| 国产精品12区| 亚洲精品国产品国语在线app| 91麻豆精品国产91久久久更新时间| 久久综合综合久久综合| 亚洲欧美日韩久久| 欧美videossexotv100| 91在线码无精品| 极品销魂美女一区二区三区| 国产视频一区在线观看| 欧美精品丝袜久久久中文字幕| 国产自产高清不卡| 亚洲国产欧美另类丝袜| 国产精品美女久久福利网站 | 国产精品久久久久久户外露出| 91女厕偷拍女厕偷拍高清| 国产一区二区成人久久免费影院 | 久久国产尿小便嘘嘘| 亚洲色图.com| 国产精品动漫网站| 日韩精品一区二区三区四区| 日韩一区二区三区在线观看| 色婷婷综合久久久中文一区二区 | 成人午夜伦理影院| 久久国产精品99久久久久久老狼| 一区二区三区资源| 最新中文字幕一区二区三区| 国产日韩欧美一区二区三区乱码| 日韩一区二区三区视频在线观看| 欧美性极品少妇| 91免费视频大全| 色综合久久中文综合久久97| 91视频免费观看| 欧美在线一区二区| 欧美麻豆精品久久久久久| 欧美三级电影网站| 欧美一级片免费看| 久久久不卡网国产精品二区 | 99视频国产精品| 91麻豆精品国产91久久久更新时间| 在线观看亚洲专区| 精品日韩欧美一区二区| 久久精品日产第一区二区三区高清版| 中文字幕精品—区二区四季| 亚洲在线成人精品| 国产一本一道久久香蕉| 色婷婷av一区二区三区软件| 日韩一级二级三级精品视频| 久久女同精品一区二区| 亚洲综合色成人| 国产精品一线二线三线| 欧美日韩另类一区| 亚洲视频 欧洲视频| 久久国内精品视频| 欧美日韩一区成人| 一区二区三区在线视频观看58 | 综合电影一区二区三区 | av午夜精品一区二区三区| 3d动漫精品啪啪一区二区竹菊 | 午夜精品福利在线| 色综合久久六月婷婷中文字幕| 日韩欧美一区二区在线视频| 亚洲欧美偷拍另类a∨色屁股| 国产一区二区网址| 欧美哺乳videos| 男女男精品视频网| 欧美肥大bbwbbw高潮| 亚洲一区二区成人在线观看| 91热门视频在线观看| 成人欧美一区二区三区视频网页| 粉嫩绯色av一区二区在线观看 | 视频精品一区二区| 884aa四虎影成人精品一区| 亚洲综合免费观看高清在线观看| 99热精品国产| 亚洲精品老司机| 欧美揉bbbbb揉bbbbb| 蜜臀av性久久久久av蜜臀妖精| 日韩欧美不卡一区| 国产一区二区三区四区在线观看 | 成人动漫av在线| 亚洲精选在线视频| 亚洲色图在线视频| 91丝袜美腿高跟国产极品老师| 自拍偷在线精品自拍偷无码专区| 99国产精品久久久| 亚洲午夜精品网| 欧美大片国产精品| 不卡的电影网站| 首页国产欧美久久| 久久九九久久九九| 色999日韩国产欧美一区二区| 午夜伦欧美伦电影理论片| 国产色爱av资源综合区| 日本成人在线网站| 91福利精品第一导航| 国产精品影视天天线| 国产一区二区女| 蜜臀国产一区二区三区在线播放| 精品人伦一区二区色婷婷| 91亚洲精品乱码久久久久久蜜桃| 亚洲国产另类av| 国产蜜臀av在线一区二区三区| 欧美三级三级三级爽爽爽| 国产一区二区三区av电影| 亚洲国产wwwccc36天堂| 久久久久久久久久久电影| 91精品一区二区三区在线观看| 91在线观看成人| 国内成人精品2018免费看| 日韩成人精品视频| 亚洲一区在线观看网站| 亚洲精品国产成人久久av盗摄| 成人欧美一区二区三区视频网页 | 99久久伊人精品| 国产精品自拍在线| 国内国产精品久久| 国产美女一区二区| 国产精品亚洲专一区二区三区 | 欧美日韩中字一区| 欧美日韩亚洲不卡| 麻豆视频观看网址久久| 免费高清在线视频一区·| 亚洲天天做日日做天天谢日日欢 | 国产一区二区福利| 国产毛片精品国产一区二区三区| 国产精品一区二区在线播放| 成人av网址在线| 欧美日韩国产成人在线免费| 3d动漫精品啪啪一区二区竹菊| 色一情一乱一乱一91av| 成人av资源下载| 精品一区二区三区不卡| 国产一区二区美女| 国内精品视频666| 国产精品丝袜久久久久久app| 91福利在线播放| 欧美色大人视频| 国产成人av电影在线播放| 偷拍亚洲欧洲综合| 亚洲地区一二三色| 久色婷婷小香蕉久久| 日韩1区2区3区| 国产·精品毛片| 成人国产精品免费网站| 91亚洲永久精品| 玖玖九九国产精品| 成人aa视频在线观看| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 欧美亚洲一区二区在线观看| 亚洲一区二区在线播放相泽| 国产精品美女久久久久久久久 | √…a在线天堂一区| 男人的j进女人的j一区| 在线播放中文字幕一区| 一区二区欧美精品| 成人禁用看黄a在线| 国产69精品久久久久毛片| 欧美军同video69gay| 国产精品沙发午睡系列990531| 日本最新不卡在线| 91免费版pro下载短视频| 国产精品免费视频观看| 亚洲大型综合色站| 成人一道本在线| 在线电影欧美成精品| 久久一夜天堂av一区二区三区 | 欧美丰满嫩嫩电影| 欧美一区日韩一区| 国产精品嫩草影院av蜜臀| 亚洲欧美一区二区三区国产精品| 久久99久久久久久久久久久| 91香蕉视频污| 亚洲精品亚洲人成人网在线播放| 国产一区二区三区四区在线观看 | 91猫先生在线| 午夜精品久久久久久久久| 99精品视频在线免费观看| 国产精品萝li|