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

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

?? arm_gic.c

?? QEMU 0.91 source code, supports ARM processor including S3C24xx series
?? C
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
/* * 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));        }

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
丝袜美腿成人在线| 亚洲va天堂va国产va久| 日韩一区二区三区电影| 在线影视一区二区三区| 亚洲成av人片在线| 亚洲一区二区精品3399| ㊣最新国产の精品bt伙计久久| 精品成人a区在线观看| 91麻豆精品国产91久久久更新时间| 91传媒视频在线播放| 国产福利不卡视频| 风流少妇一区二区| 国产69精品久久777的优势| 黄色成人免费在线| 欧美日韩国产一级片| 一本到不卡免费一区二区| 92精品国产成人观看免费| 成人18视频日本| 成人一级黄色片| 丁香啪啪综合成人亚洲小说| 国产不卡在线一区| 欧美96一区二区免费视频| 久久国产生活片100| 久久97超碰国产精品超碰| 亚洲国产欧美在线| 亚洲一区在线观看视频| 日本成人在线电影网| 男男视频亚洲欧美| 毛片基地黄久久久久久天堂| 美女被吸乳得到大胸91| 精品一区二区三区香蕉蜜桃| 日韩福利电影在线观看| 激情久久五月天| 国产99精品在线观看| 波多野结衣欧美| 色天天综合久久久久综合片| 在线观看91精品国产入口| 在线亚洲免费视频| 欧美精品高清视频| 久久综合色婷婷| 国产精品美女久久久久av爽李琼| 国产精品久久久久一区| 樱桃视频在线观看一区| 视频在线观看国产精品| 亚洲一级二级三级在线免费观看| 日韩在线播放一区二区| 精品无人区卡一卡二卡三乱码免费卡| 国内成人精品2018免费看| 99久久777色| 日韩欧美一级二级三级| 日韩美女视频一区| 麻豆精品一区二区综合av| 成人av在线网站| 欧美一区二区精美| ...xxx性欧美| 蜜臀av一区二区| 色一情一乱一乱一91av| 精品国产一区久久| 亚洲一级二级在线| 国产91在线观看丝袜| 欧美日韩国产一二三| 欧美激情中文字幕| 日本不卡免费在线视频| 91麻豆免费观看| 亚洲精品一区二区在线观看| 亚洲国产一区二区三区青草影视| 国产91精品一区二区麻豆网站| 欧美一区二区三区白人| 亚洲黄色免费网站| 日韩久久精品一区| 亚洲欧美电影一区二区| 国产精品香蕉一区二区三区| 91精品国产综合久久精品麻豆 | 日韩丝袜情趣美女图片| 综合分类小说区另类春色亚洲小说欧美| 免费看欧美美女黄的网站| 日本电影欧美片| 国产精品久久久久一区二区三区 | 久久成人精品无人区| 欧美日韩情趣电影| 亚洲激情成人在线| hitomi一区二区三区精品| 久久久www成人免费毛片麻豆 | 99久久99久久精品免费观看| 久久午夜国产精品| 久久成人羞羞网站| 日韩三级在线观看| 午夜激情一区二区三区| 欧美亚洲国产bt| 亚洲免费毛片网站| 91视频观看视频| 国产精品久久久久桃色tv| 国产91综合网| 国产精品欧美一区喷水| 国产成人午夜片在线观看高清观看| 日韩欧美中文字幕一区| 日韩国产欧美在线视频| 欧美久久久一区| 香港成人在线视频| 欧美日本一区二区三区| 午夜精品免费在线观看| 欧美日韩在线电影| 天堂午夜影视日韩欧美一区二区| 欧美日韩在线精品一区二区三区激情| 一级精品视频在线观看宜春院| 91麻豆国产自产在线观看| 综合久久国产九一剧情麻豆| 不卡的av在线| 一区二区三区成人| 欧美日韩一级大片网址| 日韩高清在线不卡| 日韩欧美成人激情| 国产激情一区二区三区| 国产区在线观看成人精品 | 91麻豆自制传媒国产之光| 亚洲欧美日韩一区| 在线免费观看日本一区| 午夜久久久影院| 日韩免费看的电影| 国产成人啪免费观看软件| 国产精品欧美久久久久无广告 | 久久成人羞羞网站| 久久精品人人做人人综合| 成人av午夜电影| 亚洲人成伊人成综合网小说| 国产三级一区二区| 99久久婷婷国产综合精品| 亚洲一区二区视频在线| 91精品国产色综合久久久蜜香臀| 久久成人精品无人区| 中文字幕精品—区二区四季| 色综合天天综合给合国产| 国产精品996| 中文幕一区二区三区久久蜜桃| caoporn国产精品| 亚洲国产精品自拍| 精品免费一区二区三区| 成年人午夜久久久| 亚洲福利视频一区| 精品粉嫩超白一线天av| 99re这里只有精品视频首页| 午夜精品123| 久久久久久电影| 在线观看日韩高清av| 紧缚捆绑精品一区二区| 亚洲免费在线视频| 亚洲精品在线电影| 在线观看免费一区| 国产一区二区三区四区在线观看| 亚洲视频一二三区| 日韩三级免费观看| 在线中文字幕不卡| 国产精品亚洲成人| 亚洲成a人片在线不卡一二三区| 欧美精品一区二区在线播放| 在线观看中文字幕不卡| 激情文学综合丁香| 亚洲小少妇裸体bbw| 国产日韩欧美一区二区三区乱码 | 欧美激情一区二区三区| 欧美日韩dvd在线观看| 成人激情黄色小说| 久久精品二区亚洲w码| 亚洲精品综合在线| 久久丝袜美腿综合| 欧美日韩成人综合天天影院| 丁香啪啪综合成人亚洲小说 | 色综合久久88色综合天天6| 久久电影网站中文字幕 | 岛国精品一区二区| 免费在线看成人av| 亚洲欧美日韩中文播放| 久久亚洲春色中文字幕久久久| 欧美日韩一区在线| 99久久精品国产一区| 国产在线日韩欧美| 日韩中文欧美在线| 亚洲精品乱码久久久久久日本蜜臀| 国产欧美日韩在线| 日韩一区二区三区四区| 91成人在线免费观看| 91视频.com| av电影天堂一区二区在线| 国产精品一区二区男女羞羞无遮挡| 午夜欧美一区二区三区在线播放| 亚洲丝袜美腿综合| 国产精品欧美综合在线| 26uuu精品一区二区三区四区在线| 4hu四虎永久在线影院成人| 91极品视觉盛宴| 色综合天天天天做夜夜夜夜做| 国产成人精品亚洲午夜麻豆| 韩国av一区二区| 美国欧美日韩国产在线播放| 午夜亚洲国产au精品一区二区| 亚洲精品第1页| 黄页网站大全一区二区| 免费不卡在线视频| 日本三级韩国三级欧美三级| 亚洲一卡二卡三卡四卡五卡|