⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 exceptions.c

📁 xen 3.2.2 源码
💻 C
字号:
/* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA. * * Copyright (C) IBM Corp. 2005, 2006 * * Authors: Hollis Blanchard <hollisb@us.ibm.com> *          Jimi Xenidis <jimix@watson.ibm.com> */#include <xen/config.h>#include <xen/softirq.h>#include <xen/sched.h>#include <xen/serial.h>#include <xen/gdbstub.h>#include <xen/console.h>#include <xen/shutdown.h>#include <asm/time.h>#include <asm/processor.h>#include <asm/debugger.h>#undef DEBUGextern ulong ppc_do_softirq(ulong orig_msr);extern void do_timer(struct cpu_user_regs *regs);extern void do_dec(struct cpu_user_regs *regs);extern void program_exception(struct cpu_user_regs *regs,                              unsigned long cookie);extern int reprogram_timer(s_time_t timeout); int hdec_sample = 0;void do_timer(struct cpu_user_regs *regs){    /* Set HDEC high so it stops firing and can be reprogrammed by     * set_preempt() */    /* FIXME! HACK ALERT!     *     * We have a bug in that if we switch domains in schedule() we     * switch right away regardless of whatever else is pending.  This     * means that if the timer goes off while in schedule(), the next     * domain will be preempted by the interval defined below.  So     * until we fix our cotnext_switch(), the follow workaround will     * make sure that the domain we switch to does not run for to long     * so we can continue to service the other timers in the timer     * queue and that the value is long enough to escape this     * particular timer event.     */    reprogram_timer(NOW() + MILLISECS(1));    raise_softirq(TIMER_SOFTIRQ);}void do_dec(struct cpu_user_regs *regs){    if (!(regs->msr & MSR_HV)) {        panic("HV dec from domain\n");    }    printk("DEC_HV: pc: 0x%lx lr: 0x%lx \n", regs->pc, regs->lr);    mtdec(INT_MAX);}void program_exception(struct cpu_user_regs *regs, unsigned long cookie){    if (cookie == 0x200) {        if (cpu_machinecheck(regs))            return;        printk("%s: machine check\n", __func__);    } else {#ifdef CRASH_DEBUG        if (__trap_to_gdb(regs, cookie) == 0)            return;#endif /* CRASH_DEBUG */        printk("%s: type: 0x%lx\n", __func__, cookie);        show_backtrace_regs(regs);    }    machine_halt();}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -