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

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

?? ppc4xx_devs.c

?? QEMU 0.91 source code, supports ARM processor including S3C24xx series
?? C
字號:
/* * QEMU PowerPC 4xx embedded processors shared devices emulation * * Copyright (c) 2007 Jocelyn Mayer * * 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 "ppc.h"#include "ppc4xx.h"#include "sysemu.h"extern int loglevel;extern FILE *logfile;//#define DEBUG_MMIO//#define DEBUG_UNASSIGNED#define DEBUG_UIC/*****************************************************************************//* Generic PowerPC 4xx processor instanciation */CPUState *ppc4xx_init (const unsigned char *cpu_model,                       clk_setup_t *cpu_clk, clk_setup_t *tb_clk,                       uint32_t sysclk){    CPUState *env;    /* init CPUs */    env = cpu_init(cpu_model);    if (!env) {        fprintf(stderr, "Unable to find PowerPC %s CPU definition\n",                cpu_model);        exit(1);    }    cpu_clk->cb = NULL; /* We don't care about CPU clock frequency changes */    cpu_clk->opaque = env;    /* Set time-base frequency to sysclk */    tb_clk->cb = ppc_emb_timers_init(env, sysclk);    tb_clk->opaque = env;    ppc_dcr_init(env, NULL, NULL);    /* Register qemu callbacks */    qemu_register_reset(&cpu_ppc_reset, env);    register_savevm("cpu", 0, 3, cpu_save, cpu_load, env);    return env;}/*****************************************************************************//* Fake device used to map multiple devices in a single memory page */#define MMIO_AREA_BITS 8#define MMIO_AREA_LEN (1 << MMIO_AREA_BITS)#define MMIO_AREA_NB (1 << (TARGET_PAGE_BITS - MMIO_AREA_BITS))#define MMIO_IDX(addr) (((addr) >> MMIO_AREA_BITS) & (MMIO_AREA_NB - 1))struct ppc4xx_mmio_t {    target_phys_addr_t base;    CPUReadMemoryFunc **mem_read[MMIO_AREA_NB];    CPUWriteMemoryFunc **mem_write[MMIO_AREA_NB];    void *opaque[MMIO_AREA_NB];};static uint32_t unassigned_mmio_readb (void *opaque, target_phys_addr_t addr){#ifdef DEBUG_UNASSIGNED    ppc4xx_mmio_t *mmio;    mmio = opaque;    printf("Unassigned mmio read 0x" PADDRX " base " PADDRX "\n",           addr, mmio->base);#endif    return 0;}static void unassigned_mmio_writeb (void *opaque,                                    target_phys_addr_t addr, uint32_t val){#ifdef DEBUG_UNASSIGNED    ppc4xx_mmio_t *mmio;    mmio = opaque;    printf("Unassigned mmio write 0x" PADDRX " = 0x%x base " PADDRX "\n",           addr, val, mmio->base);#endif}static CPUReadMemoryFunc *unassigned_mmio_read[3] = {    unassigned_mmio_readb,    unassigned_mmio_readb,    unassigned_mmio_readb,};static CPUWriteMemoryFunc *unassigned_mmio_write[3] = {    unassigned_mmio_writeb,    unassigned_mmio_writeb,    unassigned_mmio_writeb,};static uint32_t mmio_readlen (ppc4xx_mmio_t *mmio,                              target_phys_addr_t addr, int len){    CPUReadMemoryFunc **mem_read;    uint32_t ret;    int idx;    idx = MMIO_IDX(addr - mmio->base);#if defined(DEBUG_MMIO)    printf("%s: mmio %p len %d addr " PADDRX " idx %d\n", __func__,           mmio, len, addr, idx);#endif    mem_read = mmio->mem_read[idx];    ret = (*mem_read[len])(mmio->opaque[idx], addr - mmio->base);    return ret;}static void mmio_writelen (ppc4xx_mmio_t *mmio,                           target_phys_addr_t addr, uint32_t value, int len){    CPUWriteMemoryFunc **mem_write;    int idx;    idx = MMIO_IDX(addr - mmio->base);#if defined(DEBUG_MMIO)    printf("%s: mmio %p len %d addr " PADDRX " idx %d value %08" PRIx32 "\n",           __func__, mmio, len, addr, idx, value);#endif    mem_write = mmio->mem_write[idx];    (*mem_write[len])(mmio->opaque[idx], addr - mmio->base, value);}static uint32_t mmio_readb (void *opaque, target_phys_addr_t addr){#if defined(DEBUG_MMIO)    printf("%s: addr " PADDRX "\n", __func__, addr);#endif    return mmio_readlen(opaque, addr, 0);}static void mmio_writeb (void *opaque,                         target_phys_addr_t addr, uint32_t value){#if defined(DEBUG_MMIO)    printf("%s: addr " PADDRX " val %08" PRIx32 "\n", __func__, addr, value);#endif    mmio_writelen(opaque, addr, value, 0);}static uint32_t mmio_readw (void *opaque, target_phys_addr_t addr){#if defined(DEBUG_MMIO)    printf("%s: addr " PADDRX "\n", __func__, addr);#endif    return mmio_readlen(opaque, addr, 1);}static void mmio_writew (void *opaque,                         target_phys_addr_t addr, uint32_t value){#if defined(DEBUG_MMIO)    printf("%s: addr " PADDRX " val %08" PRIx32 "\n", __func__, addr, value);#endif    mmio_writelen(opaque, addr, value, 1);}static uint32_t mmio_readl (void *opaque, target_phys_addr_t addr){#if defined(DEBUG_MMIO)    printf("%s: addr " PADDRX "\n", __func__, addr);#endif    return mmio_readlen(opaque, addr, 2);}static void mmio_writel (void *opaque,                         target_phys_addr_t addr, uint32_t value){#if defined(DEBUG_MMIO)    printf("%s: addr " PADDRX " val %08" PRIx32 "\n", __func__, addr, value);#endif    mmio_writelen(opaque, addr, value, 2);}static CPUReadMemoryFunc *mmio_read[] = {    &mmio_readb,    &mmio_readw,    &mmio_readl,};static CPUWriteMemoryFunc *mmio_write[] = {    &mmio_writeb,    &mmio_writew,    &mmio_writel,};int ppc4xx_mmio_register (CPUState *env, ppc4xx_mmio_t *mmio,                          target_phys_addr_t offset, uint32_t len,                          CPUReadMemoryFunc **mem_read,                          CPUWriteMemoryFunc **mem_write, void *opaque){    target_phys_addr_t end;    int idx, eidx;    if ((offset + len) > TARGET_PAGE_SIZE)        return -1;    idx = MMIO_IDX(offset);    end = offset + len - 1;    eidx = MMIO_IDX(end);#if defined(DEBUG_MMIO)    printf("%s: offset " PADDRX " len %08" PRIx32 " " PADDRX " %d %d\n",           __func__, offset, len, end, idx, eidx);#endif    for (; idx <= eidx; idx++) {        mmio->mem_read[idx] = mem_read;        mmio->mem_write[idx] = mem_write;        mmio->opaque[idx] = opaque;    }    return 0;}ppc4xx_mmio_t *ppc4xx_mmio_init (CPUState *env, target_phys_addr_t base){    ppc4xx_mmio_t *mmio;    int mmio_memory;    mmio = qemu_mallocz(sizeof(ppc4xx_mmio_t));    if (mmio != NULL) {        mmio->base = base;        mmio_memory = cpu_register_io_memory(0, mmio_read, mmio_write, mmio);#if defined(DEBUG_MMIO)        printf("%s: base " PADDRX " len %08x %d\n", __func__,               base, TARGET_PAGE_SIZE, mmio_memory);#endif        cpu_register_physical_memory(base, TARGET_PAGE_SIZE, mmio_memory);        ppc4xx_mmio_register(env, mmio, 0, TARGET_PAGE_SIZE,                             unassigned_mmio_read, unassigned_mmio_write,                             mmio);    }    return mmio;}/*****************************************************************************//* "Universal" Interrupt controller */enum {    DCR_UICSR  = 0x000,    DCR_UICSRS = 0x001,    DCR_UICER  = 0x002,    DCR_UICCR  = 0x003,    DCR_UICPR  = 0x004,    DCR_UICTR  = 0x005,    DCR_UICMSR = 0x006,    DCR_UICVR  = 0x007,    DCR_UICVCR = 0x008,    DCR_UICMAX = 0x009,};#define UIC_MAX_IRQ 32typedef struct ppcuic_t ppcuic_t;struct ppcuic_t {    uint32_t dcr_base;    int use_vectors;    uint32_t uicsr;  /* Status register */    uint32_t uicer;  /* Enable register */    uint32_t uiccr;  /* Critical register */    uint32_t uicpr;  /* Polarity register */    uint32_t uictr;  /* Triggering register */    uint32_t uicvcr; /* Vector configuration register */    uint32_t uicvr;    qemu_irq *irqs;};static void ppcuic_trigger_irq (ppcuic_t *uic){    uint32_t ir, cr;    int start, end, inc, i;    /* Trigger interrupt if any is pending */    ir = uic->uicsr & uic->uicer & (~uic->uiccr);    cr = uic->uicsr & uic->uicer & uic->uiccr;#ifdef DEBUG_UIC    if (loglevel & CPU_LOG_INT) {        fprintf(logfile, "%s: uicsr %08" PRIx32 " uicer %08" PRIx32                " uiccr %08" PRIx32 "\n"                "   %08" PRIx32 " ir %08" PRIx32 " cr %08" PRIx32 "\n",                __func__, uic->uicsr, uic->uicer, uic->uiccr,                uic->uicsr & uic->uicer, ir, cr);    }#endif    if (ir != 0x0000000) {#ifdef DEBUG_UIC        if (loglevel & CPU_LOG_INT) {            fprintf(logfile, "Raise UIC interrupt\n");        }#endif        qemu_irq_raise(uic->irqs[PPCUIC_OUTPUT_INT]);    } else {#ifdef DEBUG_UIC        if (loglevel & CPU_LOG_INT) {            fprintf(logfile, "Lower UIC interrupt\n");        }#endif        qemu_irq_lower(uic->irqs[PPCUIC_OUTPUT_INT]);    }    /* Trigger critical interrupt if any is pending and update vector */    if (cr != 0x0000000) {        qemu_irq_raise(uic->irqs[PPCUIC_OUTPUT_CINT]);        if (uic->use_vectors) {            /* Compute critical IRQ vector */            if (uic->uicvcr & 1) {                start = 31;                end = 0;                inc = -1;            } else {                start = 0;                end = 31;                inc = 1;            }            uic->uicvr = uic->uicvcr & 0xFFFFFFFC;            for (i = start; i <= end; i += inc) {                if (cr & (1 << i)) {                    uic->uicvr += (i - start) * 512 * inc;                    break;                }            }        }#ifdef DEBUG_UIC        if (loglevel & CPU_LOG_INT) {            fprintf(logfile, "Raise UIC critical interrupt - "                    "vector %08" PRIx32 "\n", uic->uicvr);        }#endif    } else {#ifdef DEBUG_UIC        if (loglevel & CPU_LOG_INT) {            fprintf(logfile, "Lower UIC critical interrupt\n");        }#endif        qemu_irq_lower(uic->irqs[PPCUIC_OUTPUT_CINT]);        uic->uicvr = 0x00000000;    }}static void ppcuic_set_irq (void *opaque, int irq_num, int level){    ppcuic_t *uic;    uint32_t mask, sr;    uic = opaque;    mask = 1 << irq_num;#ifdef DEBUG_UIC    if (loglevel & CPU_LOG_INT) {        fprintf(logfile, "%s: irq %d level %d uicsr %08" PRIx32                " mask %08" PRIx32 " => %08" PRIx32 " %08" PRIx32 "\n",                __func__, irq_num, level,                uic->uicsr, mask, uic->uicsr & mask, level << irq_num);    }#endif    if (irq_num < 0 || irq_num > 31)        return;    sr = uic->uicsr;    if (!(uic->uicpr & mask)) {        /* Negatively asserted IRQ */        level = level == 0 ? 1 : 0;    }    /* Update status register */    if (uic->uictr & mask) {        /* Edge sensitive interrupt */        if (level == 1)            uic->uicsr |= mask;    } else {        /* Level sensitive interrupt */        if (level == 1)            uic->uicsr |= mask;        else            uic->uicsr &= ~mask;    }#ifdef DEBUG_UIC    if (loglevel & CPU_LOG_INT) {        fprintf(logfile, "%s: irq %d level %d sr %" PRIx32 " => "                "%08" PRIx32 "\n", __func__, irq_num, level, uic->uicsr, sr);    }#endif    if (sr != uic->uicsr)        ppcuic_trigger_irq(uic);}static target_ulong dcr_read_uic (void *opaque, int dcrn){    ppcuic_t *uic;    target_ulong ret;    uic = opaque;    dcrn -= uic->dcr_base;    switch (dcrn) {    case DCR_UICSR:    case DCR_UICSRS:        ret = uic->uicsr;        break;    case DCR_UICER:        ret = uic->uicer;        break;    case DCR_UICCR:        ret = uic->uiccr;        break;    case DCR_UICPR:        ret = uic->uicpr;        break;    case DCR_UICTR:        ret = uic->uictr;        break;    case DCR_UICMSR:        ret = uic->uicsr & uic->uicer;        break;    case DCR_UICVR:        if (!uic->use_vectors)            goto no_read;        ret = uic->uicvr;        break;    case DCR_UICVCR:        if (!uic->use_vectors)            goto no_read;        ret = uic->uicvcr;        break;    default:    no_read:        ret = 0x00000000;        break;    }    return ret;}static void dcr_write_uic (void *opaque, int dcrn, target_ulong val){    ppcuic_t *uic;    uic = opaque;    dcrn -= uic->dcr_base;#ifdef DEBUG_UIC    if (loglevel & CPU_LOG_INT) {        fprintf(logfile, "%s: dcr %d val " ADDRX "\n", __func__, dcrn, val);    }#endif    switch (dcrn) {    case DCR_UICSR:        uic->uicsr &= ~val;        ppcuic_trigger_irq(uic);        break;    case DCR_UICSRS:        uic->uicsr |= val;        ppcuic_trigger_irq(uic);        break;    case DCR_UICER:        uic->uicer = val;        ppcuic_trigger_irq(uic);        break;    case DCR_UICCR:        uic->uiccr = val;        ppcuic_trigger_irq(uic);        break;    case DCR_UICPR:        uic->uicpr = val;        ppcuic_trigger_irq(uic);        break;    case DCR_UICTR:        uic->uictr = val;        ppcuic_trigger_irq(uic);        break;    case DCR_UICMSR:        break;    case DCR_UICVR:        break;    case DCR_UICVCR:        uic->uicvcr = val & 0xFFFFFFFD;        ppcuic_trigger_irq(uic);        break;    }}static void ppcuic_reset (void *opaque){    ppcuic_t *uic;    uic = opaque;    uic->uiccr = 0x00000000;    uic->uicer = 0x00000000;    uic->uicpr = 0x00000000;    uic->uicsr = 0x00000000;    uic->uictr = 0x00000000;    if (uic->use_vectors) {        uic->uicvcr = 0x00000000;        uic->uicvr = 0x0000000;    }}qemu_irq *ppcuic_init (CPUState *env, qemu_irq *irqs,                       uint32_t dcr_base, int has_ssr, int has_vr){    ppcuic_t *uic;    int i;    uic = qemu_mallocz(sizeof(ppcuic_t));    if (uic != NULL) {        uic->dcr_base = dcr_base;        uic->irqs = irqs;        if (has_vr)            uic->use_vectors = 1;        for (i = 0; i < DCR_UICMAX; i++) {            ppc_dcr_register(env, dcr_base + i, uic,                             &dcr_read_uic, &dcr_write_uic);        }        qemu_register_reset(ppcuic_reset, uic);        ppcuic_reset(uic);    }    return qemu_allocate_irqs(&ppcuic_set_irq, uic, UIC_MAX_IRQ);}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91成人免费在线视频| 一区二区免费在线播放| 国产乱码精品一区二区三| 欧美成人精品福利| 国产主播一区二区| 国产婷婷色一区二区三区四区| 国产传媒一区在线| 亚洲视频一区二区免费在线观看| 色噜噜狠狠色综合中国| 午夜精品福利一区二区三区av | 9久草视频在线视频精品| 国产精品区一区二区三| 99re免费视频精品全部| 亚洲午夜一二三区视频| 欧美一区二区视频观看视频 | 亚洲欧美日韩精品久久久久| 欧美伊人久久大香线蕉综合69| 午夜久久久久久电影| 26uuu精品一区二区三区四区在线| 丁香啪啪综合成人亚洲小说| 亚洲综合成人在线| 日韩视频在线你懂得| 成人免费视频caoporn| 亚洲国产一区二区三区青草影视| 欧美精品一区二区三区视频| 色94色欧美sute亚洲13| 精品一区免费av| 亚洲久草在线视频| 精品欧美乱码久久久久久1区2区| 91在线观看视频| 麻豆91免费观看| 一区二区三区在线观看视频 | 欧美日韩久久不卡| 国产成人免费高清| 亚洲一区二区三区四区的| 日韩视频在线永久播放| 99久久精品国产导航| 久久国产人妖系列| 一区二区三区四区激情 | 国产精品免费久久| 在线电影国产精品| 色妞www精品视频| 韩国一区二区在线观看| 有坂深雪av一区二区精品| 精品999在线播放| 欧美日韩综合色| 99久久99久久精品免费观看 | 国产麻豆精品视频| 天天综合日日夜夜精品| 亚洲色图欧美在线| 久久综合色婷婷| 7777精品伊人久久久大香线蕉经典版下载 | 欧美日韩免费不卡视频一区二区三区| 国产一区二区三区免费观看| 午夜精品久久久久久久久久| 亚洲精品视频在线| 国产精品萝li| 久久网站最新地址| 日韩午夜av电影| 欧美亚洲日本国产| 99久久777色| 国产成人精品亚洲日本在线桃色 | 久久夜色精品国产噜噜av| 69堂国产成人免费视频| 在线视频一区二区三| 成人激情开心网| 国产精品一区二区三区网站| 久久成人免费电影| 麻豆视频一区二区| 日本在线播放一区二区三区| 韩国女主播一区二区三区| 亚洲高清三级视频| 亚洲一区二三区| 亚洲精品日韩一| 国产精品另类一区| 国产精品久久毛片av大全日韩| 久久久久亚洲综合| 国产日产亚洲精品系列| 国产欧美中文在线| 亚洲国产精品99久久久久久久久| 国产三级精品视频| 欧美国产97人人爽人人喊| 国产三级欧美三级日产三级99| 国产欧美日本一区视频| 国产精品视频一二三区| 国产精品麻豆视频| 亚洲精品国产一区二区精华液 | 国产精品夫妻自拍| 亚洲欧美日韩久久| 亚洲成人免费视| 日韩电影在线观看网站| 久久狠狠亚洲综合| 国产99一区视频免费| 91在线精品秘密一区二区| 在线观看av一区二区| 777色狠狠一区二区三区| 精品久久久三级丝袜| 国产视频视频一区| 一区二区三区不卡视频在线观看| 视频在线观看国产精品| 国产精品一区二区久久精品爱涩| 成人综合在线观看| 91福利精品第一导航| 日韩三区在线观看| 国产精品日产欧美久久久久| 亚洲电影你懂得| 国模大尺度一区二区三区| www.亚洲人| 3d动漫精品啪啪1区2区免费 | 奇米四色…亚洲| 国产麻豆9l精品三级站| 91麻豆123| 欧美一区二区在线视频| 国产日韩欧美电影| 一区二区三区美女| 精品在线免费观看| 99re亚洲国产精品| 91精品欧美综合在线观看最新| 久久久精品日韩欧美| 夜色激情一区二区| 国产美女娇喘av呻吟久久| 91国产精品成人| 久久久久久久久久电影| 亚洲一区国产视频| 国产成人av一区二区三区在线| 欧美自拍偷拍一区| 久久精品欧美一区二区三区不卡| 亚洲影视在线观看| 成人免费精品视频| 777精品伊人久久久久大香线蕉| 国产精品久久毛片av大全日韩| 日本aⅴ亚洲精品中文乱码| 99re这里都是精品| 久久新电视剧免费观看| 丝袜诱惑亚洲看片| 91香蕉视频黄| 国产欧美一区二区三区网站| 日本成人在线网站| 在线免费观看成人短视频| 国产清纯在线一区二区www| 日本在线不卡视频| 欧美日韩在线播放三区四区| 中文在线一区二区| 国产在线看一区| 91精品综合久久久久久| 亚洲影院在线观看| 一本大道久久a久久综合| 日本一区二区不卡视频| 激情国产一区二区| 欧美一区日本一区韩国一区| 亚洲综合一二三区| 91蜜桃网址入口| 国产精品美女久久久久久久| 国产伦精品一区二区三区免费 | 亚洲在线视频一区| caoporn国产精品| 日韩亚洲欧美综合| 男人的天堂久久精品| 欧美精品久久99| 午夜精品久久久久久| 欧美日韩在线播放三区四区| 一区二区激情视频| 欧美中文字幕一二三区视频| 亚洲最大的成人av| 欧美视频在线观看一区二区| 亚洲一区免费在线观看| 欧美日韩免费高清一区色橹橹 | 亚洲激情图片一区| 丁香五精品蜜臀久久久久99网站| 欧美精品一区二区三区蜜桃视频| 蜜桃视频一区二区三区在线观看| 777欧美精品| 久久国产精品第一页| 精品免费视频一区二区| 激情综合一区二区三区| 久久人人爽人人爽| 粉嫩一区二区三区在线看| 国产精品色婷婷| av高清不卡在线| 亚洲自拍偷拍av| 制服丝袜国产精品| 精品一区二区三区影院在线午夜 | 中文字幕在线观看不卡视频| 成人免费黄色在线| 中文字幕在线观看一区二区| 欧美在线观看18| 图片区日韩欧美亚洲| 欧美一区二区三区的| 国产精品18久久久久久久久久久久| 欧美激情综合五月色丁香小说| 成人高清免费观看| 亚洲综合免费观看高清完整版 | 久久婷婷久久一区二区三区| 国产精品99久| 亚洲视频一区二区在线观看| 91精品国产综合久久婷婷香蕉| 国产精品资源在线| 一区二区不卡在线播放 | 欧美午夜宅男影院| 亚洲一区在线视频|