diff options
author | Jeff Garzik <jeff@garzik.org> | 2006-03-01 01:58:38 -0500 |
---|---|---|
committer | Jeff Garzik <jeff@garzik.org> | 2006-03-01 01:58:38 -0500 |
commit | 68727fed5469100bec0764207d7efb7a9ecdee29 (patch) | |
tree | 7afb58ab7665b90122d3b4505be5c6c9f8bade4b /arch/ia64/kernel | |
parent | dbfedbb98145375106cee7ec7269611d553819dc (diff) | |
parent | b5b9d6647c1cd5eee90b58941c55f874c2a7e707 (diff) |
Merge branch 'upstream-fixes'
Diffstat (limited to 'arch/ia64/kernel')
-rw-r--r-- | arch/ia64/kernel/fsys.S | 7 | ||||
-rw-r--r-- | arch/ia64/kernel/ivt.S | 1 | ||||
-rw-r--r-- | arch/ia64/kernel/unaligned.c | 33 |
3 files changed, 32 insertions, 9 deletions
diff --git a/arch/ia64/kernel/fsys.S b/arch/ia64/kernel/fsys.S index ac6055c83115..7a05b1cb2ad5 100644 --- a/arch/ia64/kernel/fsys.S +++ b/arch/ia64/kernel/fsys.S | |||
@@ -878,8 +878,7 @@ fsyscall_table: | |||
878 | data8 0 // timer_delete | 878 | data8 0 // timer_delete |
879 | data8 0 // clock_settime | 879 | data8 0 // clock_settime |
880 | data8 fsys_clock_gettime // clock_gettime | 880 | data8 fsys_clock_gettime // clock_gettime |
881 | #define __NR_syscall_last 1255 | ||
882 | 881 | ||
883 | .space 8*(NR_syscalls + 1024 - __NR_syscall_last), 0 | 882 | // fill in zeros for the remaining entries |
884 | 883 | .zero: | |
885 | .org fsyscall_table + 8*NR_syscalls // guard against failures to increase NR_syscalls | 884 | .space fsyscall_table + 8*NR_syscalls - .zero, 0 |
diff --git a/arch/ia64/kernel/ivt.S b/arch/ia64/kernel/ivt.S index 301f2e9d262e..9f80569a32b0 100644 --- a/arch/ia64/kernel/ivt.S +++ b/arch/ia64/kernel/ivt.S | |||
@@ -1362,7 +1362,6 @@ END(debug_vector) | |||
1362 | // 0x5a00 Entry 30 (size 16 bundles) Unaligned Reference (57) | 1362 | // 0x5a00 Entry 30 (size 16 bundles) Unaligned Reference (57) |
1363 | ENTRY(unaligned_access) | 1363 | ENTRY(unaligned_access) |
1364 | DBG_FAULT(30) | 1364 | DBG_FAULT(30) |
1365 | mov r16=cr.ipsr | ||
1366 | mov r31=pr // prepare to save predicates | 1365 | mov r31=pr // prepare to save predicates |
1367 | ;; | 1366 | ;; |
1368 | br.sptk.many dispatch_unaligned_handler | 1367 | br.sptk.many dispatch_unaligned_handler |
diff --git a/arch/ia64/kernel/unaligned.c b/arch/ia64/kernel/unaligned.c index f9e0ae936d1a..1e357550c776 100644 --- a/arch/ia64/kernel/unaligned.c +++ b/arch/ia64/kernel/unaligned.c | |||
@@ -24,7 +24,7 @@ | |||
24 | #include <asm/uaccess.h> | 24 | #include <asm/uaccess.h> |
25 | #include <asm/unaligned.h> | 25 | #include <asm/unaligned.h> |
26 | 26 | ||
27 | extern void die_if_kernel(char *str, struct pt_regs *regs, long err) __attribute__ ((noreturn)); | 27 | extern void die_if_kernel(char *str, struct pt_regs *regs, long err); |
28 | 28 | ||
29 | #undef DEBUG_UNALIGNED_TRAP | 29 | #undef DEBUG_UNALIGNED_TRAP |
30 | 30 | ||
@@ -53,6 +53,15 @@ dump (const char *str, void *vp, size_t len) | |||
53 | #define SIGN_EXT9 0xffffffffffffff00ul | 53 | #define SIGN_EXT9 0xffffffffffffff00ul |
54 | 54 | ||
55 | /* | 55 | /* |
56 | * sysctl settable hook which tells the kernel whether to honor the | ||
57 | * IA64_THREAD_UAC_NOPRINT prctl. Because this is user settable, we want | ||
58 | * to allow the super user to enable/disable this for security reasons | ||
59 | * (i.e. don't allow attacker to fill up logs with unaligned accesses). | ||
60 | */ | ||
61 | int no_unaligned_warning; | ||
62 | static int noprint_warning; | ||
63 | |||
64 | /* | ||
56 | * For M-unit: | 65 | * For M-unit: |
57 | * | 66 | * |
58 | * opcode | m | x6 | | 67 | * opcode | m | x6 | |
@@ -1324,8 +1333,9 @@ ia64_handle_unaligned (unsigned long ifa, struct pt_regs *regs) | |||
1324 | if ((current->thread.flags & IA64_THREAD_UAC_SIGBUS) != 0) | 1333 | if ((current->thread.flags & IA64_THREAD_UAC_SIGBUS) != 0) |
1325 | goto force_sigbus; | 1334 | goto force_sigbus; |
1326 | 1335 | ||
1327 | if (!(current->thread.flags & IA64_THREAD_UAC_NOPRINT) | 1336 | if (!no_unaligned_warning && |
1328 | && within_logging_rate_limit()) | 1337 | !(current->thread.flags & IA64_THREAD_UAC_NOPRINT) && |
1338 | within_logging_rate_limit()) | ||
1329 | { | 1339 | { |
1330 | char buf[200]; /* comm[] is at most 16 bytes... */ | 1340 | char buf[200]; /* comm[] is at most 16 bytes... */ |
1331 | size_t len; | 1341 | size_t len; |
@@ -1340,7 +1350,22 @@ ia64_handle_unaligned (unsigned long ifa, struct pt_regs *regs) | |||
1340 | if (user_mode(regs)) | 1350 | if (user_mode(regs)) |
1341 | tty_write_message(current->signal->tty, buf); | 1351 | tty_write_message(current->signal->tty, buf); |
1342 | buf[len-1] = '\0'; /* drop '\r' */ | 1352 | buf[len-1] = '\0'; /* drop '\r' */ |
1343 | printk(KERN_WARNING "%s", buf); /* watch for command names containing %s */ | 1353 | /* watch for command names containing %s */ |
1354 | printk(KERN_WARNING "%s", buf); | ||
1355 | } else { | ||
1356 | if (no_unaligned_warning && !noprint_warning) { | ||
1357 | noprint_warning = 1; | ||
1358 | printk(KERN_WARNING "%s(%d) encountered an " | ||
1359 | "unaligned exception which required\n" | ||
1360 | "kernel assistance, which degrades " | ||
1361 | "the performance of the application.\n" | ||
1362 | "Unaligned exception warnings have " | ||
1363 | "been disabled by the system " | ||
1364 | "administrator\n" | ||
1365 | "echo 0 > /proc/sys/kernel/ignore-" | ||
1366 | "unaligned-usertrap to re-enable\n", | ||
1367 | current->comm, current->pid); | ||
1368 | } | ||
1344 | } | 1369 | } |
1345 | } else { | 1370 | } else { |
1346 | if (within_logging_rate_limit()) | 1371 | if (within_logging_rate_limit()) |