Commit ade275c4 authored by Steve French's avatar Steve French

Merge branch 'master' of /pub/scm/linux/kernel/git/torvalds/linux-2.6

parents 5f65f150 508ff9d4
...@@ -182,6 +182,39 @@ extern long __user_bad(void); ...@@ -182,6 +182,39 @@ extern long __user_bad(void);
* Returns zero on success, or -EFAULT on error. * Returns zero on success, or -EFAULT on error.
* On error, the variable @x is set to zero. * On error, the variable @x is set to zero.
*/ */
#define get_user(x, ptr) \
__get_user_check((x), (ptr), sizeof(*(ptr)))
#define __get_user_check(x, ptr, size) \
({ \
unsigned long __gu_val = 0; \
const typeof(*(ptr)) __user *__gu_addr = (ptr); \
int __gu_err = 0; \
\
if (access_ok(VERIFY_READ, __gu_addr, size)) { \
switch (size) { \
case 1: \
__get_user_asm("lbu", __gu_addr, __gu_val, \
__gu_err); \
break; \
case 2: \
__get_user_asm("lhu", __gu_addr, __gu_val, \
__gu_err); \
break; \
case 4: \
__get_user_asm("lw", __gu_addr, __gu_val, \
__gu_err); \
break; \
default: \
__gu_err = __user_bad(); \
break; \
} \
} else { \
__gu_err = -EFAULT; \
} \
x = (typeof(*(ptr)))__gu_val; \
__gu_err; \
})
#define __get_user(x, ptr) \ #define __get_user(x, ptr) \
({ \ ({ \
...@@ -206,12 +239,6 @@ extern long __user_bad(void); ...@@ -206,12 +239,6 @@ extern long __user_bad(void);
}) })
#define get_user(x, ptr) \
({ \
access_ok(VERIFY_READ, (ptr), sizeof(*(ptr))) \
? __get_user((x), (ptr)) : -EFAULT; \
})
#define __put_user_asm(insn, __gu_ptr, __gu_val, __gu_err) \ #define __put_user_asm(insn, __gu_ptr, __gu_val, __gu_err) \
({ \ ({ \
__asm__ __volatile__ ( \ __asm__ __volatile__ ( \
...@@ -266,6 +293,42 @@ extern long __user_bad(void); ...@@ -266,6 +293,42 @@ extern long __user_bad(void);
* *
* Returns zero on success, or -EFAULT on error. * Returns zero on success, or -EFAULT on error.
*/ */
#define put_user(x, ptr) \
__put_user_check((x), (ptr), sizeof(*(ptr)))
#define __put_user_check(x, ptr, size) \
({ \
typeof(*(ptr)) __pu_val; \
typeof(*(ptr)) __user *__pu_addr = (ptr); \
int __pu_err = 0; \
\
__pu_val = (x); \
if (access_ok(VERIFY_WRITE, __pu_addr, size)) { \
switch (size) { \
case 1: \
__put_user_asm("sb", __pu_addr, __pu_val, \
__pu_err); \
break; \
case 2: \
__put_user_asm("sh", __pu_addr, __pu_val, \
__pu_err); \
break; \
case 4: \
__put_user_asm("sw", __pu_addr, __pu_val, \
__pu_err); \
break; \
case 8: \
__put_user_asm_8(__pu_addr, __pu_val, __pu_err);\
break; \
default: \
__pu_err = __user_bad(); \
break; \
} \
} else { \
__pu_err = -EFAULT; \
} \
__pu_err; \
})
#define __put_user(x, ptr) \ #define __put_user(x, ptr) \
({ \ ({ \
...@@ -290,18 +353,6 @@ extern long __user_bad(void); ...@@ -290,18 +353,6 @@ extern long __user_bad(void);
__gu_err; \ __gu_err; \
}) })
#ifndef CONFIG_MMU
#define put_user(x, ptr) __put_user((x), (ptr))
#else /* CONFIG_MMU */
#define put_user(x, ptr) \
({ \
access_ok(VERIFY_WRITE, (ptr), sizeof(*(ptr))) \
? __put_user((x), (ptr)) : -EFAULT; \
})
#endif /* CONFIG_MMU */
/* copy_to_from_user */ /* copy_to_from_user */
#define __copy_from_user(to, from, n) \ #define __copy_from_user(to, from, n) \
......
...@@ -137,8 +137,9 @@ do { \ ...@@ -137,8 +137,9 @@ do { \
do { \ do { \
int step = -line_length; \ int step = -line_length; \
int align = ~(line_length - 1); \ int align = ~(line_length - 1); \
int count; \
end = ((end & align) == end) ? end - line_length : end & align; \ end = ((end & align) == end) ? end - line_length : end & align; \
int count = end - start; \ count = end - start; \
WARN_ON(count < 0); \ WARN_ON(count < 0); \
\ \
__asm__ __volatile__ (" 1: " #op " %0, %1; \ __asm__ __volatile__ (" 1: " #op " %0, %1; \
......
...@@ -476,6 +476,8 @@ ENTRY(ret_from_fork) ...@@ -476,6 +476,8 @@ ENTRY(ret_from_fork)
nop nop
work_pending: work_pending:
enable_irq
andi r11, r19, _TIF_NEED_RESCHED andi r11, r19, _TIF_NEED_RESCHED
beqi r11, 1f beqi r11, 1f
bralid r15, schedule bralid r15, schedule
......
...@@ -52,3 +52,14 @@ EXPORT_SYMBOL_GPL(_ebss); ...@@ -52,3 +52,14 @@ EXPORT_SYMBOL_GPL(_ebss);
extern void _mcount(void); extern void _mcount(void);
EXPORT_SYMBOL(_mcount); EXPORT_SYMBOL(_mcount);
#endif #endif
/*
* Assembly functions that may be used (directly or indirectly) by modules
*/
EXPORT_SYMBOL(__copy_tofrom_user);
EXPORT_SYMBOL(__strncpy_user);
#ifdef CONFIG_OPT_LIB_ASM
EXPORT_SYMBOL(memcpy);
EXPORT_SYMBOL(memmove);
#endif
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include <linux/string.h> #include <linux/string.h>
#include <asm/pgtable.h> #include <asm/pgtable.h>
#include <asm/cacheflush.h>
void *module_alloc(unsigned long size) void *module_alloc(unsigned long size)
{ {
...@@ -151,6 +152,7 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab, ...@@ -151,6 +152,7 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab,
int module_finalize(const Elf32_Ehdr *hdr, const Elf_Shdr *sechdrs, int module_finalize(const Elf32_Ehdr *hdr, const Elf_Shdr *sechdrs,
struct module *module) struct module *module)
{ {
flush_dcache();
return 0; return 0;
} }
......
...@@ -47,6 +47,7 @@ unsigned long memory_start; ...@@ -47,6 +47,7 @@ unsigned long memory_start;
EXPORT_SYMBOL(memory_start); EXPORT_SYMBOL(memory_start);
unsigned long memory_end; /* due to mm/nommu.c */ unsigned long memory_end; /* due to mm/nommu.c */
unsigned long memory_size; unsigned long memory_size;
EXPORT_SYMBOL(memory_size);
/* /*
* paging_init() sets up the page tables - in fact we've already done this. * paging_init() sets up the page tables - in fact we've already done this.
......
...@@ -42,6 +42,7 @@ ...@@ -42,6 +42,7 @@
unsigned long ioremap_base; unsigned long ioremap_base;
unsigned long ioremap_bot; unsigned long ioremap_bot;
EXPORT_SYMBOL(ioremap_bot);
/* The maximum lowmem defaults to 768Mb, but this can be configured to /* The maximum lowmem defaults to 768Mb, but this can be configured to
* another value. * another value.
......
...@@ -1507,7 +1507,7 @@ void pcibios_finish_adding_to_bus(struct pci_bus *bus) ...@@ -1507,7 +1507,7 @@ void pcibios_finish_adding_to_bus(struct pci_bus *bus)
pci_bus_add_devices(bus); pci_bus_add_devices(bus);
/* Fixup EEH */ /* Fixup EEH */
eeh_add_device_tree_late(bus); /* eeh_add_device_tree_late(bus); */
} }
EXPORT_SYMBOL_GPL(pcibios_finish_adding_to_bus); EXPORT_SYMBOL_GPL(pcibios_finish_adding_to_bus);
......
...@@ -1035,7 +1035,12 @@ int vhost_add_used(struct vhost_virtqueue *vq, unsigned int head, int len) ...@@ -1035,7 +1035,12 @@ int vhost_add_used(struct vhost_virtqueue *vq, unsigned int head, int len)
/* This actually signals the guest, using eventfd. */ /* This actually signals the guest, using eventfd. */
void vhost_signal(struct vhost_dev *dev, struct vhost_virtqueue *vq) void vhost_signal(struct vhost_dev *dev, struct vhost_virtqueue *vq)
{ {
__u16 flags = 0; __u16 flags;
/* Flush out used index updates. This is paired
* with the barrier that the Guest executes when enabling
* interrupts. */
smp_mb();
if (get_user(flags, &vq->avail->flags)) { if (get_user(flags, &vq->avail->flags)) {
vq_err(vq, "Failed to get flags"); vq_err(vq, "Failed to get flags");
return; return;
......
...@@ -33,7 +33,7 @@ int mmap_min_addr_handler(struct ctl_table *table, int write, ...@@ -33,7 +33,7 @@ int mmap_min_addr_handler(struct ctl_table *table, int write,
{ {
int ret; int ret;
if (!capable(CAP_SYS_RAWIO)) if (write && !capable(CAP_SYS_RAWIO))
return -EPERM; return -EPERM;
ret = proc_doulongvec_minmax(table, write, buffer, lenp, ppos); ret = proc_doulongvec_minmax(table, write, buffer, lenp, ppos);
......
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