Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Linux/arch/csky/kernel/   (Open Source Betriebssystem Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 5 kB image not shown  

Quelle  traps.c   Sprache: C

 
// SPDX-License-Identifier: GPL-2.0
// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.

#include <linux/cpu.h>
#include <linux/sched.h>
#include <linux/signal.h>
#include <linux/kernel.h>
#include <linux/mm.h>
#include <linux/module.h>
#include <linux/user.h>
#include <linux/string.h>
#include <linux/linkage.h>
#include <linux/init.h>
#include <linux/ptrace.h>
#include <linux/kallsyms.h>
#include <linux/rtc.h>
#include <linux/uaccess.h>
#include <linux/kprobes.h>
#include <linux/kdebug.h>
#include <linux/sched/debug.h>

#include <asm/setup.h>
#include <asm/traps.h>
#include <asm/pgalloc.h>
#include <asm/siginfo.h>

#include <asm/mmu_context.h>

#ifdef CONFIG_CPU_HAS_FPU
#include <abi/fpu.h>
#endif

int show_unhandled_signals = 1;

/* Defined in entry.S */
asmlinkage void csky_trap(void);

asmlinkage void csky_systemcall(void);
asmlinkage void csky_cmpxchg(void);
asmlinkage void csky_get_tls(void);
asmlinkage void csky_irq(void);

asmlinkage void csky_pagefault(void);

/* Defined in head.S */
asmlinkage void _start_smp_secondary(void);

void __init pre_trap_init(void)
{
 int i;

 mtcr("vbr", vec_base);

 for (i = 1; i < 128; i++)
  VEC_INIT(i, csky_trap);
}

void __init trap_init(void)
{
 VEC_INIT(VEC_AUTOVEC, csky_irq);

 /* setup trap0 trap2 trap3 */
 VEC_INIT(VEC_TRAP0, csky_systemcall);
 VEC_INIT(VEC_TRAP2, csky_cmpxchg);
 VEC_INIT(VEC_TRAP3, csky_get_tls);

 /* setup MMU TLB exception */
 VEC_INIT(VEC_TLBINVALIDL, csky_pagefault);
 VEC_INIT(VEC_TLBINVALIDS, csky_pagefault);
 VEC_INIT(VEC_TLBMODIFIED, csky_pagefault);

#ifdef CONFIG_CPU_HAS_FPU
 init_fpu();
#endif

#ifdef CONFIG_SMP
 mtcr("cr<28, 0>", virt_to_phys(vec_base));

 VEC_INIT(VEC_RESET, (void *)virt_to_phys(_start_smp_secondary));
#endif
}

static DEFINE_SPINLOCK(die_lock);

void die(struct pt_regs *regs, const char *str)
{
 static int die_counter;
 int ret;

 oops_enter();

 spin_lock_irq(&die_lock);
 console_verbose();
 bust_spinlocks(1);

 pr_emerg("%s [#%d]\n", str, ++die_counter);
 print_modules();
 show_regs(regs);
 show_stack(current, (unsigned long *)regs->regs[4], KERN_INFO);

 ret = notify_die(DIE_OOPS, str, regs, 0, trap_no(regs), SIGSEGV);

 bust_spinlocks(0);
 add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
 spin_unlock_irq(&die_lock);
 oops_exit();

 if (in_interrupt())
  panic("Fatal exception in interrupt");
 if (panic_on_oops)
  panic("Fatal exception");
 if (ret != NOTIFY_STOP)
  make_task_dead(SIGSEGV);
}

void do_trap(struct pt_regs *regs, int signo, int code, unsigned long addr)
{
 struct task_struct *tsk = current;

 if (show_unhandled_signals && unhandled_signal(tsk, signo)
     && printk_ratelimit()) {
  pr_info("%s[%d]: unhandled signal %d code 0x%x at 0x%08lx",
   tsk->comm, task_pid_nr(tsk), signo, code, addr);
  print_vma_addr(KERN_CONT " in ", instruction_pointer(regs));
  pr_cont("\n");
  show_regs(regs);
 }

 force_sig_fault(signo, code, (void __user *)addr);
}

static void do_trap_error(struct pt_regs *regs, int signo, int code,
 unsigned long addr, const char *str)
{
 current->thread.trap_no = trap_no(regs);

 if (user_mode(regs)) {
  do_trap(regs, signo, code, addr);
 } else {
  if (!fixup_exception(regs))
   die(regs, str);
 }
}

#define DO_ERROR_INFO(name, signo, code, str)    \
asmlinkage __visible void name(struct pt_regs *regs)   \
{         \
 do_trap_error(regs, signo, code, regs->pc, "Oops - " str); \
}

DO_ERROR_INFO(do_trap_unknown,
 SIGILL, ILL_ILLTRP, "unknown exception");
DO_ERROR_INFO(do_trap_zdiv,
 SIGFPE, FPE_INTDIV, "error zero div exception");
DO_ERROR_INFO(do_trap_buserr,
 SIGSEGV, ILL_ILLADR, "error bus error exception");

asmlinkage void do_trap_misaligned(struct pt_regs *regs)
{
#ifdef CONFIG_CPU_NEED_SOFTALIGN
 csky_alignment(regs);
#else
 current->thread.trap_no = trap_no(regs);
 do_trap_error(regs, SIGBUS, BUS_ADRALN, regs->pc,
        "Oops - load/store address misaligned");
#endif
}

asmlinkage void do_trap_bkpt(struct pt_regs *regs)
{
#ifdef CONFIG_KPROBES
 if (kprobe_single_step_handler(regs))
  return;
#endif
#ifdef CONFIG_UPROBES
 if (uprobe_single_step_handler(regs))
  return;
#endif
 if (user_mode(regs)) {
  send_sig(SIGTRAP, current, 0);
  return;
 }

 do_trap_error(regs, SIGILL, ILL_ILLTRP, regs->pc,
        "Oops - illegal trap exception");
}

asmlinkage void do_trap_illinsn(struct pt_regs *regs)
{
 current->thread.trap_no = trap_no(regs);

#ifdef CONFIG_KPROBES
 if (kprobe_breakpoint_handler(regs))
  return;
#endif
#ifdef CONFIG_UPROBES
 if (uprobe_breakpoint_handler(regs))
  return;
#endif
#ifndef CONFIG_CPU_NO_USER_BKPT
 if (*(uint16_t *)instruction_pointer(regs) != USR_BKPT) {
  send_sig(SIGTRAP, current, 0);
  return;
 }
#endif

 do_trap_error(regs, SIGILL, ILL_ILLOPC, regs->pc,
        "Oops - illegal instruction exception");
}

asmlinkage void do_trap_fpe(struct pt_regs *regs)
{
#ifdef CONFIG_CPU_HAS_FPU
 return fpu_fpe(regs);
#else
 do_trap_error(regs, SIGILL, ILL_ILLOPC, regs->pc,
        "Oops - fpu instruction exception");
#endif
}

asmlinkage void do_trap_priv(struct pt_regs *regs)
{
#ifdef CONFIG_CPU_HAS_FPU
 if (user_mode(regs) && fpu_libc_helper(regs))
  return;
#endif
 do_trap_error(regs, SIGILL, ILL_PRVOPC, regs->pc,
        "Oops - illegal privileged exception");
}

asmlinkage void trap_c(struct pt_regs *regs)
{
 switch (trap_no(regs)) {
 case VEC_ZERODIV:
  do_trap_zdiv(regs);
  break;
 case VEC_TRACE:
  do_trap_bkpt(regs);
  break;
 case VEC_ILLEGAL:
  do_trap_illinsn(regs);
  break;
 case VEC_TRAP1:
 case VEC_BREAKPOINT:
  do_trap_bkpt(regs);
  break;
 case VEC_ACCESS:
  do_trap_buserr(regs);
  break;
 case VEC_ALIGN:
  do_trap_misaligned(regs);
  break;
 case VEC_FPE:
  do_trap_fpe(regs);
  break;
 case VEC_PRIV:
  do_trap_priv(regs);
  break;
 default:
  do_trap_unknown(regs);
  break;
 }
}

Messung V0.5
C=96 H=92 G=93

¤ Dauer der Verarbeitung: 0.4 Sekunden  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.