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

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

?? tpm-tis-device

?? xen 3.2.2 源碼
??
?? 第 1 頁 / 共 3 頁
字號:
+ */+static uint32_t tpm_data_read(tpmState *s, uint8_t locty)+{+    uint32_t ret, len;++    /* try to receive data, if none are there it is ok */+    tis_attempt_receive(s, locty);++    if (s->loc[locty].state != STATE_COMPLETION) {+        return 0xff;+    }++    len = tpm_get_size_from_buffer(s->buffer.buf);+    ret = s->buffer.buf[s->offset++];+    if (s->offset >= len) {+        s->loc[locty].sts = STS_VALID ;+        s->offset = 0;+    }+#ifdef DEBUG_TPM+    fprintf(logfile,"tpm_data_read byte x%02x   [%d]\n",ret,s->offset-1);+#endif+    return ret;+}++++/* raise an interrupt if allowed */+static void tis_raise_irq(tpmState *s, uint8_t locty, uint32_t irqmask)+{+    if (!s->irq_pending &&+        (s->loc[locty].inte & INT_ENABLED) &&+        (s->loc[locty].inte & irqmask)) {+        if ((irqmask & s->loc[locty].ints) == 0) {+#ifdef DEBUG_TPM+            fprintf(logfile,"Raising IRQ for flag %08x\n",irqmask);+#endif+            s->set_irq(s->irq_opaque, s->irq, 1);+            s->irq_pending = 1;+            s->loc[locty].ints |= irqmask;+        }+    }+}++/* abort execution of command */+static void tis_abort(tpmState *s)+{+    s->offset = 0;+    s->active_loc = s->next_locty;++    /*+     * Need to react differently depending on who's aborting now and+     * which locality will become active afterwards.+     */+    if (s->aborting_locty == s->next_locty) {+        s->loc[s->aborting_locty].state = STATE_READY;+        s->loc[s->aborting_locty].sts   = STS_COMMAND_READY;+        tis_raise_irq(s, s->aborting_locty, INT_COMMAND_READY);+    }++    /* locality after abort is another one than the current one */+    if (s->aborting_locty != s->next_locty && s->next_locty != NO_LOCALITY) {+        s->loc[s->aborting_locty].access &= ~ACCESS_ACTIVE_LOCALITY;+        s->loc[s->next_locty].access     |=  ACCESS_ACTIVE_LOCALITY;+        tis_raise_irq(s, s->next_locty, INT_LOCALITY_CHANGED);+    }++    s->aborting_locty = NO_LOCALITY; /* nobody's aborting a command anymore */++    qemu_del_timer(s->poll_timer);+}++/* abort current command */+static void tis_prep_abort(tpmState *s, uint8_t locty, uint8_t newlocty)+{+    s->aborting_locty = locty; /* current locality */+    s->next_locty = newlocty;  /* locality after successful abort */++    /*+     * only abort a command using an interrupt if currently executing+     * a command AND if there's a valid connection to the vTPM.+     */+    if (s->loc[locty].state == STATE_EXECUTION &&+        IS_COMM_WITH_VTPM(s)) {+        /* start timer and inside the timer wait for the result */+        s->poll_attempts = 0;+        tis_prep_next_interrupt(s);+    } else {+        tis_abort(s);+    }+}+++/*+ * Try to receive a response from the vTPM+ */+static void tis_attempt_receive(tpmState *s, uint8_t locty)+{+    /*+     * Attempt to read from the vTPM here if+     * - not aborting a command+     * - command has been sent and state is 'EXECUTION' now+     * - no data are already available (data have already been read)+     * - there's a communication path to the vTPM established+     */+    if (!IS_VALID_LOC(s->aborting_locty)) {+        if (s->loc[locty].state == STATE_EXECUTION) {+            if (0 == (s->loc[locty].sts & STS_DATA_AVAILABLE)){+                if (IS_COMM_WITH_VTPM(s)) {+                    int n = TPM_Receive(s, &s->buffer);+                    if (n > 0) {+                        s->loc[locty].sts = STS_VALID | STS_DATA_AVAILABLE;+                        s->loc[locty].state = STATE_COMPLETION;+                        close_vtpm_channel(s, FORCE_CLOSE);+                        tis_raise_irq(s, locty, INT_DATA_AVAILABLE);+                    }+                }+            }+        }+    }+}++/*+ * Read a register of the TIS interface+ * See specs pages 33-63 for description of the registers+ */+static uint32_t tis_mem_readl(void *opaque, target_phys_addr_t addr)+{+    tpmState *s = (tpmState *)opaque;+    uint16_t offset = addr & 0xffc;+    uint8_t shift = (addr & 0x3) * 8;+    uint32_t val = 0;+    uint8_t locty = locality_from_addr(addr);++    if (offset == TPM_REG_ACCESS) {+        if (s->active_loc == locty) {+            s->loc[locty].access |= (1 << 5);+         } else {+            s->loc[locty].access &= ~(1 << 5);+        }+        val = s->loc[locty].access;+    } else+    if (offset == TPM_REG_INT_ENABLE) {+        val = s->loc[locty].inte;+    } else+    if (offset == TPM_REG_INT_VECTOR) {+        val = s->irq;+    } else+    if (offset == TPM_REG_INT_STATUS) {+        tis_attempt_receive(s, locty);+        val = s->loc[locty].ints;+    } else+    if (offset == TPM_REG_INTF_CAPABILITY) {+        val = CAPABILITIES_SUPPORTED;+    } else+    if (offset == TPM_REG_STS) { /* status register */+        tis_attempt_receive(s, locty);+        val = (sizeof(s->buffer.buf) - s->offset) << 8 | s->loc[locty].sts;+    } else+    if (offset == TPM_REG_DATA_FIFO) {+      val = tpm_data_read(s, locty);+    } else+    if (offset == TPM_REG_DID_VID) {+        val = (TPM_DID << 16) | TPM_VID;+    } else+    if (offset == TPM_REG_RID) {+         val = TPM_RID;+    }++    if (shift)+        val >>= shift;++#ifdef DEBUG_TPM+    fprintf(logfile," read(%08x) = %08x\n",+            (int)addr,+            val);+#endif++    return val;+}++/*+ * Write a value to a register of the TIS interface+ * See specs pages 33-63 for description of the registers+ */+static void tis_mem_writel(void *opaque, target_phys_addr_t addr, uint32_t val)+{+    tpmState* s=(tpmState*)opaque;+    uint16_t off = addr & 0xfff;+    uint8_t locty = locality_from_addr(addr);+    int n, c;+    uint32_t len;++#ifdef DEBUG_TPM+    fprintf(logfile,"write(%08x) = %08x\n",+            (int)addr,+            val);+#endif++    if (off == TPM_REG_ACCESS) {+        if (val & ACCESS_ACTIVE_LOCALITY) {+            /* give up locality if currently owned */+            if (s->active_loc == locty) {+                uint8_t newlocty = NO_LOCALITY;+                s->loc[locty].access &= ~(ACCESS_PENDING_REQUEST);+                /* anybody wants the locality ? */+                for (c = NUM_LOCALITIES - 1; c >= 0; c--) {+                    if (s->loc[c].access & ACCESS_REQUEST_USE) {+                        s->loc[c].access |= ACCESS_TPM_REG_VALID_STS;+                        s->loc[c].access &= ~ACCESS_REQUEST_USE;+                        newlocty = c;+                        break;+                    }+                }+                tis_prep_abort(s, locty, newlocty);+            }+        }+        if (val & ACCESS_BEEN_SEIZED) {+            /* clear the flag */+            s->loc[locty].access &= ~ACCESS_BEEN_SEIZED;+        }+        if (val & ACCESS_SEIZE) {+            if (locty > s->active_loc && IS_VALID_LOC(s->active_loc)) {+                s->loc[s->active_loc].access |= ACCESS_BEEN_SEIZED;+                s->loc[locty].access = ACCESS_TPM_REG_VALID_STS;+                tis_prep_abort(s, s->active_loc, locty);+            }+        }+        if (val & ACCESS_REQUEST_USE) {+            if (IS_VALID_LOC(s->active_loc)) {+                /* locality election */+                s->loc[s->active_loc].access |= ACCESS_PENDING_REQUEST;+            } else {+                /* no locality active -> make this one active now */+                s->loc[locty].access |= ACCESS_ACTIVE_LOCALITY;+                s->active_loc = locty;+                tis_raise_irq(s, locty, INT_LOCALITY_CHANGED);+            }+        }+    } else+    if (off == TPM_REG_INT_ENABLE) {+        s->loc[locty].inte = (val & (INT_ENABLED | (0x3 << 3) |+                                     INTERRUPTS_SUPPORTED));+    } else+    if (off == TPM_REG_INT_STATUS) {+        /* clearing of interrupt flags */+        if ((val & INTERRUPTS_SUPPORTED) &&+            (s->loc[locty].ints & INTERRUPTS_SUPPORTED)) {+            s->set_irq(s->irq_opaque, s->irq, 0);+            s->irq_pending = 0;+        }+        s->loc[locty].ints &= ~(val & INTERRUPTS_SUPPORTED);+    } else+    if (off == TPM_REG_STS) {+        if (val & STS_COMMAND_READY) {+            if (s->loc[locty].state == STATE_IDLE) {+                s->loc[locty].sts   = STS_COMMAND_READY;+                s->loc[locty].state = STATE_READY;+                tis_raise_irq(s, locty, INT_COMMAND_READY);+            } else if (s->loc[locty].state == STATE_COMPLETION ||+                       s->loc[locty].state == STATE_EXECUTION  ||+                       s->loc[locty].state == STATE_RECEPTION) {+                /* abort currently running command */+                tis_prep_abort(s, locty, locty);+            }+        }+        if (val & STS_TPM_GO) {+            n = TPM_Send(s, &s->buffer, locty, "tpm_data_write");+            if (n > 0) {+                /* sending of data was successful */+                s->offset = 0;+                s->loc[locty].state = STATE_EXECUTION;+                if (s->loc[locty].inte & (INT_ENABLED | INT_DATA_AVAILABLE)) {+                    s->poll_attempts = 0;+                    tis_prep_next_interrupt(s);+                }+            }+        }+        if (val & STS_RESPONSE_RETRY) {+            s->offset = 0;+        }+    } else if (off == TPM_REG_DATA_FIFO) {+        /* data fifo */+        if (s->loc[locty].state == STATE_IDLE ||+            s->loc[locty].state == STATE_EXECUTION ||+            s->loc[locty].state == STATE_COMPLETION) {+            /* drop the byte */+        } else {+#ifdef TPM_DEBUG+        fprintf(logfile,"Byte to send to TPM: %02x\n", val);+#endif+            s->loc[locty].state = STATE_RECEPTION;++            if (s->offset < sizeof(s->buffer.buf))+                s->buffer.buf[s->offset++] = (uint8_t)val;++            if (s->offset > 5) {+                /* we have a packet length - see if we have all of it */+                len = tpm_get_size_from_buffer(s->buffer.buf);+                if (len > s->offset) {+                    s->loc[locty].sts = STS_EXPECT | STS_VALID;+                } else {+                    s->loc[locty].sts = STS_VALID;+                }+            }+        }+    }+}++/*+ * Prepare the next interrupt for example after a command has+ * been sent out for the purpose of receiving the response.+ * Depending on how many interrupts (used for polling on the fd) have+ * already been schedule, this function determines the delta in time+ * to the next interrupt. This accomodates for commands that finish+ * quickly.+ */+static void tis_prep_next_interrupt(tpmState *s)+{+    int64_t expiration;+    int rate = 5; /* 5 times per second */++    /*+       poll often at the beginning for quickly finished commands,+       then back off+     */+    if (s->poll_attempts < 5) {+        rate = 20;+    } else if (s->poll_attempts < 10) {+        rate = 10;+    }++    expiration = qemu_get_clock(vm_clock) + (ticks_per_sec / rate);+    qemu_mod_timer(s->poll_timer, expiration);+    s->poll_attempts++;+}+++/*+ * The polling routine called when the 'timer interrupt' fires.+ * Tries to receive a command from the vTPM.+ */+static void tis_poll_timer(void *opaque)+{+    tpmState* s=(tpmState*)opaque;+    uint8_t locty = s->active_loc;++    if (!IS_VALID_LOC(locty) ||+        (!(s->loc[locty].inte & INT_ENABLED) &&+          (s->aborting_locty != NO_LOCALITY)) ||+        !IS_COMM_WITH_VTPM(s)) {+        /* no more interrupts requested, so no more polling needed */+        qemu_del_timer(s->poll_timer);+    }++    if (!IS_COMM_WITH_VTPM(s)) {+        if (s->aborting_locty != NO_LOCALITY) {+            tis_abort(s);+        }+        return;+    }++    if (s->aborting_locty != NO_LOCALITY) {+        int n = TPM_Receive(s, &s->buffer);+#ifdef DEBUG_TPM+        fprintf(logfile,"Receiving for abort.\n");+#endif+        if (n > 0) {+            close_vtpm_channel(s, FORCE_CLOSE);+            tis_abort(s);+#ifdef DEBUG_TPM+            fprintf(logfile,"Abort is complete.\n");+#endif+        } else {+            tis_prep_next_interrupt(s);+        }+    } else if (IS_VALID_LOC(locty)) {+        if (s->loc[locty].state == STATE_EXECUTION) {+           /* poll for result */+            int n = TPM_Receive(s, &s->buffer);+            if (n > 0) {+                s->loc[locty].sts = STS_VALID | STS_DATA_AVAILABLE;+                s->loc[locty].state = STATE_COMPLETION;+                close_vtpm_channel(s, FORCE_CLOSE);+                tis_raise_irq(s, locty, INT_DATA_AVAILABLE);+            } else {+                /* nothing received */+                tis_prep_next_interrupt(s);+            }+        }+    }+}+++static CPUReadMemoryFunc *tis_readfn[3]={+    tis_mem_readl,+    tis_mem_readl,+    tis_mem_readl+};+

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美揉bbbbb揉bbbbb| 亚洲高清久久久| 国产女人aaa级久久久级| 中文字幕欧美三区| 日韩精品国产欧美| 丁香婷婷综合色啪| 91福利精品视频| 精品国产一区二区三区忘忧草 | 99精品桃花视频在线观看| 欧美日韩成人高清| 国产精品美女久久久久久久久久久 | 国产九色精品成人porny| 色婷婷综合久久| 亚洲国产成人一区二区三区| 成人av网在线| 欧美精品一区二区三区高清aⅴ | 韩国精品一区二区| 欧美最猛性xxxxx直播| 亚洲欧洲性图库| 国产福利一区在线| 日韩欧美亚洲另类制服综合在线| 自拍偷自拍亚洲精品播放| 狠狠v欧美v日韩v亚洲ⅴ| 久久久精品欧美丰满| 久久99精品国产麻豆不卡| 在线不卡a资源高清| 亚洲电影在线播放| 成人免费三级在线| 国产丝袜美腿一区二区三区| 久久成人羞羞网站| 欧美精品在线一区二区三区| 精品一区二区免费看| 亚洲欧洲精品成人久久奇米网| 欧美日韩国产区一| 高清不卡一区二区| 天堂一区二区在线免费观看| 国产欧美视频在线观看| 在线日韩一区二区| 国产一区欧美二区| 久久久久国色av免费看影院| 欧美性一二三区| 亚洲123区在线观看| 国产欧美日本一区视频| 在线电影欧美成精品| 成人av午夜电影| 蜜臂av日日欢夜夜爽一区| 日韩欧美国产精品一区| 91网站在线观看视频| 亚洲美女区一区| 色香蕉久久蜜桃| 国产精品99久久久久久久女警| 亚洲国产精品一区二区久久| 国产精品传媒视频| 欧美亚一区二区| 波多野洁衣一区| 亚洲成人tv网| 最新久久zyz资源站| 精品国产免费视频| 91麻豆精品国产自产在线| 蜜桃精品视频在线| 图片区小说区国产精品视频| 欧美成人精品福利| 成人综合婷婷国产精品久久免费| 日本在线播放一区二区三区| 国产三级精品在线| 精品国产电影一区二区| 欧美福利视频一区| 欧美性猛交一区二区三区精品| 99免费精品视频| 成人免费视频一区| 粉嫩欧美一区二区三区高清影视 | 国产精品自拍一区| 九九在线精品视频| 蜜臀av在线播放一区二区三区| 亚洲成人动漫精品| 日产欧产美韩系列久久99| 亚洲第一会所有码转帖| 亚洲一区二区av电影| 欧美精品一区二区在线观看| 日韩亚洲电影在线| 91在线视频播放地址| 成人黄色综合网站| 处破女av一区二区| 91在线观看成人| 91久久精品一区二区三| 在线亚洲免费视频| 欧美色网站导航| 7777精品伊人久久久大香线蕉| 欧美高清视频不卡网| 日韩一区二区三区在线观看| 欧美成人在线直播| 国产亚洲人成网站| 国产精品狼人久久影院观看方式| 国产精品午夜在线观看| 亚洲欧洲性图库| 亚洲一区二区影院| 免费人成在线不卡| 亚洲成人在线观看视频| 日韩精品一区第一页| 久久er精品视频| 蜜桃一区二区三区在线| 国产aⅴ精品一区二区三区色成熟| 成人av动漫网站| 欧美亚洲日本国产| 日韩女优av电影| 亚洲国产精华液网站w| 亚洲精品老司机| 国产精品久久综合| 亚洲综合无码一区二区| 久久99精品久久只有精品| 成人免费va视频| 日韩欧美一级在线播放| 国产午夜三级一区二区三| 一区二区三区日韩精品| 中文字幕中文字幕中文字幕亚洲无线| 亚洲精品视频在线看| 日本特黄久久久高潮| 成人网页在线观看| 欧美日韩视频在线第一区 | 婷婷六月综合网| 国产一区二区三区免费在线观看| 成人av电影在线观看| 日韩网站在线看片你懂的| 亚洲欧洲精品一区二区三区| 麻豆久久久久久久| 日本二三区不卡| 久久一区二区三区四区| 久久综合成人精品亚洲另类欧美 | 亚洲a一区二区| 丁香亚洲综合激情啪啪综合| 精品视频在线免费观看| 国产色综合久久| 日韩成人免费在线| 91美女福利视频| 国产欧美日韩激情| 老司机午夜精品| 欧美偷拍一区二区| 国产精品久久毛片a| 精品在线视频一区| 欧美精品123区| 伊人夜夜躁av伊人久久| 丰满放荡岳乱妇91ww| 日韩三级电影网址| 有坂深雪av一区二区精品| 福利一区福利二区| 日韩欧美激情在线| 婷婷一区二区三区| 欧美色窝79yyyycom| 亚洲欧美另类图片小说| 91精品国产乱| 日韩精品一区二区三区三区免费| 亚洲视频图片小说| 99久久精品国产精品久久| 精品国产91九色蝌蚪| 性感美女久久精品| 欧美在线免费播放| 亚洲人成电影网站色mp4| 国产成人8x视频一区二区| 精品福利一二区| 蜜臀av亚洲一区中文字幕| 欧美日韩精品一区二区| 一区二区三区日韩精品视频| 在线免费一区三区| 亚洲女人****多毛耸耸8| 99久久婷婷国产综合精品电影| 国产欧美日韩精品在线| 国产精品18久久久久久久久久久久| 欧美电影免费观看完整版| 美国毛片一区二区| 欧美电影免费观看高清完整版在 | 美脚の诱脚舐め脚责91| 欧美一级免费大片| 毛片av中文字幕一区二区| 日韩欧美的一区| 国产在线日韩欧美| 国产三级精品三级在线专区| 大胆欧美人体老妇| 亚洲日本韩国一区| 欧美丝袜丝交足nylons图片| 亚洲图片欧美一区| 制服丝袜成人动漫| 麻豆精品视频在线观看免费| 一卡二卡欧美日韩| 欧美中文字幕一二三区视频| 一区二区成人在线观看| 这里只有精品视频在线观看| 久久精品免费观看| 国产日韩欧美高清在线| www.在线成人| 亚洲成人资源在线| 精品久久五月天| 丁香婷婷综合激情五月色| 尤物在线观看一区| 欧美一卡在线观看| 国产成人欧美日韩在线电影| 亚洲精品国产精品乱码不99| 91麻豆精品国产91久久久久久久久 | 中文字幕免费不卡在线| 91久久精品日日躁夜夜躁欧美| 五月天一区二区三区|