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

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

?? tpm-tis-device

?? xen 3.2.2 源碼
??
?? 第 1 頁 / 共 3 頁
字號:
+static CPUWriteMemoryFunc *tis_writefn[3]={+    tis_mem_writel,+    tis_mem_writel,+    tis_mem_writel+};++/*+ * Save the internal state of this interface for later resumption.+ * Need to get any outstanding responses from the vTPM back, so+ * this might delay the suspend for a while.+ */+static void tpm_save(QEMUFile* f,void* opaque)+{+    tpmState* s=(tpmState*)opaque;+    uint8_t locty = s->active_loc;+    int c;++    /* need to wait for outstanding requests to complete */+    if (s->loc[locty].state == STATE_EXECUTION) {+        int repeats = 30; /* 30 seconds; really should be infty */+        while (repeats > 0 &&+               !(s->loc[s->active_loc].sts & STS_DATA_AVAILABLE)) {+            int n = TPM_Receive(s, &s->buffer);+            if (n > 0) {+                if (IS_VALID_LOC(s->active_loc)) {+                    s->loc[s->active_loc].sts = STS_VALID | STS_DATA_AVAILABLE;+                    s->loc[s->active_loc].state = STATE_COMPLETION;+                    tis_raise_irq(s, s->active_loc, INT_DATA_AVAILABLE);+                }+                /* close the connection with the vTPM for good */+                close_vtpm_channel(s, 1);+                break;+            }+            sleep(1);+        }+    }++    if (IS_COMM_WITH_VTPM(s)) {+        close_vtpm_channel(s, 1);+    }++    qemu_put_be32s(f,&s->offset);+    qemu_put_buffer(f, s->buffer.buf, TPM_MAX_PKT);+    qemu_put_8s(f, &s->active_loc);+    qemu_put_8s(f, &s->irq_pending);+    for (c = 0; c < NUM_LOCALITIES; c++) {+        qemu_put_be32s(f, &s->loc[c].state);+        qemu_put_8s(f, &s->loc[c].access);+        qemu_put_8s(f, &s->loc[c].sts);+        qemu_put_be32s(f, &s->loc[c].inte);+        qemu_put_be32s(f, &s->loc[c].ints);+    }+}++/*+ * load TIS interface state+ */+static int tpm_load(QEMUFile* f,void* opaque,int version_id)+{+    tpmState* s=(tpmState*)opaque;+    int c;++    if (version_id != 1)+        return -EINVAL;++    qemu_get_be32s(f,&s->offset);+    qemu_get_buffer(f, s->buffer.buf, TPM_MAX_PKT);+    qemu_get_8s(f, &s->active_loc);+    qemu_get_8s(f, &s->irq_pending);+    for (c = 0; c < NUM_LOCALITIES; c++) {+        qemu_get_be32s(f, &s->loc[c].state);+        qemu_get_8s(f, &s->loc[c].access);+        qemu_get_8s(f, &s->loc[c].sts);+        qemu_get_be32s(f, &s->loc[c].inte);+        qemu_get_be32s(f, &s->loc[c].ints);+    }++    /* need to be able to get the instance number from the xenstore */+    s->vtpm_instance = vtpm_instance_from_xenstore();+    if (s->vtpm_instance == VTPM_BAD_INSTANCE)+        return -EINVAL;+    tpm_initialize_instance(s, s->vtpm_instance);++    return 0;+}+++typedef struct LPCtpmState {+    tpmState tpm;+    int mem;+} LPCtpmState;+++/*+ * initialize TIS interface+ */+void tpm_tis_init(SetIRQFunc *set_irq, void *opaque, int irq)+{+    LPCtpmState *d;+    tpmState *s;+    int c = 0;+    uint32_t vtpm_in;++    vtpm_in = vtpm_instance_from_xenstore();+    /* no valid vtpm instance -> no device */+    if (vtpm_in == VTPM_BAD_INSTANCE)+        return;++    d = qemu_mallocz(sizeof(LPCtpmState));+    d->mem = cpu_register_io_memory(0, tis_readfn, tis_writefn, d);++    if (d->mem == -1) {+       return;+    }++    cpu_register_physical_memory(TIS_ADDR_BASE,+                                 0x1000 * NUM_LOCALITIES, d->mem);++    /* initialize tpmState */+    s = &d->tpm;++    s->offset = 0;+    s->active_loc = NO_LOCALITY;++    while (c < NUM_LOCALITIES) {+        s->loc[c].access = (1 << 7);+        s->loc[c].sts = 0;+        s->loc[c].inte = (1 << 3);+        s->loc[c].ints = 0;+        s->loc[c].state = STATE_IDLE;+        c++;+    }+    s->poll_timer = qemu_new_timer(vm_clock, tis_poll_timer, s);+    s->set_irq = set_irq;+    s->irq_opaque = opaque;+    s->irq = irq;+    s->vtpm_instance = vtpm_in;+    s->Transmitlayer = -1;+    s->tpmTx.fd[0] = -1;+    s->tpmTx.fd[1] = -1;+    s->aborting_locty = NO_LOCALITY;++    tpm_initialize_instance(s, s->vtpm_instance);+    memset(s->buffer.buf,0,sizeof(s->buffer.buf));++    register_savevm("tpm-tis", 0, 1, tpm_save, tpm_load, s);+}++/****************************************************************************/+/*  optional verbose logging of data to/from vtpm                           */+/****************************************************************************/+#ifdef DEBUG_TPM+static void showBuff(unsigned char *buff, char *string)+{+    uint32_t i, len;++    len = tpm_get_size_from_buffer(buff);+    fprintf(logfile,"%s length = %d\n", string, len);+    for (i = 0; i < len; i++) {+        if (i && !(i % 16)) {+            fprintf(logfile,"\n");+        }+        fprintf(logfile,"%.2X ", buff[i]);+    }+    fprintf(logfile,"\n");+}+#endif++/****************************************************************************/+/* Transmit request to TPM and read Response                                */+/****************************************************************************/++const static unsigned char tpm_failure[] = {+    0x00, 0x00,+    0x00, 0x00, 0x00, 0x0a,+    0x00, 0x00, 0x00, 0x09+};+++/*+ * Send a TPM request.+ */+static int TPM_Send(tpmState *s, tpmBuffer *buffer, uint8_t locty, char *msg)+{+    int len;+    uint32_t size = tpm_get_size_from_buffer(buffer->buf);++    /* try to establish a connection to the vTPM */+    if ( !IS_COMM_WITH_VTPM(s)) {+        open_vtpm_channel(s);+    }++    if ( !IS_COMM_WITH_VTPM(s)) {+        unsigned char tag = buffer->buf[1];++        /* there's a failure response from the TPM */+        memcpy(buffer->buf, tpm_failure, sizeof(tpm_failure));+        buffer->buf[1] = tag + 3;+        if (IS_VALID_LOC(s->active_loc)) {+            s->loc[s->active_loc].sts = STS_DATA_AVAILABLE | STS_VALID;+        }+#ifdef DEBUG_TPM+        fprintf(logfile,"No TPM running!\n");+#endif+        /* the request went out ok. */+        return sizeof(buffer->instance) + size;+    }++#ifdef DEBUG_TPM+    showBuff(buffer->buf, "To TPM");+#endif++    /* transmit the locality in the highest 3 bits */+    buffer->instance[0] &= 0x1f;+    buffer->instance[0] |= (locty << 5);++    len = vTPMTransmit[s->Transmitlayer].write(s, buffer);+    if (len < 0) {+        s->Transmitlayer = -1;+    }+    return len;+}++/*+ * Try to receive data from the file descriptor. Since it is in+ * non-blocking mode it is possible that no data are actually received -+ * whatever calls this function needs to try again later.+ */+static int TPM_Receive(tpmState *s, tpmBuffer *buffer)+{+    int off;++    off = vTPMTransmit[s->Transmitlayer].read(s, buffer);++    if (off < 0) {+        /* EAGAIN is set in errno due to non-blocking mode */+        return -1;+    }++    if (off == 0) {+#ifdef DEBUG_TPM+        fprintf(logfile,"TPM GONE? errno=%d\n",errno);+#endif+        close_vtpm_channel(s, 1);+        /* pretend that data are available */+        if (IS_VALID_LOC(s->active_loc)) {+            s->loc[s->active_loc].sts = STS_VALID | STS_DATA_AVAILABLE;+            s->loc[s->active_loc].state = STATE_COMPLETION;+            tis_raise_irq(s, s->active_loc, INT_DATA_AVAILABLE);+        }+        return -1;+    }++#ifdef DEBUG_TPM+    if (off > sizeof(buffer->instance ) + 6) {+        uint32_t size = tpm_get_size_from_buffer(buffer->buf);+        if (size + sizeof(buffer->instance) != off) {+            fprintf(logfile,"TPM: Packet size is bad! %d != %d\n",+                    (int)(size + sizeof(buffer->instance)),+                    off);+        } else {+            uint32_t ret;+            showBuff(buffer->buf, "From TPM");+            ret = (buffer->buf[8])*256 + buffer->buf[9];+            if (ret)+                fprintf(logfile,"Receive failed with error %d\n", ret);+            else+                fprintf(logfile,"Receive succeeded. Got response of length %d (=%d)\n",+                       size, off);+        }+    }+#endif++    /* assuming reading in one chunk for now */+    return off;+}+++/****************************************************************************+   Helper functions for reading data from the xenstore such as+   reading virtual TPM instance information+ ****************************************************************************/+int has_tpm_device(void)+{+    int ret = 0;+    struct xs_handle *handle = xs_daemon_open();+    if (handle) {+        ret = xenstore_domain_has_devtype(handle, "vtpm");+        xs_daemon_close(handle);+    }+    return ret;+}+++/*+ * Wait until hotplug scripts have finished then read the vTPM instance+ * number from the xenstore.+ */+static uint32_t vtpm_instance_from_xenstore(void)+{+    unsigned int num;+    uint32_t number = VTPM_BAD_INSTANCE;+    int end = 0;+    char *token = "tok";+    int subscribed = 0;+    int ctr = 0;+    fd_set readfds;++    struct xs_handle *handle = xs_daemon_open();++    FD_ZERO(&readfds);++    if (handle) {+        char **e = xenstore_domain_get_devices(handle, "vtpm", &num);+        int fd = xs_fileno(handle);+        FD_SET(fd, &readfds);+        if (e) {+            do {+                struct timeval tv = {+                    .tv_sec  = 30,+                    .tv_usec = 0,+                };+                /* need to make sure that the hotplug scripts have finished */+                char *status = xenstore_read_hotplug_status(handle,+                                                            "vtpm",+                                                            e[0]);+                if (status) {+                    if (!strcmp(status, "connected")) {+                        char *inst = xenstore_backend_read_variable(handle,+                                                                    "vtpm",+                                                                    e[0],+                                                                   "instance");+                        if (1 != (sscanf(inst,"%d",&number)))+                            number = VTPM_BAD_INSTANCE;+                        free(inst);+                    } else {+                        fprintf(logfile,+                                "bad status '%s' from vtpm hotplug\n",+                                status);+                    }+                    free(status);+                    end = 1;+                } else {+                    /* no status, yet */+                    int rc;+                    unsigned int nr;+                    char **f;++                    if (!subscribed) {+                        rc = xenstore_subscribe_to_hotplug_status(handle,+                                                                  "vtpm",+                                                                  e[0],+                                                                  token);+                        if (rc != 0)+                            break;+                        subscribed = 1;+                    }+                    rc = select(fd+1, &readfds, NULL, NULL, &tv);+                    /* get what's available -- drain the fd */+                    f = xs_read_watch(handle, &nr);+                    ctr++;+                    free(f);+                    if (ctr > 2)+                        end = 1;+                }+            } while (end == 0);+            free(e);+        }+        if (subscribed) {+            /* clean up */+            xenstore_unsubscribe_from_hotplug_status(handle,+                                                     "vtpm",+                                                     e[0],+                                                     token);+        }+        xs_daemon_close(handle);+    }+    if (number == VTPM_BAD_INSTANCE)+        fprintf(logfile, "no valid vtpm instance");+    else+        fprintf(logfile,"vtpm instance:%d\n",number);+    return number;+}Index: ioemu/vl.h===================================================================--- ioemu.orig/vl.h	2007-05-10 15:19:29.000000000 +0100+++ ioemu/vl.h	2007-05-10 15:19:29.000000000 +0100@@ -1086,6 +1086,10 @@ /* smbus_eeprom.c */ SMBusDevice *smbus_eeprom_device_init(uint8_t addr, uint8_t *buf); +/* tpm_tis.c */+int has_tpm_device(void);+void tpm_tis_init(SetIRQFunc *set_irq, void *irq_opaque, int irq);+ /* piix4acpi.c */ extern void pci_piix4_acpi_init(PCIBus *bus, int devfn); 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久先锋影音av鲁色资源网| 欧美日韩高清一区| 五月激情丁香一区二区三区| 国产精品久线在线观看| 久久久无码精品亚洲日韩按摩| 欧美精选一区二区| 在线亚洲人成电影网站色www| 成人免费视频播放| 高清国产午夜精品久久久久久| 六月丁香综合在线视频| 日韩电影一区二区三区| 亚洲一区二区在线观看视频 | 秋霞午夜鲁丝一区二区老狼| 尤物av一区二区| 国产精品国产三级国产普通话99| 国产午夜一区二区三区| 久久在线免费观看| 久久久99精品久久| 久久久三级国产网站| 久久精品免费在线观看| 久久精品亚洲一区二区三区浴池| 久久女同精品一区二区| 久久亚洲春色中文字幕久久久| 欧美大片一区二区| 精品国产青草久久久久福利| 久久久久久一级片| 欧美国产成人精品| 一区二区三区四区在线播放| 一区二区三区四区视频精品免费| 亚洲黄色免费电影| 亚洲成人免费av| 奇米色一区二区| 久久99久久99精品免视看婷婷| 精品一区二区国语对白| 国产精品自拍毛片| 高清beeg欧美| 色综合天天综合狠狠| 欧美性大战xxxxx久久久| 欧美乱熟臀69xxxxxx| 日韩欧美在线综合网| 久久婷婷成人综合色| 亚洲视频一区二区在线观看| 亚洲bt欧美bt精品| 久久国产精品72免费观看| 成人午夜视频免费看| 99re成人精品视频| 欧美日韩国产bt| 精品少妇一区二区三区| 国产精品午夜春色av| 亚洲一区二区三区三| 久久av资源站| 97久久精品人人爽人人爽蜜臀| 欧美日韩一级片在线观看| 欧美成人福利视频| 国产精品成人网| 亚洲成人av电影在线| 国产成人综合亚洲91猫咪| 欧洲精品一区二区三区在线观看| 精品久久久久久久久久久久久久久 | 日本成人在线电影网| 国模娜娜一区二区三区| 91婷婷韩国欧美一区二区| 欧美性高清videossexo| 国产欧美精品一区二区三区四区| 亚洲一区二区综合| 成人性生交大片免费看视频在线 | 99久久国产综合色|国产精品| 欧美美女一区二区| 国产精品久久久久久妇女6080| 午夜国产精品一区| 成人精品在线视频观看| 日韩三级精品电影久久久| 日韩毛片视频在线看| 久久se这里有精品| 欧美日韩一区在线| 亚洲精品综合在线| 国产91在线看| 欧美成人性战久久| 午夜视频一区在线观看| 一本一本大道香蕉久在线精品 | 欧美日产在线观看| 自拍偷拍亚洲综合| 国产精品一级二级三级| 日韩精品一区二区三区中文不卡| 亚洲卡通动漫在线| 91视频精品在这里| 国产精品久久久久久久久搜平片| 免费成人av资源网| 欧美精品自拍偷拍| 亚洲超碰97人人做人人爱| 91麻豆精品秘密| 亚洲欧洲美洲综合色网| 成人性生交大合| 欧美高清一级片在线观看| 国产呦萝稀缺另类资源| 日韩精品一区二| 久久精品国产成人一区二区三区| 欧美日韩成人在线一区| 亚洲一区视频在线观看视频| 色婷婷久久久久swag精品| 怡红院av一区二区三区| 色婷婷av久久久久久久| 亚洲精品国产无套在线观| 色婷婷一区二区| 亚洲一线二线三线视频| 欧美午夜精品久久久| 亚洲第一久久影院| 在线成人免费视频| 全国精品久久少妇| 日韩一本二本av| 国产在线精品一区在线观看麻豆| 久久一日本道色综合| 成人小视频免费观看| 亚洲日本欧美天堂| 欧美三区免费完整视频在线观看| 午夜视频在线观看一区二区三区 | 夜夜精品视频一区二区 | 成人动漫在线一区| 综合欧美一区二区三区| 欧洲激情一区二区| 美女性感视频久久| 国产亚洲一区二区在线观看| 99久久er热在这里只有精品15 | 91浏览器在线视频| 午夜a成v人精品| 精品久久人人做人人爰| 成人一区二区三区在线观看| 伊人婷婷欧美激情| 91麻豆精品91久久久久久清纯| 久久99热国产| 国产精品国产三级国产三级人妇 | 乱中年女人伦av一区二区| 久久久久99精品国产片| 色婷婷综合激情| 久久激五月天综合精品| 中文字幕亚洲欧美在线不卡| 欧美片在线播放| 成人一区二区三区中文字幕| 午夜成人在线视频| 中文av字幕一区| 在线不卡中文字幕| av一区二区久久| 日韩1区2区日韩1区2区| 国产精品久久久久影视| 777色狠狠一区二区三区| 国产a区久久久| 亚洲成人在线观看视频| 日本一区二区三区免费乱视频| 欧美婷婷六月丁香综合色| 国产精品性做久久久久久| 亚洲国产欧美在线| 国产日韩欧美一区二区三区乱码| 在线观看视频欧美| 国产成人精品1024| 理论电影国产精品| 亚洲国产中文字幕在线视频综合 | 欧美日韩精品欧美日韩精品一| 高清日韩电视剧大全免费| 日韩中文字幕一区二区三区| 国产精品久久久久久久久果冻传媒| 日韩天堂在线观看| 99re6这里只有精品视频在线观看| 九九热在线视频观看这里只有精品| 亚洲精品欧美综合四区| 欧美激情艳妇裸体舞| 日韩精品在线看片z| 欧美精品日韩综合在线| 91美女精品福利| 国产精品系列在线播放| 蜜臀91精品一区二区三区 | 91精品国产综合久久精品图片| 99精品国产99久久久久久白柏| 国内外成人在线视频| 奇米色一区二区三区四区| 亚洲午夜激情网页| 一区二区三区视频在线观看| 亚洲欧洲av色图| 中文字幕亚洲不卡| 欧美激情一区三区| 国产精品美女一区二区| 国产精品你懂的| 国产精品国产a级| 中文字幕欧美区| 国产精品色婷婷| 国产女同互慰高潮91漫画| 久久夜色精品国产噜噜av| 精品国产在天天线2019| 亚洲精品在线三区| 2023国产精华国产精品| 久久久美女毛片| 国产日韩亚洲欧美综合| 亚洲国产精华液网站w| 国产精品视频你懂的| 中文字幕在线不卡一区| 亚洲女与黑人做爰| 亚洲国产精品久久久久婷婷884 | 91极品视觉盛宴| 欧美三级欧美一级| 在线播放中文字幕一区| 综合在线观看色|