本文整理汇总了C++中read_c0_status函数的典型用法代码示例。如果您正苦于以下问题:C++ read_c0_status函数的具体用法?C++ read_c0_status怎么用?C++ read_c0_status使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了read_c0_status函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: plat_irq_dispatch
asmlinkage void plat_irq_dispatch(void)
{
unsigned int pending;
pending = read_c0_cause() & read_c0_status() & ST0_IM;
/* machine-specific plat_irq_dispatch */
mach_irq_dispatch(pending);
}
开发者ID:0-T-0,项目名称:ps4-linux,代码行数:9,代码来源:irq.c
示例2: do_general_exception
u32 do_general_exception(arch_regs_t *uregs)
{
u32 cp0_cause = read_c0_cause();
u32 cp0_status = read_c0_status();
mips32_entryhi_t ehi;
u32 victim_asid;
u32 victim_inst;
struct vmm_vcpu *c_vcpu;
u8 delay_slot_exception = IS_BD_SET(cp0_cause);
ehi._entryhi = read_c0_entryhi();
victim_asid = ehi._s_entryhi.asid >> ASID_SHIFT;
c_vcpu = vmm_scheduler_current_vcpu();
/*
* When exception is happening in the delay slot. We need to emulate
* the corresponding branch instruction first. If its one of the "likely"
* instructions, we don't need to emulate the faulting instruction since
* "likely" instructions don't allow slot to be executed if branch is not
* taken.
*/
if (delay_slot_exception) {
victim_inst = *((u32 *)(uregs->cp0_epc + 4));
/*
* If this function returns zero, the branch instruction was a
* "likely" instruction and the branch wasn't taken. So don't
* execute the delay slot, just return. The correct EPC to return
* to will be programmed under our feet.
*/
if (!cpu_vcpu_emulate_branch_and_jump_inst(c_vcpu, *((u32 *)uregs->cp0_epc), uregs)) {
return VMM_OK;
}
} else {
victim_inst = *((u32 *)uregs->cp0_epc);
}
switch (EXCEPTION_CAUSE(cp0_cause)) {
case EXEC_CODE_COPU:
cpu_vcpu_emulate_cop_inst(c_vcpu, victim_inst, uregs);
if (!delay_slot_exception)
uregs->cp0_epc += 4;
break;
case EXEC_CODE_TLBL:
if (CPU_IN_USER_MODE(cp0_status) && is_vmm_asid(ehi._s_entryhi.asid)) {
ehi._s_entryhi.asid = (0x1 << ASID_SHIFT);
write_c0_entryhi(ehi._entryhi);
vmm_panic("CPU is in user mode and ASID is pointing to VMM!!\n");
}
break;
}
return VMM_OK;
}
开发者ID:psawargaonkar,项目名称:xvisor-arm,代码行数:57,代码来源:cpu_genex.c
示例3: handle_tlb_refill
void handle_tlb_refill(struct trapframe *tf) {
unsigned long entryhi=read_c0_entryhi();
unsigned long vpn=TLB_VPN(entryhi);
unsigned long pfn=pt[ENTRYHI_ASID(entryhi)][vpn];
if(pfn) {
unsigned long entrylo=( TLB_PFN(pfn, entryhi) | TLB_COHERENT | TLB_VALID | TLB_DIRTY | TLB_GLOBAL)^TLB_GLOBAL;
write_c0_entrylo0(entrylo);
write_c0_entrylo1(TLB_ELO0TO1(entrylo));
tlbwr();
} else {
kprintf("Fatal error, invalied page: %x with ASID= %d, rebooting...\n",vpn, ENTRYHI_ASID(entryhi));
unsigned long* reg=(unsigned long*)tf;
write_c0_status((read_c0_status()|ST_KSU)^ST_KSU);
reg[ORD_STATUS]=(read_c0_status()|ST_KSU)^ST_KSU;
reg[ORD_EPC]=__reset;
}
return;
}
开发者ID:SailWhite,项目名称:Operating-System-Course-Project,代码行数:18,代码来源:kernel.c
示例4: arch_vcpu_regs_switch
void arch_vcpu_regs_switch(struct vmm_vcpu *tvcpu,
struct vmm_vcpu *vcpu,
arch_regs_t *regs)
{
if (tvcpu) {
vmm_memcpy(mips_uregs(tvcpu), regs, sizeof(arch_regs_t));
}
if (vcpu) {
if (!vcpu->is_normal) {
mips_uregs(vcpu)->cp0_status = read_c0_status() & ~(0x01UL << CP0_STATUS_UM_SHIFT);
} else {
mips_uregs(vcpu)->cp0_status = read_c0_status() | (0x01UL << CP0_STATUS_UM_SHIFT);
}
vmm_memcpy(regs, mips_uregs(vcpu), sizeof(arch_regs_t));
}
}
开发者ID:psawargaonkar,项目名称:xvisor-arm,代码行数:18,代码来源:cpu_vcpu_helper.c
示例5: save_processor_state
void save_processor_state(void)
{
saved_status = read_c0_status();
if (is_fpu_owner())
save_fp(current);
if (cpu_has_dsp)
save_dsp(current);
}
开发者ID:03199618,项目名称:linux,代码行数:9,代码来源:cpu.c
示例6: cpu_get_fpu_id
/*
* Get the FPU Implementation/Revision.
*/
static inline unsigned long cpu_get_fpu_id(void)
{
unsigned long tmp, fpu_id;
tmp = read_c0_status();
__enable_fpu();
fpu_id = read_32bit_cp1_register(CP1_REVISION);
write_c0_status(tmp);
return fpu_id;
}
开发者ID:TheTypoMaster,项目名称:AH4222,代码行数:13,代码来源:cpu-probe.c
示例7: plat_irq_dispatch
asmlinkage void plat_irq_dispatch(void)
{
unsigned int pending = read_c0_status() & read_c0_cause() & ST0_IM;
if (pending & STATUSF_IP7) /* cpu timer */
do_IRQ(7);
else if (pending & STATUSF_IP2) /* int0 hardware line */
ar7_cascade();
else
spurious_interrupt();
}
开发者ID:ANFS,项目名称:ANFS-kernel,代码行数:10,代码来源:irq.c
示例8: plat_irq_dispatch
asmlinkage void plat_irq_dispatch(void)
{
unsigned int pending = read_c0_status() & read_c0_cause() & ST0_IM;
if (pending & STATUSF_IP2)
do_IRQ(2);
else if (pending & STATUSF_IP3)
do_IRQ(3);
else
spurious_interrupt();
}
开发者ID:ravi-vid,项目名称:linux-xlnx,代码行数:10,代码来源:irq.c
示例9: plat_irq_dispatch
asmlinkage void plat_irq_dispatch(void)
{
unsigned int pending;
#if defined (CONFIG_RALINK_RT3883) || defined (CONFIG_RALINK_MT7620) || \
defined (CONFIG_RALINK_MT7628)
unsigned int pci_status;
#endif
pending = read_c0_status() & read_c0_cause() & ST0_IM;
if (!pending) {
spurious_interrupt();
return;
}
if (pending & CAUSEF_IP7) {
do_IRQ(SURFBOARDINT_MIPS_TIMER); // CPU Timer
return;
}
if (pending & CAUSEF_IP5)
do_IRQ(SURFBOARDINT_FE); // Frame Engine
if (pending & CAUSEF_IP6)
do_IRQ(SURFBOARDINT_WLAN); // Wireless
if (pending & CAUSEF_IP4) {
#if defined (CONFIG_RALINK_RT3883)
pci_status = RALINK_PCI_PCIINT_ADDR;
if (pci_status & 0x100000)
do_IRQ(SURFBOARDINT_PCIE0);
#if defined (CONFIG_PCI_ONLY) || defined (CONFIG_PCIE_PCI_CONCURRENT)
else if (pci_status & 0x040000)
do_IRQ(SURFBOARDINT_PCI0);
else
do_IRQ(SURFBOARDINT_PCI1);
#endif
#elif defined (CONFIG_RALINK_MT7620) || defined (CONFIG_RALINK_MT7628)
pci_status = RALINK_PCI_PCIINT_ADDR;
if (pci_status & 0x100000)
do_IRQ(SURFBOARDINT_PCIE0);
#endif
}
if (pending & CAUSEF_IP3)
ralink_hw0_irqdispatch(1);
else
if (pending & CAUSEF_IP2)
ralink_hw0_irqdispatch(0);
#if 0
/* clear new potentially pending IP6..IP2 */
set_c0_status( STATUSF_IP6 | STATUSF_IP5 | STATUSF_IP4 | STATUSF_IP3 | STATUSF_IP2 );
#endif
}
开发者ID:clockzhong,项目名称:RouterN56U,代码行数:54,代码来源:irq.c
示例10: mips_cpu_timer_enable
void mips_cpu_timer_enable(void)
{
uint32_t sr = read_c0_status();
sr |= ((0x1UL << 7) << 8);
write_c0_status(sr);
uint32_t cause = read_c0_cause();
cause &= ~(0x1UL << 27);
write_c0_cause(cause);
write_c0_compare(read_c0_count() + COUNTER_TICK_COUNT);
}
开发者ID:Archer-sys,项目名称:atomthreads,代码行数:11,代码来源:atomport-timer.c
示例11: plat_irq_dispatch
asmlinkage void plat_irq_dispatch(void)
{
unsigned int pending = read_c0_status() & read_c0_cause();
if (pending & STATUSF_IP4)
pic_dispatch();
else if (pending & STATUSF_IP7)
do_IRQ(PNX833X_TIMER_IRQ);
else
spurious_interrupt();
}
开发者ID:openube,项目名称:android_kernel_sony_c2305,代码行数:11,代码来源:interrupts.c
示例12: plat_time_init
void __init plat_time_init(void)
{
/* JU: TBD: there was some special SMP handling added here in original kernel */
mips_hpt_frequency = calculateCpuSpeed() / 2;
#if defined(CONFIG_BCM_PWRMNGT) || defined(CONFIG_BCM_PWRMNGT_MODULE)
BcmPwrMngtInitC0Speed();
#else
// Enable cp0 counter/compare interrupt only when not using power management
write_c0_status(IE_IRQ5 | read_c0_status());
#endif
}
开发者ID:tch-opensrc,项目名称:TC72XX_LxG1.0.10mp5_OpenSrc,代码行数:11,代码来源:setup.c
示例13: plat_irq_dispatch
asmlinkage void plat_irq_dispatch(struct pt_regs *regs)
{
u32 pending;
pending = read_c0_status() & read_c0_cause();
/*
* jump to the correct interrupt routine
* These are arranged in priority order and the timer
* comes first!
*/
#ifdef CONFIG_IRQ_MSP_CIC /* break out the CIC stuff for now */
if (pending & C_IRQ4) /* do the peripherals first, that's the timer */
msp_cic_irq_dispatch();
else if (pending & C_IRQ0)
do_IRQ(MSP_INT_MAC0);
else if (pending & C_IRQ1)
do_IRQ(MSP_INT_MAC1);
else if (pending & C_IRQ2)
do_IRQ(MSP_INT_USB);
else if (pending & C_IRQ3)
do_IRQ(MSP_INT_SAR);
else if (pending & C_IRQ5)
do_IRQ(MSP_INT_SEC);
#else
if (pending & C_IRQ5)
do_IRQ(MSP_INT_TIMER);
else if (pending & C_IRQ0)
do_IRQ(MSP_INT_MAC0);
else if (pending & C_IRQ1)
do_IRQ(MSP_INT_MAC1);
else if (pending & C_IRQ3)
do_IRQ(MSP_INT_VE);
else if (pending & C_IRQ4)
msp_slp_irq_dispatch();
#endif
else if (pending & C_SW0) /* do software after hardware */
do_IRQ(MSP_INT_SW0);
else if (pending & C_SW1)
do_IRQ(MSP_INT_SW1);
}
开发者ID:24hours,项目名称:linux,代码行数:54,代码来源:msp_irq.c
示例14: plat_irq_dispatch
asmlinkage void plat_irq_dispatch(struct pt_regs *regs)
{
unsigned int pending;
#ifdef CONFIG_SIBYTE_BCM1480_PROF
/* Set compare to count to silence count/compare timer interrupts */
write_c0_compare(read_c0_count());
#endif
pending = read_c0_cause() & read_c0_status();
#ifdef CONFIG_SIBYTE_BCM1480_PROF
if (pending & CAUSEF_IP7) /* Cpu performance counter interrupt */
sbprof_cpu_intr(exception_epc(regs));
else
#endif
if (pending & CAUSEF_IP4)
bcm1480_timer_interrupt(regs);
#ifdef CONFIG_SMP
else if (pending & CAUSEF_IP3)
bcm1480_mailbox_interrupt(regs);
#endif
#ifdef CONFIG_KGDB
else if (pending & CAUSEF_IP6)
bcm1480_kgdb_interrupt(regs); /* KGDB (uart 1) */
#endif
else if (pending & CAUSEF_IP2) {
unsigned long long mask_h, mask_l;
unsigned long base;
/*
* Default...we've hit an IP[2] interrupt, which means we've
* got to check the 1480 interrupt registers to figure out what
* to do. Need to detect which CPU we're on, now that
* smp_affinity is supported.
*/
base = A_BCM1480_IMR_MAPPER(smp_processor_id());
mask_h = __raw_readq(
IOADDR(base + R_BCM1480_IMR_INTERRUPT_STATUS_BASE_H));
mask_l = __raw_readq(
IOADDR(base + R_BCM1480_IMR_INTERRUPT_STATUS_BASE_L));
if (mask_h) {
if (mask_h ^ 1)
do_IRQ(fls64(mask_h) - 1, regs);
else
do_IRQ(63 + fls64(mask_l), regs);
}
}
}
开发者ID:Broadcom,项目名称:stblinux-2.6.18,代码行数:54,代码来源:irq.c
示例15: plat_irq_dispatch
/*
* IRQs on the SEAD board look basically are combined together on hardware
* interrupt 0 (MIPS IRQ 2)) like:
*
* MIPS IRQ Source
* -------- ------
* 0 Software (ignored)
* 1 Software (ignored)
* 2 UART0 (hw0)
* 3 UART1 (hw1)
* 4 Hardware (ignored)
* 5 Hardware (ignored)
* 6 Hardware (ignored)
* 7 R4k timer (what we use)
*
* We handle the IRQ according to _our_ priority which is:
*
* Highest ---- R4k Timer
* Lowest ---- Combined hardware interrupt
*
* then we just return, if multiple IRQs are pending then we will just take
* another exception, big deal.
*/
asmlinkage void plat_irq_dispatch(void)
{
unsigned int pending = read_c0_cause() & read_c0_status() & ST0_IM;
int irq;
irq = irq_ffs(pending);
if (irq >= 0)
do_IRQ(MIPSCPU_INT_BASE + irq);
else
spurious_interrupt(regs);
}
开发者ID:Voskrese,项目名称:mipsonqemu,代码行数:35,代码来源:sead_int.c
示例16: plat_irq_dispatch
asmlinkage void plat_irq_dispatch(void)
{
unsigned int pending = read_c0_status() & read_c0_cause() & ST0_IM;
unsigned int i;
if (pending & CAUSEF_IP7) {
do_IRQ(MIPS_CPU_TIMER_IRQ);
goto out;
} else {
for (i = 0; i < 5; i++) {
if (pending & (CAUSEF_IP2 << i)) {
ltq_hw_irqdispatch(i);
goto out;
}
}
}
pr_alert("Spurious IRQ: CAUSE=0x%08x\n", read_c0_status());
out:
return;
}
开发者ID:Blackburn29,项目名称:PsycoKernel,代码行数:21,代码来源:irq.c
示例17: octeon_crypto_disable
/**
* Disable access to Octeon's COP2 crypto hardware in the kernel.
* This must be called after an octeon_crypto_enable() before any
* context switch or return to userspace.
*
* @param state COP2 state to restore
* @param flags Return value from octeon_crypto_enable()
*/
void octeon_crypto_disable(struct octeon_cop2_state *state,
unsigned long crypto_flags)
{
unsigned long flags;
local_irq_save(flags);
if (crypto_flags & ST0_CU2)
octeon_cop2_restore(state);
else
write_c0_status(read_c0_status() & ~ST0_CU2);
local_irq_restore(flags);
}
开发者ID:garyvan,项目名称:openwrt-1.6,代码行数:20,代码来源:octeon-crypto.c
示例18: plat_irq_dispatch
asmlinkage void plat_irq_dispatch(struct pt_regs *regs)
{
unsigned int pending = read_c0_cause() & read_c0_status();
if (pending & STATUSF_IP7)
brcm_mips_int7_dispatch(regs);
else if (pending & STATUSF_IP2)
brcm_mips_int2_dispatch(regs);
else
spurious_interrupt(regs);
}
开发者ID:Broadcom,项目名称:stblinux-2.6.18,代码行数:12,代码来源:irq.c
示例19: plat_irq_dispatch
asmlinkage void plat_irq_dispatch(void)
{
unsigned long pending;
pending = read_c0_status() & read_c0_cause() & ST0_IM;
if (pending & STATUSF_IP7)
do_IRQ(ADM5120_IRQ_COUNTER);
else if (pending & STATUSF_IP2)
adm5120_intc_irq_dispatch();
else
spurious_interrupt();
}
开发者ID:020gzh,项目名称:openwrt-mirror,代码行数:13,代码来源:irq.c
示例20: plat_irq_dispatch
asmlinkage void plat_irq_dispatch(void)
{
unsigned int pending = read_c0_status() & read_c0_cause() & ST0_IM;
if (pending & STATUSF_IP7)
do_IRQ(WRPPMC_MIPS_TIMER_IRQ); /* CPU Compare/Count internal timer */
else if (pending & STATUSF_IP6)
do_IRQ(WRPPMC_UART16550_IRQ); /* UART 16550 port */
else if (pending & STATUSF_IP3)
do_IRQ(WRPPMC_PCI_INTA_IRQ); /* PCI INT_A */
else
spurious_interrupt();
}
开发者ID:3sOx,项目名称:asuswrt-merlin,代码行数:13,代码来源:irq.c
注:本文中的read_c0_status函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论