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

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

?? helper.c

?? QEMU 0.91 source code, supports ARM processor including S3C24xx series
?? C
?? 第 1 頁 / 共 5 頁
字號:
target_ulong ppc_load_slb (CPUPPCState *env, int slb_nr){    target_phys_addr_t sr_base;    target_ulong rt;    uint64_t tmp64;    uint32_t tmp;    sr_base = env->spr[SPR_ASR];    sr_base += 12 * slb_nr;    tmp64 = ldq_phys(sr_base);    tmp = ldl_phys(sr_base + 8);    if (tmp64 & 0x0000000008000000ULL) {        /* SLB entry is valid */        /* Copy SLB bits 62:88 to Rt 37:63 (VSID 23:49) */        rt = tmp >> 8;             /* 65:88 => 40:63 */        rt |= (tmp64 & 0x7) << 24; /* 62:64 => 37:39 */        /* Copy SLB bits 89:92 to Rt 33:36 (KsKpNL) */        rt |= ((tmp >> 4) & 0xF) << 27;    } else {        rt = 0;    }#if defined(DEBUG_SLB)    if (loglevel != 0) {        fprintf(logfile, "%s: " PADDRX " %016" PRIx64 " %08" PRIx32 " => %d "                ADDRX "\n", __func__, sr_base, tmp64, tmp, slb_nr, rt);    }#endif    return rt;}void ppc_store_slb (CPUPPCState *env, int slb_nr, target_ulong rs){    target_phys_addr_t sr_base;    uint64_t tmp64;    uint32_t tmp;    sr_base = env->spr[SPR_ASR];    sr_base += 12 * slb_nr;    /* Copy Rs bits 37:63 to SLB 62:88 */    tmp = rs << 8;    tmp64 = (rs >> 24) & 0x7;    /* Copy Rs bits 33:36 to SLB 89:92 */    tmp |= ((rs >> 27) & 0xF) << 4;    /* Set the valid bit */    tmp64 |= 1 << 27;    /* Set ESID */    tmp64 |= (uint32_t)slb_nr << 28;#if defined(DEBUG_SLB)    if (loglevel != 0) {        fprintf(logfile, "%s: %d " ADDRX " => " PADDRX " %016" PRIx64                " %08" PRIx32 "\n", __func__,                slb_nr, rs, sr_base, tmp64, tmp);    }#endif    /* Write SLB entry to memory */    stq_phys(sr_base, tmp64);    stl_phys(sr_base + 8, tmp);}#endif /* defined(TARGET_PPC64) *//* Perform segment based translation */static always_inline target_phys_addr_t get_pgaddr (target_phys_addr_t sdr1,                                                    int sdr_sh,                                                    target_phys_addr_t hash,                                                    target_phys_addr_t mask){    return (sdr1 & ((target_phys_addr_t)(-1ULL) << sdr_sh)) | (hash & mask);}static always_inline int get_segment (CPUState *env, mmu_ctx_t *ctx,                                      target_ulong eaddr, int rw, int type){    target_phys_addr_t sdr, hash, mask, sdr_mask, htab_mask;    target_ulong sr, vsid, vsid_mask, pgidx, page_mask;#if defined(TARGET_PPC64)    int attr;#endif    int ds, vsid_sh, sdr_sh, pr;    int ret, ret2;    pr = msr_pr;#if defined(TARGET_PPC64)    if (env->mmu_model & POWERPC_MMU_64) {#if defined (DEBUG_MMU)        if (loglevel != 0) {            fprintf(logfile, "Check SLBs\n");        }#endif        ret = slb_lookup(env, eaddr, &vsid, &page_mask, &attr);        if (ret < 0)            return ret;        ctx->key = ((attr & 0x40) && (pr != 0)) ||            ((attr & 0x80) && (pr == 0)) ? 1 : 0;        ds = 0;        ctx->nx = attr & 0x20 ? 1 : 0;        vsid_mask = 0x00003FFFFFFFFF80ULL;        vsid_sh = 7;        sdr_sh = 18;        sdr_mask = 0x3FF80;    } else#endif /* defined(TARGET_PPC64) */    {        sr = env->sr[eaddr >> 28];        page_mask = 0x0FFFFFFF;        ctx->key = (((sr & 0x20000000) && (pr != 0)) ||                    ((sr & 0x40000000) && (pr == 0))) ? 1 : 0;        ds = sr & 0x80000000 ? 1 : 0;        ctx->nx = sr & 0x10000000 ? 1 : 0;        vsid = sr & 0x00FFFFFF;        vsid_mask = 0x01FFFFC0;        vsid_sh = 6;        sdr_sh = 16;        sdr_mask = 0xFFC0;#if defined (DEBUG_MMU)        if (loglevel != 0) {            fprintf(logfile, "Check segment v=" ADDRX " %d " ADDRX                    " nip=" ADDRX " lr=" ADDRX " ir=%d dr=%d pr=%d %d t=%d\n",                    eaddr, (int)(eaddr >> 28), sr, env->nip,                    env->lr, (int)msr_ir, (int)msr_dr, pr != 0 ? 1 : 0,                    rw, type);        }#endif    }#if defined (DEBUG_MMU)    if (loglevel != 0) {        fprintf(logfile, "pte segment: key=%d ds %d nx %d vsid " ADDRX "\n",                ctx->key, ds, ctx->nx, vsid);    }#endif    ret = -1;    if (!ds) {        /* Check if instruction fetch is allowed, if needed */        if (type != ACCESS_CODE || ctx->nx == 0) {            /* Page address translation */            /* Primary table address */            sdr = env->sdr1;            pgidx = (eaddr & page_mask) >> TARGET_PAGE_BITS;#if defined(TARGET_PPC64)            if (env->mmu_model & POWERPC_MMU_64) {                htab_mask = 0x0FFFFFFF >> (28 - (sdr & 0x1F));                /* XXX: this is false for 1 TB segments */                hash = ((vsid ^ pgidx) << vsid_sh) & vsid_mask;            } else#endif            {                htab_mask = sdr & 0x000001FF;                hash = ((vsid ^ pgidx) << vsid_sh) & vsid_mask;            }            mask = (htab_mask << sdr_sh) | sdr_mask;#if defined (DEBUG_MMU)            if (loglevel != 0) {                fprintf(logfile, "sdr " PADDRX " sh %d hash " PADDRX                        " mask " PADDRX " " ADDRX "\n",                        sdr, sdr_sh, hash, mask, page_mask);            }#endif            ctx->pg_addr[0] = get_pgaddr(sdr, sdr_sh, hash, mask);            /* Secondary table address */            hash = (~hash) & vsid_mask;#if defined (DEBUG_MMU)            if (loglevel != 0) {                fprintf(logfile, "sdr " PADDRX " sh %d hash " PADDRX                        " mask " PADDRX "\n",                        sdr, sdr_sh, hash, mask);            }#endif            ctx->pg_addr[1] = get_pgaddr(sdr, sdr_sh, hash, mask);#if defined(TARGET_PPC64)            if (env->mmu_model & POWERPC_MMU_64) {                /* Only 5 bits of the page index are used in the AVPN */                ctx->ptem = (vsid << 12) | ((pgidx >> 4) & 0x0F80);            } else#endif            {                ctx->ptem = (vsid << 7) | (pgidx >> 10);            }            /* Initialize real address with an invalid value */            ctx->raddr = (target_phys_addr_t)-1ULL;            if (unlikely(env->mmu_model == POWERPC_MMU_SOFT_6xx ||                         env->mmu_model == POWERPC_MMU_SOFT_74xx)) {                /* Software TLB search */                ret = ppc6xx_tlb_check(env, ctx, eaddr, rw, type);            } else {#if defined (DEBUG_MMU)                if (loglevel != 0) {                    fprintf(logfile, "0 sdr1=" PADDRX " vsid=" ADDRX " "                            "api=" ADDRX " hash=" PADDRX                            " pg_addr=" PADDRX "\n",                            sdr, vsid, pgidx, hash, ctx->pg_addr[0]);                }#endif                /* Primary table lookup */                ret = find_pte(env, ctx, 0, rw, type);                if (ret < 0) {                    /* Secondary table lookup */#if defined (DEBUG_MMU)                    if (eaddr != 0xEFFFFFFF && loglevel != 0) {                        fprintf(logfile, "1 sdr1=" PADDRX " vsid=" ADDRX " "                                "api=" ADDRX " hash=" PADDRX                                " pg_addr=" PADDRX "\n",                                sdr, vsid, pgidx, hash, ctx->pg_addr[1]);                    }#endif                    ret2 = find_pte(env, ctx, 1, rw, type);                    if (ret2 != -1)                        ret = ret2;                }            }#if defined (DUMP_PAGE_TABLES)            if (loglevel != 0) {                target_phys_addr_t curaddr;                uint32_t a0, a1, a2, a3;                fprintf(logfile, "Page table: " PADDRX " len " PADDRX "\n",                        sdr, mask + 0x80);                for (curaddr = sdr; curaddr < (sdr + mask + 0x80);                     curaddr += 16) {                    a0 = ldl_phys(curaddr);                    a1 = ldl_phys(curaddr + 4);                    a2 = ldl_phys(curaddr + 8);                    a3 = ldl_phys(curaddr + 12);                    if (a0 != 0 || a1 != 0 || a2 != 0 || a3 != 0) {                        fprintf(logfile, PADDRX ": %08x %08x %08x %08x\n",                                curaddr, a0, a1, a2, a3);                    }                }            }#endif        } else {#if defined (DEBUG_MMU)            if (loglevel != 0)                fprintf(logfile, "No access allowed\n");#endif            ret = -3;        }    } else {#if defined (DEBUG_MMU)        if (loglevel != 0)            fprintf(logfile, "direct store...\n");#endif        /* Direct-store segment : absolutely *BUGGY* for now */        switch (type) {        case ACCESS_INT:            /* Integer load/store : only access allowed */            break;        case ACCESS_CODE:            /* No code fetch is allowed in direct-store areas */            return -4;        case ACCESS_FLOAT:            /* Floating point load/store */            return -4;        case ACCESS_RES:            /* lwarx, ldarx or srwcx. */            return -4;        case ACCESS_CACHE:            /* dcba, dcbt, dcbtst, dcbf, dcbi, dcbst, dcbz, or icbi */            /* Should make the instruction do no-op.             * As it already do no-op, it's quite easy :-)             */            ctx->raddr = eaddr;            return 0;        case ACCESS_EXT:            /* eciwx or ecowx */            return -4;        default:            if (logfile) {                fprintf(logfile, "ERROR: instruction should not need "                        "address translation\n");            }            return -4;        }        if ((rw == 1 || ctx->key != 1) && (rw == 0 || ctx->key != 0)) {            ctx->raddr = eaddr;            ret = 2;        } else {            ret = -2;        }    }    return ret;}/* Generic TLB check function for embedded PowerPC implementations */static always_inline int ppcemb_tlb_check (CPUState *env, ppcemb_tlb_t *tlb,                                           target_phys_addr_t *raddrp,                                           target_ulong address,                                           uint32_t pid, int ext, int i){    target_ulong mask;    /* Check valid flag */    if (!(tlb->prot & PAGE_VALID)) {        if (loglevel != 0)            fprintf(logfile, "%s: TLB %d not valid\n", __func__, i);        return -1;    }    mask = ~(tlb->size - 1);#if defined (DEBUG_SOFTWARE_TLB)    if (loglevel != 0) {        fprintf(logfile, "%s: TLB %d address " ADDRX " PID %u <=> " ADDRX                " " ADDRX " %u\n",                __func__, i, address, pid, tlb->EPN, mask, (uint32_t)tlb->PID);    }#endif    /* Check PID */    if (tlb->PID != 0 && tlb->PID != pid)        return -1;    /* Check effective address */    if ((address & mask) != tlb->EPN)        return -1;    *raddrp = (tlb->RPN & mask) | (address & ~mask);#if (TARGET_PHYS_ADDR_BITS >= 36)    if (ext) {        /* Extend the physical address to 36 bits */        *raddrp |= (target_phys_addr_t)(tlb->RPN & 0xF) << 32;    }#endif    return 0;}/* Generic TLB search function for PowerPC embedded implementations */int ppcemb_tlb_search (CPUPPCState *env, target_ulong address, uint32_t pid){    ppcemb_tlb_t *tlb;    target_phys_addr_t raddr;    int i, ret;    /* Default return value is no match */    ret = -1;    for (i = 0; i < env->nb_tlb; i++) {        tlb = &env->tlb[i].tlbe;        if (ppcemb_tlb_check(env, tlb, &raddr, address, pid, 0, i) == 0) {            ret = i;            break;        }    }    return ret;}/* Helpers specific to PowerPC 40x implementations */static always_inline void ppc4xx_tlb_invalidate_all (CPUState *env){    ppcemb_tlb_t *tlb;    int i;    for (i = 0; i < env->nb_tlb; i++) {        tlb = &env->tlb[i].tlbe;        tlb->prot &= ~PAGE_VALID;    }    tlb_flush(env, 1);}static always_inline void ppc4xx_tlb_invalidate_virt (CPUState *env,                                                      target_ulong eaddr,                                                      uint32_t pid){#if !defined(FLUSH_ALL_TLBS)    ppcemb_tlb_t *tlb;    target_phys_addr_t raddr;    target_ulong page, end;    int i;    for (i = 0; i < env->nb_tlb; i++) {        tlb = &env->tlb[i].tlbe;        if (ppcemb_tlb_check(env, tlb, &raddr, eaddr, pid, 0, i) == 0) {            end = tlb->EPN + tlb->size;            for (page = tlb->EPN; page < end; page += TARGET_PAGE_SIZE)                tlb_flush_page(env, page);            tlb->prot &= ~PAGE_VALID;            break;        }    }#else    ppc4xx_tlb_invalidate_all(env);#endif}int mmu40x_get_physical_address (CPUState *env, mmu_ctx_t *ctx,                                 target_ulong address, int rw, int access_type){    ppcemb_tlb_t *tlb;    target_phys_addr_t raddr;    int i, ret, zsel, zpr, pr;    ret = -1;    raddr = (target_phys_addr_t)-1ULL;    pr = msr_pr;    for (i = 0; i < env->nb_tlb; i++) {        tlb = &env->tlb[i].tlbe;        if (ppcemb_tlb_check(env, tlb, &raddr, address,                             env->spr[SPR_40x_PID], 0, i) < 0)            continue;        zsel = (tlb->attr >> 4) & 0xF;        zpr = (env->spr[SPR_40x_ZPR] >> (28 - (2 * zsel))) & 0x3;#if defined (DEBUG_SOFTWARE_TLB)        if (loglevel != 0) {            fprintf(logfile, "%s: TLB %d zsel %d zpr %d rw %d attr %08x\n",                    __func__, i, zsel, zpr, rw, tlb->attr);        }#endif        /* Check execute enable bit */        switch (zpr) {        case 0x2:            if (pr != 0)                goto check_perms;            /* No break here */        case 0x3:            /* All accesses granted */            ctx->prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC;            ret = 0;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩欧美精品在线| 日韩经典一区二区| 日韩国产欧美一区二区三区| 国产精品亚洲综合一区在线观看| 99r精品视频| 国产亚洲欧美一级| 日本大胆欧美人术艺术动态| 一本到一区二区三区| 久久精品一区蜜桃臀影院| 免费在线观看一区二区三区| 色综合咪咪久久| 中文字幕av资源一区| 精彩视频一区二区三区| 91精品国产综合久久久蜜臀图片 | 午夜影院在线观看欧美| 国产成人综合在线| 欧美精品一区二区三区视频| 日韩不卡在线观看日韩不卡视频| 色综合久久中文综合久久97| 最近日韩中文字幕| 成人免费视频视频| 国产日韩三级在线| 狠狠色丁香久久婷婷综| 日韩欧美中文字幕公布| 午夜天堂影视香蕉久久| 欧美日本国产一区| 亚洲大片在线观看| 欧美日韩久久久| 亚洲成人动漫精品| 欧美色老头old∨ideo| 亚洲成人精品一区二区| 欧美日韩色一区| 日本网站在线观看一区二区三区| 欧美久久久久中文字幕| 日日夜夜免费精品视频| 日韩丝袜美女视频| 久久精品国产网站| 久久这里只有精品视频网| 国产一区二区三区最好精华液| 26uuu亚洲综合色欧美| 国产一区二区在线电影| 中文字幕巨乱亚洲| 日本精品一级二级| 亚洲18女电影在线观看| 欧美精品在线一区二区| 久久精品国产99| 久久久久九九视频| av电影一区二区| 亚洲一区二区三区在线播放| 欧美高清www午色夜在线视频| 美女精品自拍一二三四| 日本一区二区三区国色天香| 成人免费黄色在线| 亚洲高清免费视频| 日韩美女在线视频 | 精品一区精品二区高清| 中文字幕乱码亚洲精品一区 | 国产成人在线视频网站| 中文字幕制服丝袜一区二区三区| 在线欧美一区二区| 日韩av一区二区三区四区| 久久综合狠狠综合久久综合88| 国产99久久久久| 亚洲综合成人在线| 久久综合九色欧美综合狠狠| 波多野结衣中文字幕一区二区三区| 亚洲乱码国产乱码精品精可以看 | 中文字幕一区二区三区不卡 | 久久久精品tv| 欧美亚洲一区二区在线观看| 蜜桃精品在线观看| 亚洲靠逼com| 久久亚洲捆绑美女| 欧美日韩国产综合一区二区 | 另类小说欧美激情| 1000精品久久久久久久久| 91麻豆精品国产无毒不卡在线观看| 国产精品18久久久久久久网站| 亚洲狠狠丁香婷婷综合久久久| 日韩精品中文字幕在线一区| 91色porny| 国产在线日韩欧美| 亚洲va欧美va国产va天堂影院| 国产日韩亚洲欧美综合| 91精品国产综合久久久久久久久久 | 亚洲裸体xxx| 久久婷婷久久一区二区三区| 欧美男生操女生| 97se亚洲国产综合自在线| 麻豆一区二区三| 亚洲福利国产精品| 亚洲丝袜制服诱惑| 国产午夜亚洲精品午夜鲁丝片 | 五月综合激情网| 亚洲美女免费视频| 国产精品美女一区二区| 精品国产乱码久久久久久1区2区| 欧美性猛片xxxx免费看久爱| 99热国产精品| 丁香啪啪综合成人亚洲小说| 老司机免费视频一区二区三区| 午夜精品福利在线| 亚洲伊人色欲综合网| 亚洲美女屁股眼交3| 国产精品夫妻自拍| 久久精品视频在线看| 精品99一区二区| 精品区一区二区| 日韩片之四级片| 欧美电影免费观看高清完整版在| 91精品一区二区三区久久久久久| 欧美图片一区二区三区| 91成人免费电影| 色欧美片视频在线观看在线视频| www.激情成人| 91热门视频在线观看| 97久久超碰国产精品电影| 成人v精品蜜桃久久一区| 国产99久久久国产精品免费看| 国内成人免费视频| 精品一区二区三区不卡| 国产一区二区成人久久免费影院| 激情欧美日韩一区二区| 国产乱国产乱300精品| 国产精品18久久久久久久久 | 日韩一区欧美小说| 亚洲青青青在线视频| 亚洲激情欧美激情| 肉肉av福利一精品导航| 精品一区二区三区在线播放视频| 国产一区二区三区在线观看免费| 国产精品性做久久久久久| 国产99久久久国产精品潘金 | 91视频在线观看免费| 91福利在线免费观看| 欧美日韩国产成人在线免费| 日韩一区二区三区电影在线观看 | 亚洲综合在线视频| 五月天激情综合| 国模娜娜一区二区三区| 99视频热这里只有精品免费| 欧美日韩三级在线| 久久久www免费人成精品| 国产精品欧美极品| 亚洲bt欧美bt精品777| 国产中文字幕精品| 一本大道综合伊人精品热热| 欧美一区二区三区喷汁尤物| 中文字幕精品三区| 视频一区在线播放| 成人中文字幕合集| 精品视频一区二区三区免费| 亚洲精品一区二区三区蜜桃下载| 国产精品国产三级国产a| 亚洲成va人在线观看| 国产91富婆露脸刺激对白| 欧美日韩激情一区二区| 国产偷国产偷亚洲高清人白洁| 亚洲第一主播视频| 成人av资源在线观看| 91精品在线免费| 亚洲精品成人在线| 国产精品中文字幕日韩精品| 欧美色视频在线观看| 国产精品女同一区二区三区| 蜜臀av性久久久久蜜臀aⅴ流畅| 99视频一区二区| 国产视频亚洲色图| 日韩国产精品久久| 欧美影院一区二区三区| 国产亚洲精品资源在线26u| 亚洲成人av福利| 一本久久a久久免费精品不卡| 国产亚洲福利社区一区| 秋霞电影网一区二区| 在线精品视频免费播放| 国产精品二三区| 成人免费高清视频在线观看| 日韩一区二区精品在线观看| 亚洲一区二区精品视频| 95精品视频在线| 国产精品久久久久久久久免费桃花| 精品在线亚洲视频| 91精品国产欧美一区二区| 亚洲综合丝袜美腿| 99精品热视频| 国产精品久久精品日日| 国产黄色精品网站| 久久看人人爽人人| 国产真实乱子伦精品视频| 日韩精品一区在线观看| 日本美女一区二区三区| 欧美日韩国产首页| 亚洲成av人片一区二区梦乃| 欧美中文字幕久久| 亚洲国产日韩在线一区模特| 色嗨嗨av一区二区三区| 一个色综合av| 一本色道久久综合亚洲91| 亚洲精品国产精品乱码不99|