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

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

?? arm_gic.c

?? QEMU 0.91 source code, supports ARM processor including S3C24xx series
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* * ARM Generic/Distributed Interrupt Controller * * Copyright (c) 2006-2007 CodeSourcery. * Written by Paul Brook * * This code is licenced under the GPL. *//* This file contains implementation code for the RealView EB interrupt   controller, MPCore distributed interrupt controller and ARMv7-M   Nested Vectored Interrupt Controller.  *///#define DEBUG_GIC#ifdef DEBUG_GIC#define DPRINTF(fmt, args...) \do { printf("arm_gic: " fmt , ##args); } while (0)#else#define DPRINTF(fmt, args...) do {} while(0)#endif#ifdef NVICstatic const uint8_t gic_id[] ={ 0x00, 0xb0, 0x1b, 0x00, 0x0d, 0xe0, 0x05, 0xb1 };#define GIC_DIST_OFFSET 0/* The NVIC has 16 internal vectors.  However these are not exposed   through the normal GIC interface.  */#define GIC_BASE_IRQ    32#elsestatic const uint8_t gic_id[] ={ 0x90, 0x13, 0x04, 0x00, 0x0d, 0xf0, 0x05, 0xb1 };#define GIC_DIST_OFFSET 0x1000#define GIC_BASE_IRQ    0#endiftypedef struct gic_irq_state{    /* ??? The documentation seems to imply the enable bits are global, even       for per-cpu interrupts.  This seems strange.  */    unsigned enabled:1;    unsigned pending:NCPU;    unsigned active:NCPU;    unsigned level:1;    unsigned model:1; /* 0 = N:N, 1 = 1:N */    unsigned trigger:1; /* nonzero = edge triggered.  */} gic_irq_state;#define ALL_CPU_MASK ((1 << NCPU) - 1)#define GIC_SET_ENABLED(irq) s->irq_state[irq].enabled = 1#define GIC_CLEAR_ENABLED(irq) s->irq_state[irq].enabled = 0#define GIC_TEST_ENABLED(irq) s->irq_state[irq].enabled#define GIC_SET_PENDING(irq, cm) s->irq_state[irq].pending |= (cm)#define GIC_CLEAR_PENDING(irq, cm) s->irq_state[irq].pending &= ~(cm)#define GIC_TEST_PENDING(irq, cm) ((s->irq_state[irq].pending & (cm)) != 0)#define GIC_SET_ACTIVE(irq, cm) s->irq_state[irq].active |= (cm)#define GIC_CLEAR_ACTIVE(irq, cm) s->irq_state[irq].active &= ~(cm)#define GIC_TEST_ACTIVE(irq, cm) ((s->irq_state[irq].active & (cm)) != 0)#define GIC_SET_MODEL(irq) s->irq_state[irq].model = 1#define GIC_CLEAR_MODEL(irq) s->irq_state[irq].model = 0#define GIC_TEST_MODEL(irq) s->irq_state[irq].model#define GIC_SET_LEVEL(irq, cm) s->irq_state[irq].level = (cm)#define GIC_CLEAR_LEVEL(irq, cm) s->irq_state[irq].level &= ~(cm)#define GIC_TEST_LEVEL(irq, cm) (s->irq_state[irq].level & (cm)) != 0#define GIC_SET_TRIGGER(irq) s->irq_state[irq].trigger = 1#define GIC_CLEAR_TRIGGER(irq) s->irq_state[irq].trigger = 0#define GIC_TEST_TRIGGER(irq) s->irq_state[irq].trigger#define GIC_GET_PRIORITY(irq, cpu) \  (((irq) < 32) ? s->priority1[irq][cpu] : s->priority2[(irq) - 32])#ifdef NVIC#define GIC_TARGET(irq) 1#else#define GIC_TARGET(irq) s->irq_target[irq]#endiftypedef struct gic_state{    uint32_t base;    qemu_irq parent_irq[NCPU];    int enabled;    int cpu_enabled[NCPU];    gic_irq_state irq_state[GIC_NIRQ];#ifndef NVIC    int irq_target[GIC_NIRQ];#endif    int priority1[32][NCPU];    int priority2[GIC_NIRQ - 32];    int last_active[GIC_NIRQ][NCPU];    int priority_mask[NCPU];    int running_irq[NCPU];    int running_priority[NCPU];    int current_pending[NCPU];    qemu_irq *in;#ifdef NVIC    void *nvic;#endif} gic_state;/* TODO: Many places that call this routine could be optimized.  *//* Update interrupt status after enabled or pending bits have been changed.  */static void gic_update(gic_state *s){    int best_irq;    int best_prio;    int irq;    int level;    int cpu;    int cm;    for (cpu = 0; cpu < NCPU; cpu++) {        cm = 1 << cpu;        s->current_pending[cpu] = 1023;        if (!s->enabled || !s->cpu_enabled[cpu]) {	    qemu_irq_lower(s->parent_irq[cpu]);            return;        }        best_prio = 0x100;        best_irq = 1023;        for (irq = 0; irq < GIC_NIRQ; irq++) {            if (GIC_TEST_ENABLED(irq) && GIC_TEST_PENDING(irq, cm)) {                if (GIC_GET_PRIORITY(irq, cpu) < best_prio) {                    best_prio = GIC_GET_PRIORITY(irq, cpu);                    best_irq = irq;                }            }        }        level = 0;        if (best_prio <= s->priority_mask[cpu]) {            s->current_pending[cpu] = best_irq;            if (best_prio < s->running_priority[cpu]) {                DPRINTF("Raised pending IRQ %d\n", best_irq);                level = 1;            }        }        qemu_set_irq(s->parent_irq[cpu], level);    }}static void __attribute__((unused))gic_set_pending_private(gic_state *s, int cpu, int irq){    int cm = 1 << cpu;    if (GIC_TEST_PENDING(irq, cm))        return;    DPRINTF("Set %d pending cpu %d\n", irq, cpu);    GIC_SET_PENDING(irq, cm);    gic_update(s);}/* Process a change in an external IRQ input.  */static void gic_set_irq(void *opaque, int irq, int level){    gic_state *s = (gic_state *)opaque;    /* The first external input line is internal interrupt 32.  */    irq += 32;    if (level == GIC_TEST_LEVEL(irq, ALL_CPU_MASK))        return;    if (level) {        GIC_SET_LEVEL(irq, ALL_CPU_MASK);        if (GIC_TEST_TRIGGER(irq) || GIC_TEST_ENABLED(irq)) {            DPRINTF("Set %d pending mask %x\n", irq, GIC_TARGET(irq));            GIC_SET_PENDING(irq, GIC_TARGET(irq));        }    } else {        GIC_CLEAR_LEVEL(irq, ALL_CPU_MASK);    }    gic_update(s);}static void gic_set_running_irq(gic_state *s, int cpu, int irq){    s->running_irq[cpu] = irq;    if (irq == 1023) {        s->running_priority[cpu] = 0x100;    } else {        s->running_priority[cpu] = GIC_GET_PRIORITY(irq, cpu);    }    gic_update(s);}static uint32_t gic_acknowledge_irq(gic_state *s, int cpu){    int new_irq;    int cm = 1 << cpu;    new_irq = s->current_pending[cpu];    if (new_irq == 1023            || GIC_GET_PRIORITY(new_irq, cpu) >= s->running_priority[cpu]) {        DPRINTF("ACK no pending IRQ\n");        return 1023;    }    s->last_active[new_irq][cpu] = s->running_irq[cpu];    /* Clear pending flags for both level and edge triggered interrupts.       Level triggered IRQs will be reasserted once they become inactive.  */    GIC_CLEAR_PENDING(new_irq, GIC_TEST_MODEL(new_irq) ? ALL_CPU_MASK : cm);    gic_set_running_irq(s, cpu, new_irq);    DPRINTF("ACK %d\n", new_irq);    return new_irq;}static void gic_complete_irq(gic_state * s, int cpu, int irq){    int update = 0;    int cm = 1 << cpu;    DPRINTF("EOI %d\n", irq);    if (s->running_irq[cpu] == 1023)        return; /* No active IRQ.  */    if (irq != 1023) {        /* Mark level triggered interrupts as pending if they are still           raised.  */        if (!GIC_TEST_TRIGGER(irq) && GIC_TEST_ENABLED(irq)                && GIC_TEST_LEVEL(irq, cm) && (GIC_TARGET(irq) & cm) != 0) {            DPRINTF("Set %d pending mask %x\n", irq, cm);            GIC_SET_PENDING(irq, cm);            update = 1;        }    }    if (irq != s->running_irq[cpu]) {        /* Complete an IRQ that is not currently running.  */        int tmp = s->running_irq[cpu];        while (s->last_active[tmp][cpu] != 1023) {            if (s->last_active[tmp][cpu] == irq) {                s->last_active[tmp][cpu] = s->last_active[irq][cpu];                break;            }            tmp = s->last_active[tmp][cpu];        }        if (update) {            gic_update(s);        }    } else {        /* Complete the current running IRQ.  */        gic_set_running_irq(s, cpu, s->last_active[s->running_irq[cpu]][cpu]);    }}static uint32_t gic_dist_readb(void *opaque, target_phys_addr_t offset){    gic_state *s = (gic_state *)opaque;    uint32_t res;    int irq;    int i;    int cpu;    int cm;    int mask;    cpu = gic_get_current_cpu();    cm = 1 << cpu;    offset -= s->base + GIC_DIST_OFFSET;    if (offset < 0x100) {#ifndef NVIC        if (offset == 0)            return s->enabled;        if (offset == 4)            return ((GIC_NIRQ / 32) - 1) | ((NCPU - 1) << 5);        if (offset < 0x08)            return 0;#endif        goto bad_reg;    } else if (offset < 0x200) {        /* Interrupt Set/Clear Enable.  */        if (offset < 0x180)            irq = (offset - 0x100) * 8;        else            irq = (offset - 0x180) * 8;        irq += GIC_BASE_IRQ;        if (irq >= GIC_NIRQ)            goto bad_reg;        res = 0;        for (i = 0; i < 8; i++) {            if (GIC_TEST_ENABLED(irq + i)) {                res |= (1 << i);            }        }    } else if (offset < 0x300) {        /* Interrupt Set/Clear Pending.  */        if (offset < 0x280)            irq = (offset - 0x200) * 8;        else            irq = (offset - 0x280) * 8;        irq += GIC_BASE_IRQ;        if (irq >= GIC_NIRQ)            goto bad_reg;        res = 0;        mask = (irq < 32) ?  cm : ALL_CPU_MASK;        for (i = 0; i < 8; i++) {            if (GIC_TEST_PENDING(irq + i, mask)) {                res |= (1 << i);            }        }    } else if (offset < 0x400) {        /* Interrupt Active.  */        irq = (offset - 0x300) * 8 + GIC_BASE_IRQ;        if (irq >= GIC_NIRQ)            goto bad_reg;        res = 0;        mask = (irq < 32) ?  cm : ALL_CPU_MASK;        for (i = 0; i < 8; i++) {            if (GIC_TEST_ACTIVE(irq + i, mask)) {                res |= (1 << i);            }        }    } else if (offset < 0x800) {        /* Interrupt Priority.  */        irq = (offset - 0x400) + GIC_BASE_IRQ;        if (irq >= GIC_NIRQ)            goto bad_reg;        res = GIC_GET_PRIORITY(irq, cpu);#ifndef NVIC    } else if (offset < 0xc00) {        /* Interrupt CPU Target.  */        irq = (offset - 0x800) + GIC_BASE_IRQ;        if (irq >= GIC_NIRQ)            goto bad_reg;        if (irq >= 29 && irq <= 31) {            res = cm;        } else {            res = GIC_TARGET(irq);        }    } else if (offset < 0xf00) {        /* Interrupt Configuration.  */        irq = (offset - 0xc00) * 2 + GIC_BASE_IRQ;        if (irq >= GIC_NIRQ)            goto bad_reg;        res = 0;        for (i = 0; i < 4; i++) {            if (GIC_TEST_MODEL(irq + i))                res |= (1 << (i * 2));            if (GIC_TEST_TRIGGER(irq + i))                res |= (2 << (i * 2));        }

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
9l国产精品久久久久麻豆| 日本一区二区三区四区| 国产婷婷色一区二区三区四区| 亚洲欧美精品午睡沙发| 老司机精品视频线观看86| 99国产精品一区| 久久久久久9999| 日韩成人精品在线观看| 色噜噜狠狠色综合欧洲selulu| 欧美精品一区二区不卡| 亚洲成人动漫在线免费观看| 波多野结衣中文字幕一区二区三区| 日韩欧美亚洲另类制服综合在线 | 日本一区二区三区视频视频| 日韩精品午夜视频| 欧美日韩中文另类| 亚洲精品高清在线| 99国产精品久久久久| 国产肉丝袜一区二区| 国产一区二区三区不卡在线观看| 91精品国产乱| 日本最新不卡在线| 91麻豆精品91久久久久久清纯| 亚洲一区二区在线免费看| 97se亚洲国产综合自在线| 国产精品久久久久永久免费观看| 国产东北露脸精品视频| 久久综合av免费| 国产精品一区二区在线看| 久久夜色精品一区| 国产精品一区二区黑丝| 久久精品视频网| 国产99久久久国产精品潘金网站| 欧美国产日韩亚洲一区| 国产成人免费在线视频| 国产精品午夜免费| 91网站黄www| 亚洲激情六月丁香| 欧美日本一区二区在线观看| 午夜亚洲福利老司机| 欧美一区欧美二区| 国产一区视频在线看| 国产欧美一二三区| 色综合视频在线观看| 亚洲国产精品人人做人人爽| 3751色影院一区二区三区| 另类专区欧美蜜桃臀第一页| 久久久99免费| 99re热这里只有精品视频| 亚洲综合激情网| 欧美一区午夜视频在线观看| 国产精品99久久久久久久女警| 国产精品免费aⅴ片在线观看| 一本一道久久a久久精品| 婷婷六月综合网| 久久久久国产精品人| 91丨九色丨蝌蚪富婆spa| 亚洲成人av一区二区三区| 欧美mv和日韩mv国产网站| 懂色av一区二区在线播放| 一区二区三区四区激情 | 99国内精品久久| 亚洲成人免费影院| 久久亚洲捆绑美女| 一本到不卡免费一区二区| 麻豆精品久久久| 亚洲欧洲av在线| 日韩精品一区二区三区三区免费 | 成人精品鲁一区一区二区| 亚洲精品国产第一综合99久久| 日韩视频一区二区| 成人av先锋影音| 免费人成在线不卡| 国产精品久久久久久久午夜片| 8x8x8国产精品| 91蜜桃在线免费视频| 精品亚洲欧美一区| 亚洲一区二区欧美日韩| 国产三级欧美三级| 欧美一级黄色片| 色噜噜狠狠成人网p站| 国产资源在线一区| 亚洲123区在线观看| 国产精品国产三级国产普通话蜜臀| 欧美精品三级日韩久久| eeuss国产一区二区三区| 久久精品国产99国产| 一区二区三区**美女毛片| 国产免费久久精品| 欧美一级理论片| 欧美日韩国产高清一区二区| 91麻豆.com| 成人av影院在线| 国产不卡视频在线播放| 老司机午夜精品| 麻豆91精品91久久久的内涵| 亚洲v日本v欧美v久久精品| 亚洲人成人一区二区在线观看 | 日韩国产欧美在线播放| 综合亚洲深深色噜噜狠狠网站| 亚洲精品在线电影| 日韩视频在线你懂得| 欧美精品 国产精品| 在线观看国产日韩| 色94色欧美sute亚洲线路一久| 成人久久视频在线观看| 粗大黑人巨茎大战欧美成人| 国产精品资源在线| 国产成人一级电影| 风间由美性色一区二区三区| 国产成人在线免费| 国产成人啪午夜精品网站男同| 国产黑丝在线一区二区三区| 国产成人综合视频| 成人一级黄色片| av午夜一区麻豆| 91猫先生在线| 欧美在线三级电影| 欧美日韩亚洲综合一区二区三区 | 亚洲国产一区二区a毛片| 一区二区免费在线| 偷拍日韩校园综合在线| 午夜精品久久久久久| 日韩va亚洲va欧美va久久| 麻豆视频一区二区| 国产一区二区三区在线观看精品 | 亚洲国产日韩a在线播放| 亚洲.国产.中文慕字在线| 日韩av电影天堂| 九九精品一区二区| 成人av在线影院| 精品视频色一区| 精品久久久网站| 欧美韩国日本综合| 一区二区不卡在线播放| 日韩av电影天堂| 国产福利一区二区三区视频 | 91精品一区二区三区在线观看| 欧美一区二区二区| 国产性做久久久久久| 亚洲乱码日产精品bd| 同产精品九九九| 国产不卡视频在线观看| 欧美综合久久久| 欧美v国产在线一区二区三区| 久久久久97国产精华液好用吗| 亚洲天堂成人网| 毛片av一区二区| 91在线码无精品| 精品久久人人做人人爽| 亚洲乱码国产乱码精品精98午夜| 三级一区在线视频先锋| 国产成人午夜高潮毛片| 欧美放荡的少妇| 国产精品视频yy9299一区| 无吗不卡中文字幕| 99精品黄色片免费大全| 精品日韩一区二区三区免费视频| 综合久久综合久久| 久久99精品久久久久婷婷| 91视频精品在这里| 久久影视一区二区| 五月天激情综合| 91首页免费视频| 欧美国产一区视频在线观看| 青椒成人免费视频| 色美美综合视频| 国产亚洲人成网站| 婷婷开心久久网| 在线观看日韩av先锋影音电影院| 国产欧美精品一区aⅴ影院| 亚洲成人在线网站| 色狠狠一区二区| 国产精品私房写真福利视频| 久久精品99国产精品日本| 欧美三级电影在线看| 日韩一区中文字幕| 国产91丝袜在线播放0| 日韩欧美国产一二三区| 亚洲成人三级小说| 在线观看视频一区二区欧美日韩| 国产精品久久久久毛片软件| 国产成人免费xxxxxxxx| 欧美精品一区二区三区一线天视频 | 欧美国产成人在线| 久久黄色级2电影| 欧美一级片在线观看| 亚洲国产精品尤物yw在线观看| 色成人在线视频| 亚洲一级二级三级在线免费观看| 97久久超碰国产精品电影| 国产精品久99| 成人免费视频免费观看| 久久精品亚洲麻豆av一区二区| 国内不卡的二区三区中文字幕| 在线91免费看| 日本aⅴ免费视频一区二区三区| 欧美一区二区三区在线| 日韩成人一区二区| 欧美一级视频精品观看|