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

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

?? domain.c

?? xen 3.2.2 源碼
?? C
?? 第 1 頁 / 共 4 頁
字號:
/****************************************************************************** * arch/x86/domain.c * * x86-specific domain handling (e.g., register setup and context switching). *//* *  Copyright (C) 1995  Linus Torvalds * *  Pentium III FXSR, SSE support *  Gareth Hughes <gareth@valinux.com>, May 2000 */#include <xen/config.h>#include <xen/init.h>#include <xen/lib.h>#include <xen/errno.h>#include <xen/sched.h>#include <xen/domain.h>#include <xen/smp.h>#include <xen/delay.h>#include <xen/softirq.h>#include <xen/grant_table.h>#include <xen/iocap.h>#include <xen/kernel.h>#include <xen/multicall.h>#include <xen/irq.h>#include <xen/event.h>#include <xen/console.h>#include <xen/percpu.h>#include <xen/compat.h>#include <xen/acpi.h>#include <asm/regs.h>#include <asm/mc146818rtc.h>#include <asm/system.h>#include <asm/io.h>#include <asm/processor.h>#include <asm/desc.h>#include <asm/i387.h>#include <asm/mpspec.h>#include <asm/ldt.h>#include <asm/paging.h>#include <asm/hypercall.h>#include <asm/hvm/hvm.h>#include <asm/hvm/support.h>#include <asm/debugreg.h>#include <asm/msr.h>#include <asm/nmi.h>#include <asm/iommu.h>#ifdef CONFIG_COMPAT#include <compat/vcpu.h>#endifDEFINE_PER_CPU(struct vcpu *, curr_vcpu);DEFINE_PER_CPU(u64, efer);DEFINE_PER_CPU(unsigned long, cr4);static void paravirt_ctxt_switch_from(struct vcpu *v);static void paravirt_ctxt_switch_to(struct vcpu *v);static void vcpu_destroy_pagetables(struct vcpu *v);static void continue_idle_domain(struct vcpu *v){    reset_stack_and_jump(idle_loop);}static void continue_nonidle_domain(struct vcpu *v){    reset_stack_and_jump(ret_from_intr);}static void default_idle(void){    local_irq_disable();    if ( !softirq_pending(smp_processor_id()) )        safe_halt();    else        local_irq_enable();}static void play_dead(void){    __cpu_disable();    /* This must be done before dead CPU ack */    cpu_exit_clear();    hvm_cpu_down();    wbinvd();    mb();    /* Ack it */    __get_cpu_var(cpu_state) = CPU_DEAD;    /* With physical CPU hotplug, we should halt the cpu. */    local_irq_disable();    for ( ; ; )        halt();}void idle_loop(void){    for ( ; ; )    {        if (cpu_is_offline(smp_processor_id()))            play_dead();        page_scrub_schedule_work();        default_idle();        do_softirq();    }}void startup_cpu_idle_loop(void){    struct vcpu *v = current;    ASSERT(is_idle_vcpu(v));    cpu_set(smp_processor_id(), v->domain->domain_dirty_cpumask);    cpu_set(smp_processor_id(), v->vcpu_dirty_cpumask);    reset_stack_and_jump(idle_loop);}void dump_pageframe_info(struct domain *d){    struct page_info *page;    printk("Memory pages belonging to domain %u:\n", d->domain_id);    if ( d->tot_pages >= 10 )    {        printk("    DomPage list too long to display\n");    }    else    {        list_for_each_entry ( page, &d->page_list, list )        {            printk("    DomPage %p: caf=%08x, taf=%" PRtype_info "\n",                   _p(page_to_mfn(page)),                   page->count_info, page->u.inuse.type_info);        }    }    list_for_each_entry ( page, &d->xenpage_list, list )    {        printk("    XenPage %p: caf=%08x, taf=%" PRtype_info "\n",               _p(page_to_mfn(page)),               page->count_info, page->u.inuse.type_info);    }}struct vcpu *alloc_vcpu_struct(void){    struct vcpu *v;    if ( (v = xmalloc(struct vcpu)) != NULL )        memset(v, 0, sizeof(*v));    return v;}void free_vcpu_struct(struct vcpu *v){    xfree(v);}#ifdef CONFIG_COMPATint setup_arg_xlat_area(struct vcpu *v, l4_pgentry_t *l4tab){    struct domain *d = v->domain;    unsigned i;    struct page_info *pg;    if ( !d->arch.mm_arg_xlat_l3 )    {        pg = alloc_domheap_page(NULL);        if ( !pg )            return -ENOMEM;        d->arch.mm_arg_xlat_l3 = page_to_virt(pg);        clear_page(d->arch.mm_arg_xlat_l3);    }    l4tab[l4_table_offset(COMPAT_ARG_XLAT_VIRT_BASE)] =        l4e_from_paddr(__pa(d->arch.mm_arg_xlat_l3), __PAGE_HYPERVISOR);    for ( i = 0; i < COMPAT_ARG_XLAT_PAGES; ++i )    {        unsigned long va = COMPAT_ARG_XLAT_VIRT_START(v->vcpu_id) + i * PAGE_SIZE;        l2_pgentry_t *l2tab;        l1_pgentry_t *l1tab;        if ( !l3e_get_intpte(d->arch.mm_arg_xlat_l3[l3_table_offset(va)]) )        {            pg = alloc_domheap_page(NULL);            if ( !pg )                return -ENOMEM;            clear_page(page_to_virt(pg));            d->arch.mm_arg_xlat_l3[l3_table_offset(va)] = l3e_from_page(pg, __PAGE_HYPERVISOR);        }        l2tab = l3e_to_l2e(d->arch.mm_arg_xlat_l3[l3_table_offset(va)]);        if ( !l2e_get_intpte(l2tab[l2_table_offset(va)]) )        {            pg = alloc_domheap_page(NULL);            if ( !pg )                return -ENOMEM;            clear_page(page_to_virt(pg));            l2tab[l2_table_offset(va)] = l2e_from_page(pg, __PAGE_HYPERVISOR);        }        l1tab = l2e_to_l1e(l2tab[l2_table_offset(va)]);        BUG_ON(l1e_get_intpte(l1tab[l1_table_offset(va)]));        pg = alloc_domheap_page(NULL);        if ( !pg )            return -ENOMEM;        l1tab[l1_table_offset(va)] = l1e_from_page(pg, PAGE_HYPERVISOR);    }    return 0;}static void release_arg_xlat_area(struct domain *d){    if ( d->arch.mm_arg_xlat_l3 )    {        unsigned l3;        for ( l3 = 0; l3 < L3_PAGETABLE_ENTRIES; ++l3 )        {            if ( l3e_get_intpte(d->arch.mm_arg_xlat_l3[l3]) )            {                l2_pgentry_t *l2tab = l3e_to_l2e(d->arch.mm_arg_xlat_l3[l3]);                unsigned l2;                for ( l2 = 0; l2 < L2_PAGETABLE_ENTRIES; ++l2 )                {                    if ( l2e_get_intpte(l2tab[l2]) )                    {                        l1_pgentry_t *l1tab = l2e_to_l1e(l2tab[l2]);                        unsigned l1;                        for ( l1 = 0; l1 < L1_PAGETABLE_ENTRIES; ++l1 )                        {                            if ( l1e_get_intpte(l1tab[l1]) )                                free_domheap_page(l1e_get_page(l1tab[l1]));                        }                        free_domheap_page(l2e_get_page(l2tab[l2]));                    }                }                free_domheap_page(l3e_get_page(d->arch.mm_arg_xlat_l3[l3]));            }        }        free_domheap_page(virt_to_page(d->arch.mm_arg_xlat_l3));    }}static int setup_compat_l4(struct vcpu *v){    struct page_info *pg = alloc_domheap_page(NULL);    l4_pgentry_t *l4tab;    int rc;    if ( pg == NULL )        return -ENOMEM;    /* This page needs to look like a pagetable so that it can be shadowed */    pg->u.inuse.type_info = PGT_l4_page_table|PGT_validated;    l4tab = copy_page(page_to_virt(pg), idle_pg_table);    l4tab[0] = l4e_empty();    l4tab[l4_table_offset(LINEAR_PT_VIRT_START)] =        l4e_from_page(pg, __PAGE_HYPERVISOR);    l4tab[l4_table_offset(PERDOMAIN_VIRT_START)] =        l4e_from_paddr(__pa(v->domain->arch.mm_perdomain_l3),                       __PAGE_HYPERVISOR);    if ( (rc = setup_arg_xlat_area(v, l4tab)) < 0 )    {        free_domheap_page(pg);        return rc;    }    v->arch.guest_table = pagetable_from_page(pg);    v->arch.guest_table_user = v->arch.guest_table;    return 0;}static void release_compat_l4(struct vcpu *v){    free_domheap_page(pagetable_get_page(v->arch.guest_table));    v->arch.guest_table = pagetable_null();    v->arch.guest_table_user = pagetable_null();}static inline int may_switch_mode(struct domain *d){    return (!is_hvm_domain(d) && (d->tot_pages == 0));}int switch_native(struct domain *d){    l1_pgentry_t gdt_l1e;    unsigned int vcpuid;    if ( d == NULL )        return -EINVAL;    if ( !may_switch_mode(d) )        return -EACCES;    if ( !is_pv_32on64_domain(d) )        return 0;    d->arch.is_32bit_pv = d->arch.has_32bit_shinfo = 0;    release_arg_xlat_area(d);    /* switch gdt */    gdt_l1e = l1e_from_page(virt_to_page(gdt_table), PAGE_HYPERVISOR);    for ( vcpuid = 0; vcpuid < MAX_VIRT_CPUS; vcpuid++ )    {        d->arch.mm_perdomain_pt[((vcpuid << GDT_LDT_VCPU_SHIFT) +                                 FIRST_RESERVED_GDT_PAGE)] = gdt_l1e;        if (d->vcpu[vcpuid])            release_compat_l4(d->vcpu[vcpuid]);    }    return 0;}int switch_compat(struct domain *d){    l1_pgentry_t gdt_l1e;    unsigned int vcpuid;    if ( d == NULL )        return -EINVAL;    if ( !may_switch_mode(d) )        return -EACCES;    if ( is_pv_32on64_domain(d) )        return 0;    d->arch.is_32bit_pv = d->arch.has_32bit_shinfo = 1;    /* switch gdt */    gdt_l1e = l1e_from_page(virt_to_page(compat_gdt_table), PAGE_HYPERVISOR);    for ( vcpuid = 0; vcpuid < MAX_VIRT_CPUS; vcpuid++ )    {        if ( (d->vcpu[vcpuid] != NULL) &&             (setup_compat_l4(d->vcpu[vcpuid]) != 0) )            goto undo_and_fail;        d->arch.mm_perdomain_pt[((vcpuid << GDT_LDT_VCPU_SHIFT) +                                 FIRST_RESERVED_GDT_PAGE)] = gdt_l1e;    }    domain_set_alloc_bitsize(d);    return 0; undo_and_fail:    d->arch.is_32bit_pv = d->arch.has_32bit_shinfo = 0;    release_arg_xlat_area(d);    gdt_l1e = l1e_from_page(virt_to_page(gdt_table), PAGE_HYPERVISOR);    while ( vcpuid-- != 0 )    {        if ( d->vcpu[vcpuid] != NULL )            release_compat_l4(d->vcpu[vcpuid]);        d->arch.mm_perdomain_pt[((vcpuid << GDT_LDT_VCPU_SHIFT) +                                 FIRST_RESERVED_GDT_PAGE)] = gdt_l1e;    }    return -ENOMEM;}#else#define release_arg_xlat_area(d) ((void)0)#define setup_compat_l4(v) 0#define release_compat_l4(v) ((void)0)#endifint vcpu_initialise(struct vcpu *v){    struct domain *d = v->domain;    int rc;    v->arch.vcpu_info_mfn = INVALID_MFN;    v->arch.flags = TF_kernel_mode;#if defined(__i386__)    mapcache_vcpu_init(v);#endif    pae_l3_cache_init(&v->arch.pae_l3_cache);    paging_vcpu_init(v);    if ( is_hvm_domain(d) )    {        if ( (rc = hvm_vcpu_initialise(v)) != 0 )            return rc;    }    else    {        /* PV guests by default have a 100Hz ticker. */        v->periodic_period = MILLISECS(10);        /* PV guests get an emulated PIT too for video BIOSes to use. */        if ( !is_idle_domain(d) && (v->vcpu_id == 0) )            pit_init(v, cpu_khz);        v->arch.schedule_tail = continue_nonidle_domain;        v->arch.ctxt_switch_from = paravirt_ctxt_switch_from;        v->arch.ctxt_switch_to   = paravirt_ctxt_switch_to;        if ( is_idle_domain(d) )        {            v->arch.schedule_tail = continue_idle_domain;            v->arch.cr3           = __pa(idle_pg_table);        }        v->arch.guest_context.ctrlreg[4] =            real_cr4_to_pv_guest_cr4(mmu_cr4_features);    }    v->arch.perdomain_ptes =        d->arch.mm_perdomain_pt + (v->vcpu_id << GDT_LDT_VCPU_SHIFT);    return (is_pv_32on64_vcpu(v) ? setup_compat_l4(v) : 0);}void vcpu_destroy(struct vcpu *v){    if ( is_pv_32on64_vcpu(v) )        release_compat_l4(v);    if ( is_hvm_vcpu(v) )        hvm_vcpu_destroy(v);}int arch_domain_create(struct domain *d){#ifdef __x86_64__    struct page_info *pg;    int i;#endif    l1_pgentry_t gdt_l1e;    int vcpuid, pdpt_order, paging_initialised = 0;    int rc = -ENOMEM;    d->arch.relmem = RELMEM_not_started;    INIT_LIST_HEAD(&d->arch.relmem_list);    pdpt_order = get_order_from_bytes(PDPT_L1_ENTRIES * sizeof(l1_pgentry_t));    d->arch.mm_perdomain_pt = alloc_xenheap_pages(pdpt_order);    if ( d->arch.mm_perdomain_pt == NULL )        goto fail;    memset(d->arch.mm_perdomain_pt, 0, PAGE_SIZE << pdpt_order);    /*     * Map Xen segments into every VCPU's GDT, irrespective of whether every     * VCPU will actually be used. This avoids an NMI race during context     * switch: if we take an interrupt after switching CR3 but before switching     * GDT, and the old VCPU# is invalid in the new domain, we would otherwise     * try to load CS from an invalid table.     */    gdt_l1e = l1e_from_page(virt_to_page(gdt_table), PAGE_HYPERVISOR);    for ( vcpuid = 0; vcpuid < MAX_VIRT_CPUS; vcpuid++ )        d->arch.mm_perdomain_pt[((vcpuid << GDT_LDT_VCPU_SHIFT) +                                 FIRST_RESERVED_GDT_PAGE)] = gdt_l1e;#if defined(__i386__)    mapcache_domain_init(d);#else /* __x86_64__ */    if ( (pg = alloc_domheap_page(NULL)) == NULL )        goto fail;    d->arch.mm_perdomain_l2 = page_to_virt(pg);    clear_page(d->arch.mm_perdomain_l2);    for ( i = 0; i < (1 << pdpt_order); i++ )        d->arch.mm_perdomain_l2[l2_table_offset(PERDOMAIN_VIRT_START)+i] =            l2e_from_page(virt_to_page(d->arch.mm_perdomain_pt)+i,                          __PAGE_HYPERVISOR);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲免费看黄网站| 国产精品福利一区二区| 久久久久国产精品麻豆ai换脸| 欧美日韩精品三区| 精品视频在线免费看| caoporm超碰国产精品| www.亚洲激情.com| 欧美精品在线视频| 久久综合给合久久狠狠狠97色69| 国产人成一区二区三区影院| 成人欧美一区二区三区小说| 一区二区在线免费观看| 亚洲不卡av一区二区三区| 日韩极品在线观看| 福利电影一区二区| 欧美三级日韩三级国产三级| 精品国产一区二区亚洲人成毛片| 亚洲国产精品高清| 亚洲福利一区二区三区| 国产一区二三区| 色婷婷综合久久久中文字幕| 欧美大片国产精品| 国产精品国产馆在线真实露脸| 热久久久久久久| 暴力调教一区二区三区| 欧美色大人视频| 久久久久久黄色| 伊人婷婷欧美激情| 日韩av不卡一区二区| 91丨porny丨户外露出| 精品电影一区二区三区 | 青青国产91久久久久久| 91欧美激情一区二区三区成人| 久久在线观看免费| 热久久一区二区| 欧美中文字幕亚洲一区二区va在线 | 成人精品在线视频观看| 日韩一级在线观看| 亚洲bdsm女犯bdsm网站| 国产不卡视频在线播放| 欧美一区二区三区在线视频| 综合欧美一区二区三区| 成人激情校园春色| 国产精品久久久久久一区二区三区 | 丰满少妇在线播放bd日韩电影| 久久亚洲二区三区| 精品一区二区三区蜜桃| 欧美一区二区网站| 极品少妇xxxx精品少妇| 日韩欧美国产精品| 精品一二三四在线| 久久麻豆一区二区| 成人av在线一区二区三区| 中文一区在线播放| 成人国产视频在线观看| 国产精品私人影院| 91蜜桃免费观看视频| 天天做天天摸天天爽国产一区| 欧美撒尿777hd撒尿| 久久精品国产**网站演员| 8x8x8国产精品| 久久66热偷产精品| 久久久久亚洲蜜桃| 国产黄色精品视频| 国产精品不卡在线观看| 欧美丝袜第三区| 久久国产福利国产秒拍| 亚洲日本va在线观看| 日韩一区二区在线看| 成人午夜在线视频| 一区二区三区色| 亚洲精品一区二区在线观看| 国产真实乱对白精彩久久| 国产精品麻豆网站| 欧美在线你懂的| 国产成人av电影在线| 一区二区三区在线播| 精品卡一卡二卡三卡四在线| 色综合咪咪久久| 日本sm残虐另类| 国产精品福利av| 日韩精品一区二区三区老鸭窝| 成av人片一区二区| 国产一区二区不卡老阿姨| 亚洲一区二区三区四区五区黄| 精品国产人成亚洲区| 欧美区在线观看| 色婷婷亚洲精品| 成人黄色av电影| 国产综合一区二区| 热久久免费视频| 香蕉久久一区二区不卡无毒影院| 中文字幕电影一区| 久久久91精品国产一区二区精品 | 日韩欧美电影在线| 欧美视频在线观看一区| 在线免费视频一区二区| 色综合激情五月| 99久久免费国产| 国产成人精品1024| 国产精品小仙女| 国产成人在线影院| 成人国产在线观看| 99精品一区二区三区| 成人午夜免费av| 成人激情免费网站| 成人久久视频在线观看| 91免费版pro下载短视频| 色综合天天视频在线观看| 在线看国产一区| 欧美天天综合网| 在线成人午夜影院| 欧美不卡一二三| 国产视频一区在线观看 | 色狠狠一区二区三区香蕉| 欧美日韩大陆一区二区| 欧美日本一区二区| 欧美一区二区福利视频| 欧美一区欧美二区| 久久久亚洲精华液精华液精华液| 中文字幕在线观看不卡| 午夜精品在线看| 国产精品一区专区| 91在线国产福利| 欧美性三三影院| 精品国产乱码久久久久久图片| 国产精品视频观看| 亚洲一区二区综合| 国产成人久久精品77777最新版本| 欧洲一区二区三区免费视频| 日本精品一区二区三区高清| 欧美色老头old∨ideo| 久久久www免费人成精品| 尤物av一区二区| 国产精品一二三四五| 欧美亚男人的天堂| 国产欧美精品一区| 亚洲大片免费看| 成人精品国产一区二区4080| 337p亚洲精品色噜噜噜| 久久久五月婷婷| 免费高清视频精品| 91成人在线观看喷潮| 亚洲国产精品传媒在线观看| 日韩国产一二三区| 欧美综合欧美视频| 一区二区三区中文字幕电影| 国产精品99久久久久| 精品成人一区二区| 婷婷夜色潮精品综合在线| 99久久精品免费| 国产精品免费看片| 成人a免费在线看| 国产日韩欧美亚洲| 国产精品69毛片高清亚洲| 日韩一级大片在线| 久久不见久久见中文字幕免费| 欧美一级免费观看| 美女诱惑一区二区| 精品国产乱码久久久久久蜜臀| 久久国产福利国产秒拍| 久久亚洲精品国产精品紫薇| 国产精品456| 亚洲日本韩国一区| 欧美日韩日日摸| 久久超碰97中文字幕| 国产亚洲一区二区三区| zzijzzij亚洲日本少妇熟睡| 最新热久久免费视频| 欧美色图免费看| 久久国产免费看| 综合分类小说区另类春色亚洲小说欧美 | 亚洲第一主播视频| 日韩一区二区三区免费看| 成人国产精品免费观看视频| 蜜臀av一区二区三区| 亚洲一区二区高清| 国产精品久久久久久久久搜平片 | 精品免费一区二区三区| 色婷婷av久久久久久久| 不卡的av在线| eeuss鲁一区二区三区| 国产盗摄精品一区二区三区在线| 日韩精品一二三四| 国产精品看片你懂得| 91麻豆蜜桃一区二区三区| 欧美日本一区二区在线观看| 久久国产精品99久久人人澡| 国产女人水真多18毛片18精品视频| 99久久精品久久久久久清纯| 毛片av中文字幕一区二区| 亚洲图片激情小说| 久久久美女毛片| 日韩精品一区二区三区中文精品| 欧美亚男人的天堂| 成人av网站大全| 国产经典欧美精品| 久久99精品网久久| 日韩国产高清影视| 日韩成人av影视|