Commit 2422084a authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mattst88/alpha-2.6

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mattst88/alpha-2.6:
  alpha: deal with multiple simultaneously pending signals
  alpha: fix a 14 years old bug in sigreturn tracing
  alpha: unb0rk sigsuspend() and rt_sigsuspend()
  alpha: belated ERESTART_RESTARTBLOCK race fix
  alpha: Shift perf event pending work earlier in timer interrupt
  alpha: wire up fanotify and prlimit64 syscalls
  alpha: kill big kernel lock
  alpha: fix build breakage in asm/cacheflush.h
  alpha: remove unnecessary cast from void* in assignment.
  alpha: Use static const char * const where possible
parents 81cef8e3 494486a1
...@@ -43,6 +43,8 @@ extern void smp_imb(void); ...@@ -43,6 +43,8 @@ extern void smp_imb(void);
/* ??? Ought to use this in arch/alpha/kernel/signal.c too. */ /* ??? Ought to use this in arch/alpha/kernel/signal.c too. */
#ifndef CONFIG_SMP #ifndef CONFIG_SMP
#include <linux/sched.h>
extern void __load_new_mm_context(struct mm_struct *); extern void __load_new_mm_context(struct mm_struct *);
static inline void static inline void
flush_icache_user_range(struct vm_area_struct *vma, struct page *page, flush_icache_user_range(struct vm_area_struct *vma, struct page *page,
......
...@@ -449,10 +449,13 @@ ...@@ -449,10 +449,13 @@
#define __NR_pwritev 491 #define __NR_pwritev 491
#define __NR_rt_tgsigqueueinfo 492 #define __NR_rt_tgsigqueueinfo 492
#define __NR_perf_event_open 493 #define __NR_perf_event_open 493
#define __NR_fanotify_init 494
#define __NR_fanotify_mark 495
#define __NR_prlimit64 496
#ifdef __KERNEL__ #ifdef __KERNEL__
#define NR_SYSCALLS 494 #define NR_SYSCALLS 497
#define __ARCH_WANT_IPC_PARSE_VERSION #define __ARCH_WANT_IPC_PARSE_VERSION
#define __ARCH_WANT_OLD_READDIR #define __ARCH_WANT_OLD_READDIR
...@@ -463,6 +466,7 @@ ...@@ -463,6 +466,7 @@
#define __ARCH_WANT_SYS_OLD_GETRLIMIT #define __ARCH_WANT_SYS_OLD_GETRLIMIT
#define __ARCH_WANT_SYS_OLDUMOUNT #define __ARCH_WANT_SYS_OLDUMOUNT
#define __ARCH_WANT_SYS_SIGPENDING #define __ARCH_WANT_SYS_SIGPENDING
#define __ARCH_WANT_SYS_RT_SIGSUSPEND
/* "Conditional" syscalls. What we want is /* "Conditional" syscalls. What we want is
......
...@@ -317,14 +317,14 @@ ret_from_sys_call: ...@@ -317,14 +317,14 @@ ret_from_sys_call:
ldq $0, SP_OFF($sp) ldq $0, SP_OFF($sp)
and $0, 8, $0 and $0, 8, $0
beq $0, restore_all beq $0, restore_all
ret_from_reschedule: ret_to_user:
/* Make sure need_resched and sigpending don't change between /* Make sure need_resched and sigpending don't change between
sampling and the rti. */ sampling and the rti. */
lda $16, 7 lda $16, 7
call_pal PAL_swpipl call_pal PAL_swpipl
ldl $5, TI_FLAGS($8) ldl $5, TI_FLAGS($8)
and $5, _TIF_WORK_MASK, $2 and $5, _TIF_WORK_MASK, $2
bne $5, work_pending bne $2, work_pending
restore_all: restore_all:
RESTORE_ALL RESTORE_ALL
call_pal PAL_rti call_pal PAL_rti
...@@ -363,7 +363,7 @@ $ret_success: ...@@ -363,7 +363,7 @@ $ret_success:
* $8: current. * $8: current.
* $19: The old syscall number, or zero if this is not a return * $19: The old syscall number, or zero if this is not a return
* from a syscall that errored and is possibly restartable. * from a syscall that errored and is possibly restartable.
* $20: Error indication. * $20: The old a3 value
*/ */
.align 4 .align 4
...@@ -392,12 +392,18 @@ $work_resched: ...@@ -392,12 +392,18 @@ $work_resched:
$work_notifysig: $work_notifysig:
mov $sp, $16 mov $sp, $16
br $1, do_switch_stack bsr $1, do_switch_stack
mov $sp, $17 mov $sp, $17
mov $5, $18 mov $5, $18
mov $19, $9 /* save old syscall number */
mov $20, $10 /* save old a3 */
and $5, _TIF_SIGPENDING, $2
cmovne $2, 0, $9 /* we don't want double syscall restarts */
jsr $26, do_notify_resume jsr $26, do_notify_resume
mov $9, $19
mov $10, $20
bsr $1, undo_switch_stack bsr $1, undo_switch_stack
br restore_all br ret_to_user
.end work_pending .end work_pending
/* /*
...@@ -430,6 +436,7 @@ strace: ...@@ -430,6 +436,7 @@ strace:
beq $1, 1f beq $1, 1f
ldq $27, 0($2) ldq $27, 0($2)
1: jsr $26, ($27), sys_gettimeofday 1: jsr $26, ($27), sys_gettimeofday
ret_from_straced:
ldgp $gp, 0($26) ldgp $gp, 0($26)
/* check return.. */ /* check return.. */
...@@ -757,11 +764,15 @@ sys_vfork: ...@@ -757,11 +764,15 @@ sys_vfork:
.ent sys_sigreturn .ent sys_sigreturn
sys_sigreturn: sys_sigreturn:
.prologue 0 .prologue 0
lda $9, ret_from_straced
cmpult $26, $9, $9
mov $sp, $17 mov $sp, $17
lda $18, -SWITCH_STACK_SIZE($sp) lda $18, -SWITCH_STACK_SIZE($sp)
lda $sp, -SWITCH_STACK_SIZE($sp) lda $sp, -SWITCH_STACK_SIZE($sp)
jsr $26, do_sigreturn jsr $26, do_sigreturn
br $1, undo_switch_stack bne $9, 1f
jsr $26, syscall_trace
1: br $1, undo_switch_stack
br ret_from_sys_call br ret_from_sys_call
.end sys_sigreturn .end sys_sigreturn
...@@ -770,46 +781,18 @@ sys_sigreturn: ...@@ -770,46 +781,18 @@ sys_sigreturn:
.ent sys_rt_sigreturn .ent sys_rt_sigreturn
sys_rt_sigreturn: sys_rt_sigreturn:
.prologue 0 .prologue 0
lda $9, ret_from_straced
cmpult $26, $9, $9
mov $sp, $17 mov $sp, $17
lda $18, -SWITCH_STACK_SIZE($sp) lda $18, -SWITCH_STACK_SIZE($sp)
lda $sp, -SWITCH_STACK_SIZE($sp) lda $sp, -SWITCH_STACK_SIZE($sp)
jsr $26, do_rt_sigreturn jsr $26, do_rt_sigreturn
br $1, undo_switch_stack bne $9, 1f
jsr $26, syscall_trace
1: br $1, undo_switch_stack
br ret_from_sys_call br ret_from_sys_call
.end sys_rt_sigreturn .end sys_rt_sigreturn
.align 4
.globl sys_sigsuspend
.ent sys_sigsuspend
sys_sigsuspend:
.prologue 0
mov $sp, $17
br $1, do_switch_stack
mov $sp, $18
subq $sp, 16, $sp
stq $26, 0($sp)
jsr $26, do_sigsuspend
ldq $26, 0($sp)
lda $sp, SWITCH_STACK_SIZE+16($sp)
ret
.end sys_sigsuspend
.align 4
.globl sys_rt_sigsuspend
.ent sys_rt_sigsuspend
sys_rt_sigsuspend:
.prologue 0
mov $sp, $18
br $1, do_switch_stack
mov $sp, $19
subq $sp, 16, $sp
stq $26, 0($sp)
jsr $26, do_rt_sigsuspend
ldq $26, 0($sp)
lda $sp, SWITCH_STACK_SIZE+16($sp)
ret
.end sys_rt_sigsuspend
.align 4 .align 4
.globl sys_sethae .globl sys_sethae
.ent sys_sethae .ent sys_sethae
......
...@@ -90,11 +90,13 @@ static int ...@@ -90,11 +90,13 @@ static int
ev6_parse_cbox(u64 c_addr, u64 c1_syn, u64 c2_syn, ev6_parse_cbox(u64 c_addr, u64 c1_syn, u64 c2_syn,
u64 c_stat, u64 c_sts, int print) u64 c_stat, u64 c_sts, int print)
{ {
char *sourcename[] = { "UNKNOWN", "UNKNOWN", "UNKNOWN", static const char * const sourcename[] = {
"UNKNOWN", "UNKNOWN", "UNKNOWN",
"MEMORY", "BCACHE", "DCACHE", "MEMORY", "BCACHE", "DCACHE",
"BCACHE PROBE", "BCACHE PROBE" }; "BCACHE PROBE", "BCACHE PROBE"
char *streamname[] = { "D", "I" }; };
char *bitsname[] = { "SINGLE", "DOUBLE" }; static const char * const streamname[] = { "D", "I" };
static const char * const bitsname[] = { "SINGLE", "DOUBLE" };
int status = MCHK_DISPOSITION_REPORT; int status = MCHK_DISPOSITION_REPORT;
int source = -1, stream = -1, bits = -1; int source = -1, stream = -1, bits = -1;
......
...@@ -589,7 +589,8 @@ marvel_print_pox_spl_cmplt(u64 spl_cmplt) ...@@ -589,7 +589,8 @@ marvel_print_pox_spl_cmplt(u64 spl_cmplt)
static void static void
marvel_print_pox_trans_sum(u64 trans_sum) marvel_print_pox_trans_sum(u64 trans_sum)
{ {
char *pcix_cmd[] = { "Interrupt Acknowledge", static const char * const pcix_cmd[] = {
"Interrupt Acknowledge",
"Special Cycle", "Special Cycle",
"I/O Read", "I/O Read",
"I/O Write", "I/O Write",
......
...@@ -75,8 +75,12 @@ titan_parse_p_serror(int which, u64 serror, int print) ...@@ -75,8 +75,12 @@ titan_parse_p_serror(int which, u64 serror, int print)
int status = MCHK_DISPOSITION_REPORT; int status = MCHK_DISPOSITION_REPORT;
#ifdef CONFIG_VERBOSE_MCHECK #ifdef CONFIG_VERBOSE_MCHECK
char *serror_src[] = {"GPCI", "APCI", "AGP HP", "AGP LP"}; static const char * const serror_src[] = {
char *serror_cmd[] = {"DMA Read", "DMA RMW", "SGTE Read", "Reserved"}; "GPCI", "APCI", "AGP HP", "AGP LP"
};
static const char * const serror_cmd[] = {
"DMA Read", "DMA RMW", "SGTE Read", "Reserved"
};
#endif /* CONFIG_VERBOSE_MCHECK */ #endif /* CONFIG_VERBOSE_MCHECK */
#define TITAN__PCHIP_SERROR__LOST_UECC (1UL << 0) #define TITAN__PCHIP_SERROR__LOST_UECC (1UL << 0)
...@@ -140,14 +144,15 @@ titan_parse_p_perror(int which, int port, u64 perror, int print) ...@@ -140,14 +144,15 @@ titan_parse_p_perror(int which, int port, u64 perror, int print)
int status = MCHK_DISPOSITION_REPORT; int status = MCHK_DISPOSITION_REPORT;
#ifdef CONFIG_VERBOSE_MCHECK #ifdef CONFIG_VERBOSE_MCHECK
char *perror_cmd[] = { "Interrupt Acknowledge", "Special Cycle", static const char * const perror_cmd[] = {
"Interrupt Acknowledge", "Special Cycle",
"I/O Read", "I/O Write", "I/O Read", "I/O Write",
"Reserved", "Reserved", "Reserved", "Reserved",
"Memory Read", "Memory Write", "Memory Read", "Memory Write",
"Reserved", "Reserved", "Reserved", "Reserved",
"Configuration Read", "Configuration Write", "Configuration Read", "Configuration Write",
"Memory Read Multiple", "Dual Address Cycle", "Memory Read Multiple", "Dual Address Cycle",
"Memory Read Line","Memory Write and Invalidate" "Memory Read Line", "Memory Write and Invalidate"
}; };
#endif /* CONFIG_VERBOSE_MCHECK */ #endif /* CONFIG_VERBOSE_MCHECK */
...@@ -273,9 +278,9 @@ titan_parse_p_agperror(int which, u64 agperror, int print) ...@@ -273,9 +278,9 @@ titan_parse_p_agperror(int which, u64 agperror, int print)
int cmd, len; int cmd, len;
unsigned long addr; unsigned long addr;
char *agperror_cmd[] = { "Read (low-priority)", "Read (high-priority)", static const char * const agperror_cmd[] = {
"Write (low-priority)", "Read (low-priority)", "Read (high-priority)",
"Write (high-priority)", "Write (low-priority)", "Write (high-priority)",
"Reserved", "Reserved", "Reserved", "Reserved",
"Flush", "Fence" "Flush", "Fence"
}; };
......
...@@ -15,7 +15,6 @@ ...@@ -15,7 +15,6 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/smp.h> #include <linux/smp.h>
#include <linux/smp_lock.h>
#include <linux/stddef.h> #include <linux/stddef.h>
#include <linux/syscalls.h> #include <linux/syscalls.h>
#include <linux/unistd.h> #include <linux/unistd.h>
...@@ -69,7 +68,6 @@ SYSCALL_DEFINE4(osf_set_program_attributes, unsigned long, text_start, ...@@ -69,7 +68,6 @@ SYSCALL_DEFINE4(osf_set_program_attributes, unsigned long, text_start,
{ {
struct mm_struct *mm; struct mm_struct *mm;
lock_kernel();
mm = current->mm; mm = current->mm;
mm->end_code = bss_start + bss_len; mm->end_code = bss_start + bss_len;
mm->start_brk = bss_start + bss_len; mm->start_brk = bss_start + bss_len;
...@@ -78,7 +76,6 @@ SYSCALL_DEFINE4(osf_set_program_attributes, unsigned long, text_start, ...@@ -78,7 +76,6 @@ SYSCALL_DEFINE4(osf_set_program_attributes, unsigned long, text_start,
printk("set_program_attributes(%lx %lx %lx %lx)\n", printk("set_program_attributes(%lx %lx %lx %lx)\n",
text_start, text_len, bss_start, bss_len); text_start, text_len, bss_start, bss_len);
#endif #endif
unlock_kernel();
return 0; return 0;
} }
...@@ -517,7 +514,6 @@ SYSCALL_DEFINE2(osf_proplist_syscall, enum pl_code, code, ...@@ -517,7 +514,6 @@ SYSCALL_DEFINE2(osf_proplist_syscall, enum pl_code, code,
long error; long error;
int __user *min_buf_size_ptr; int __user *min_buf_size_ptr;
lock_kernel();
switch (code) { switch (code) {
case PL_SET: case PL_SET:
if (get_user(error, &args->set.nbytes)) if (get_user(error, &args->set.nbytes))
...@@ -547,7 +543,6 @@ SYSCALL_DEFINE2(osf_proplist_syscall, enum pl_code, code, ...@@ -547,7 +543,6 @@ SYSCALL_DEFINE2(osf_proplist_syscall, enum pl_code, code,
error = -EOPNOTSUPP; error = -EOPNOTSUPP;
break; break;
}; };
unlock_kernel();
return error; return error;
} }
...@@ -594,7 +589,7 @@ SYSCALL_DEFINE2(osf_sigstack, struct sigstack __user *, uss, ...@@ -594,7 +589,7 @@ SYSCALL_DEFINE2(osf_sigstack, struct sigstack __user *, uss,
SYSCALL_DEFINE3(osf_sysinfo, int, command, char __user *, buf, long, count) SYSCALL_DEFINE3(osf_sysinfo, int, command, char __user *, buf, long, count)
{ {
char *sysinfo_table[] = { const char *sysinfo_table[] = {
utsname()->sysname, utsname()->sysname,
utsname()->nodename, utsname()->nodename,
utsname()->release, utsname()->release,
...@@ -606,7 +601,7 @@ SYSCALL_DEFINE3(osf_sysinfo, int, command, char __user *, buf, long, count) ...@@ -606,7 +601,7 @@ SYSCALL_DEFINE3(osf_sysinfo, int, command, char __user *, buf, long, count)
"dummy", /* secure RPC domain */ "dummy", /* secure RPC domain */
}; };
unsigned long offset; unsigned long offset;
char *res; const char *res;
long len, err = -EINVAL; long len, err = -EINVAL;
offset = command-1; offset = command-1;
......
...@@ -66,7 +66,7 @@ static int pci_mmap_resource(struct kobject *kobj, ...@@ -66,7 +66,7 @@ static int pci_mmap_resource(struct kobject *kobj,
{ {
struct pci_dev *pdev = to_pci_dev(container_of(kobj, struct pci_dev *pdev = to_pci_dev(container_of(kobj,
struct device, kobj)); struct device, kobj));
struct resource *res = (struct resource *)attr->private; struct resource *res = attr->private;
enum pci_mmap_state mmap_type; enum pci_mmap_state mmap_type;
struct pci_bus_region bar; struct pci_bus_region bar;
int i; int i;
......
...@@ -144,8 +144,7 @@ SYSCALL_DEFINE5(rt_sigaction, int, sig, const struct sigaction __user *, act, ...@@ -144,8 +144,7 @@ SYSCALL_DEFINE5(rt_sigaction, int, sig, const struct sigaction __user *, act,
/* /*
* Atomically swap in the new signal mask, and wait for a signal. * Atomically swap in the new signal mask, and wait for a signal.
*/ */
asmlinkage int SYSCALL_DEFINE1(sigsuspend, old_sigset_t, mask)
do_sigsuspend(old_sigset_t mask, struct pt_regs *regs, struct switch_stack *sw)
{ {
mask &= _BLOCKABLE; mask &= _BLOCKABLE;
spin_lock_irq(&current->sighand->siglock); spin_lock_irq(&current->sighand->siglock);
...@@ -154,41 +153,6 @@ do_sigsuspend(old_sigset_t mask, struct pt_regs *regs, struct switch_stack *sw) ...@@ -154,41 +153,6 @@ do_sigsuspend(old_sigset_t mask, struct pt_regs *regs, struct switch_stack *sw)
recalc_sigpending(); recalc_sigpending();
spin_unlock_irq(&current->sighand->siglock); spin_unlock_irq(&current->sighand->siglock);
/* Indicate EINTR on return from any possible signal handler,
which will not come back through here, but via sigreturn. */
regs->r0 = EINTR;
regs->r19 = 1;
current->state = TASK_INTERRUPTIBLE;
schedule();
set_thread_flag(TIF_RESTORE_SIGMASK);
return -ERESTARTNOHAND;
}
asmlinkage int
do_rt_sigsuspend(sigset_t __user *uset, size_t sigsetsize,
struct pt_regs *regs, struct switch_stack *sw)
{
sigset_t set;
/* XXX: Don't preclude handling different sized sigset_t's. */
if (sigsetsize != sizeof(sigset_t))
return -EINVAL;
if (copy_from_user(&set, uset, sizeof(set)))
return -EFAULT;
sigdelsetmask(&set, ~_BLOCKABLE);
spin_lock_irq(&current->sighand->siglock);
current->saved_sigmask = current->blocked;
current->blocked = set;
recalc_sigpending();
spin_unlock_irq(&current->sighand->siglock);
/* Indicate EINTR on return from any possible signal handler,
which will not come back through here, but via sigreturn. */
regs->r0 = EINTR;
regs->r19 = 1;
current->state = TASK_INTERRUPTIBLE; current->state = TASK_INTERRUPTIBLE;
schedule(); schedule();
set_thread_flag(TIF_RESTORE_SIGMASK); set_thread_flag(TIF_RESTORE_SIGMASK);
...@@ -239,6 +203,8 @@ restore_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs, ...@@ -239,6 +203,8 @@ restore_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,
unsigned long usp; unsigned long usp;
long i, err = __get_user(regs->pc, &sc->sc_pc); long i, err = __get_user(regs->pc, &sc->sc_pc);
current_thread_info()->restart_block.fn = do_no_restart_syscall;
sw->r26 = (unsigned long) ret_from_sys_call; sw->r26 = (unsigned long) ret_from_sys_call;
err |= __get_user(regs->r0, sc->sc_regs+0); err |= __get_user(regs->r0, sc->sc_regs+0);
...@@ -591,7 +557,6 @@ syscall_restart(unsigned long r0, unsigned long r19, ...@@ -591,7 +557,6 @@ syscall_restart(unsigned long r0, unsigned long r19,
regs->pc -= 4; regs->pc -= 4;
break; break;
case ERESTART_RESTARTBLOCK: case ERESTART_RESTARTBLOCK:
current_thread_info()->restart_block.fn = do_no_restart_syscall;
regs->r0 = EINTR; regs->r0 = EINTR;
break; break;
} }
......
...@@ -87,7 +87,7 @@ static int srm_env_proc_show(struct seq_file *m, void *v) ...@@ -87,7 +87,7 @@ static int srm_env_proc_show(struct seq_file *m, void *v)
srm_env_t *entry; srm_env_t *entry;
char *page; char *page;
entry = (srm_env_t *)m->private; entry = m->private;
page = (char *)__get_free_page(GFP_USER); page = (char *)__get_free_page(GFP_USER);
if (!page) if (!page)
return -ENOMEM; return -ENOMEM;
......
...@@ -512,6 +512,9 @@ sys_call_table: ...@@ -512,6 +512,9 @@ sys_call_table:
.quad sys_pwritev .quad sys_pwritev
.quad sys_rt_tgsigqueueinfo .quad sys_rt_tgsigqueueinfo
.quad sys_perf_event_open .quad sys_perf_event_open
.quad sys_fanotify_init
.quad sys_fanotify_mark /* 495 */
.quad sys_prlimit64
.size sys_call_table, . - sys_call_table .size sys_call_table, . - sys_call_table
.type sys_call_table, @object .type sys_call_table, @object
......
...@@ -191,16 +191,16 @@ irqreturn_t timer_interrupt(int irq, void *dev) ...@@ -191,16 +191,16 @@ irqreturn_t timer_interrupt(int irq, void *dev)
write_sequnlock(&xtime_lock); write_sequnlock(&xtime_lock);
#ifndef CONFIG_SMP
while (nticks--)
update_process_times(user_mode(get_irq_regs()));
#endif
if (test_perf_event_pending()) { if (test_perf_event_pending()) {
clear_perf_event_pending(); clear_perf_event_pending();
perf_event_do_pending(); perf_event_do_pending();
} }
#ifndef CONFIG_SMP
while (nticks--)
update_process_times(user_mode(get_irq_regs()));
#endif
return IRQ_HANDLED; return IRQ_HANDLED;
} }
......
...@@ -13,7 +13,6 @@ ...@@ -13,7 +13,6 @@
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/tty.h> #include <linux/tty.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/smp_lock.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/kallsyms.h> #include <linux/kallsyms.h>
...@@ -623,7 +622,6 @@ do_entUna(void * va, unsigned long opcode, unsigned long reg, ...@@ -623,7 +622,6 @@ do_entUna(void * va, unsigned long opcode, unsigned long reg,
return; return;
} }
lock_kernel();
printk("Bad unaligned kernel access at %016lx: %p %lx %lu\n", printk("Bad unaligned kernel access at %016lx: %p %lx %lu\n",
pc, va, opcode, reg); pc, va, opcode, reg);
do_exit(SIGSEGV); do_exit(SIGSEGV);
...@@ -646,7 +644,6 @@ do_entUna(void * va, unsigned long opcode, unsigned long reg, ...@@ -646,7 +644,6 @@ do_entUna(void * va, unsigned long opcode, unsigned long reg,
* Yikes! No one to forward the exception to. * Yikes! No one to forward the exception to.
* Since the registers are in a weird format, dump them ourselves. * Since the registers are in a weird format, dump them ourselves.
*/ */
lock_kernel();
printk("%s(%d): unhandled unaligned exception\n", printk("%s(%d): unhandled unaligned exception\n",
current->comm, task_pid_nr(current)); current->comm, task_pid_nr(current));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment