Skip to content

Commit

Permalink
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel…
Browse files Browse the repository at this point in the history
…/git/kyle/parisc-2.6

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/kyle/parisc-2.6:
  parisc: use __ratelimit in unaligned.c
  parisc: Convert to read/update_persistent_clock
  parisc: Simplify param.h by including <asm-generic/param.h>
  parisc: drop unnecessary cast in __ldcw_align() macro
  parisc: add strict copy size checks (v2)
  parisc: remove trailing space in messages
  parisc: ditto sys_accept4
  parisc: wire up sys_recvmmsg
  • Loading branch information
Linus Torvalds committed Mar 7, 2010
2 parents 5980bb3 + 6ee7765 commit 2ddb3b1
Show file tree
Hide file tree
Showing 12 changed files with 69 additions and 57 deletions.
14 changes: 14 additions & 0 deletions arch/parisc/Kconfig.debug
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,18 @@ config DEBUG_RODATA
portion of the kernel code won't be covered by a TLB anymore.
If in doubt, say "N".

config DEBUG_STRICT_USER_COPY_CHECKS
bool "Strict copy size checks"
depends on DEBUG_KERNEL && !TRACE_BRANCH_PROFILING
---help---
Enabling this option turns a certain set of sanity checks for user
copy operations into compile time failures.

The copy_from_user() etc checks are there to help test if there
are sufficient security checks on the length argument of
the copy operation, by having gcc prove that the argument is
within bounds.

If unsure, or if you run an older (pre 4.4) gcc, say N.

endmenu
23 changes: 1 addition & 22 deletions arch/parisc/include/asm/param.h
Original file line number Diff line number Diff line change
@@ -1,22 +1 @@
#ifndef _ASMPARISC_PARAM_H
#define _ASMPARISC_PARAM_H

#ifdef __KERNEL__
#define HZ CONFIG_HZ
#define USER_HZ 100 /* some user API use "ticks" */
#define CLOCKS_PER_SEC (USER_HZ) /* like times() */
#endif

#ifndef HZ
#define HZ 100
#endif

#define EXEC_PAGESIZE 4096

#ifndef NOGROUP
#define NOGROUP (-1)
#endif

#define MAXHOSTNAMELEN 64 /* max length of hostname */

#endif
#include <asm-generic/param.h>
2 changes: 1 addition & 1 deletion arch/parisc/include/asm/system.h
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ static inline void set_eiem(unsigned long val)
ldcd). */

#define __PA_LDCW_ALIGNMENT 4
#define __ldcw_align(a) ((volatile unsigned int *)a)
#define __ldcw_align(a) (&(a)->slock)
#define __LDCW "ldcw,co"

#endif /*!CONFIG_PA20*/
Expand Down
27 changes: 25 additions & 2 deletions arch/parisc/include/asm/uaccess.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include <asm/page.h>
#include <asm/system.h>
#include <asm/cache.h>
#include <asm/errno.h>
#include <asm-generic/uaccess-unaligned.h>

#define VERIFY_READ 0
Expand Down Expand Up @@ -234,13 +235,35 @@ extern long lstrnlen_user(const char __user *,long);

unsigned long copy_to_user(void __user *dst, const void *src, unsigned long len);
#define __copy_to_user copy_to_user
unsigned long copy_from_user(void *dst, const void __user *src, unsigned long len);
#define __copy_from_user copy_from_user
unsigned long __copy_from_user(void *dst, const void __user *src, unsigned long len);
unsigned long copy_in_user(void __user *dst, const void __user *src, unsigned long len);
#define __copy_in_user copy_in_user
#define __copy_to_user_inatomic __copy_to_user
#define __copy_from_user_inatomic __copy_from_user

extern void copy_from_user_overflow(void)
#ifdef CONFIG_DEBUG_STRICT_USER_COPY_CHECKS
__compiletime_error("copy_from_user() buffer size is not provably correct")
#else
__compiletime_warning("copy_from_user() buffer size is not provably correct")
#endif
;

static inline unsigned long __must_check copy_from_user(void *to,
const void __user *from,
unsigned long n)
{
int sz = __compiletime_object_size(to);
int ret = -EFAULT;

if (likely(sz == -1 || !__builtin_constant_p(n) || sz >= n))
ret = __copy_from_user(to, from, n);
else
copy_from_user_overflow();

return ret;
}

struct pt_regs;
int fixup_exception(struct pt_regs *regs);

Expand Down
4 changes: 3 additions & 1 deletion arch/parisc/include/asm/unistd.h
Original file line number Diff line number Diff line change
Expand Up @@ -811,8 +811,10 @@
#define __NR_pwritev (__NR_Linux + 316)
#define __NR_rt_tgsigqueueinfo (__NR_Linux + 317)
#define __NR_perf_event_open (__NR_Linux + 318)
#define __NR_recvmmsg (__NR_Linux + 319)
#define __NR_accept4 (__NR_Linux + 320)

#define __NR_Linux_syscalls (__NR_perf_event_open + 1)
#define __NR_Linux_syscalls (__NR_accept4 + 1)


#define __IGNORE_select /* newselect */
Expand Down
4 changes: 2 additions & 2 deletions arch/parisc/kernel/cache.c
Original file line number Diff line number Diff line change
Expand Up @@ -171,14 +171,14 @@ parisc_cache_init(void)
cache_info.ic_conf.cc_cst,
cache_info.ic_conf.cc_hv);

printk("D-TLB conf: sh %d page %d cst %d aid %d pad1 %d \n",
printk("D-TLB conf: sh %d page %d cst %d aid %d pad1 %d\n",
cache_info.dt_conf.tc_sh,
cache_info.dt_conf.tc_page,
cache_info.dt_conf.tc_cst,
cache_info.dt_conf.tc_aid,
cache_info.dt_conf.tc_pad1);

printk("I-TLB conf: sh %d page %d cst %d aid %d pad1 %d \n",
printk("I-TLB conf: sh %d page %d cst %d aid %d pad1 %d\n",
cache_info.it_conf.tc_sh,
cache_info.it_conf.tc_page,
cache_info.it_conf.tc_cst,
Expand Down
2 changes: 2 additions & 0 deletions arch/parisc/kernel/syscall_table.S
Original file line number Diff line number Diff line change
Expand Up @@ -417,6 +417,8 @@
ENTRY_COMP(pwritev)
ENTRY_COMP(rt_tgsigqueueinfo)
ENTRY_SAME(perf_event_open)
ENTRY_COMP(recvmmsg)
ENTRY_SAME(accept4) /* 320 */

/* Nothing yet */

Expand Down
29 changes: 13 additions & 16 deletions arch/parisc/kernel/time.c
Original file line number Diff line number Diff line change
Expand Up @@ -250,9 +250,21 @@ static int __init rtc_init(void)
}
module_init(rtc_init);

void __init time_init(void)
void read_persistent_clock(struct timespec *ts)
{
static struct pdc_tod tod_data;
if (pdc_tod_read(&tod_data) == 0) {
ts->tv_sec = tod_data.tod_sec;
ts->tv_nsec = tod_data.tod_usec * 1000;
} else {
printk(KERN_ERR "Error reading tod clock\n");
ts->tv_sec = 0;
ts->tv_nsec = 0;
}
}

void __init time_init(void)
{
unsigned long current_cr16_khz;

clocktick = (100 * PAGE0->mem_10msec) / HZ;
Expand All @@ -264,19 +276,4 @@ void __init time_init(void)
clocksource_cr16.mult = clocksource_khz2mult(current_cr16_khz,
clocksource_cr16.shift);
clocksource_register(&clocksource_cr16);

if (pdc_tod_read(&tod_data) == 0) {
unsigned long flags;

write_seqlock_irqsave(&xtime_lock, flags);
xtime.tv_sec = tod_data.tod_sec;
xtime.tv_nsec = tod_data.tod_usec * 1000;
set_normalized_timespec(&wall_to_monotonic,
-xtime.tv_sec, -xtime.tv_nsec);
write_sequnlock_irqrestore(&xtime_lock, flags);
} else {
printk(KERN_ERR "Error reading tod clock\n");
xtime.tv_sec = 0;
xtime.tv_nsec = 0;
}
}
14 changes: 4 additions & 10 deletions arch/parisc/kernel/unaligned.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
#include <linux/module.h>
#include <linux/sched.h>
#include <linux/signal.h>
#include <linux/ratelimit.h>
#include <asm/uaccess.h>

/* #define DEBUG_UNALIGNED 1 */
Expand Down Expand Up @@ -446,8 +447,7 @@ static int emulate_std(struct pt_regs *regs, int frreg, int flop)

void handle_unaligned(struct pt_regs *regs)
{
static unsigned long unaligned_count = 0;
static unsigned long last_time = 0;
static DEFINE_RATELIMIT_STATE(ratelimit, 5 * HZ, 5);
unsigned long newbase = R1(regs->iir)?regs->gr[R1(regs->iir)]:0;
int modify = 0;
int ret = ERR_NOTHANDLED;
Expand All @@ -460,14 +460,8 @@ void handle_unaligned(struct pt_regs *regs)
goto force_sigbus;
}

if (unaligned_count > 5 &&
time_after(jiffies, last_time + 5 * HZ)) {
unaligned_count = 0;
last_time = jiffies;
}

if (!(current->thread.flags & PARISC_UAC_NOPRINT)
&& ++unaligned_count < 5) {
if (!(current->thread.flags & PARISC_UAC_NOPRINT) &&
__ratelimit(&ratelimit)) {
char buf[256];
sprintf(buf, "%s(%d): unaligned access to 0x" RFMT " at ip=0x" RFMT "\n",
current->comm, task_pid_nr(current), regs->ior, regs->iaoq[0]);
Expand Down
3 changes: 2 additions & 1 deletion arch/parisc/lib/memcpy.c
Original file line number Diff line number Diff line change
Expand Up @@ -475,7 +475,8 @@ unsigned long copy_to_user(void __user *dst, const void *src, unsigned long len)
return pa_memcpy((void __force *)dst, src, len);
}

unsigned long copy_from_user(void *dst, const void __user *src, unsigned long len)
EXPORT_SYMBOL(__copy_from_user);
unsigned long __copy_from_user(void *dst, const void __user *src, unsigned long len)
{
mtsp(get_user_space(), 1);
mtsp(get_kernel_space(), 2);
Expand Down
2 changes: 1 addition & 1 deletion drivers/parisc/eisa_enumerator.c
Original file line number Diff line number Diff line change
Expand Up @@ -460,7 +460,7 @@ static int init_slot(int slot, struct eeprom_eisa_slot_info *es)
slot, id_string);

print_eisa_id(id_string, es->eisa_slot_id);
printk(" expected %s \n", id_string);
printk(" expected %s\n", id_string);

return -1;

Expand Down
2 changes: 1 addition & 1 deletion drivers/parisc/superio.c
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ superio_init(struct pci_dev *pcidev)
/* ...then properly fixup the USB to point at suckyio PIC */
sio->usb_pdev->irq = superio_fixup_irq(sio->usb_pdev);

printk(KERN_INFO PFX "Found NS87560 Legacy I/O device at %s (IRQ %i) \n",
printk(KERN_INFO PFX "Found NS87560 Legacy I/O device at %s (IRQ %i)\n",
pci_name(pdev), pdev->irq);

pci_read_config_dword (pdev, SIO_SP1BAR, &sio->sp1_base);
Expand Down

0 comments on commit 2ddb3b1

Please sign in to comment.