Merge branch 'parisc-4.11-2' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux
Pull parisc fixes from Helge Deller: - Mikulas Patocka added support for R_PARISC_SECREL32 relocations in modules with CONFIG_MODVERSIONS. - Dave Anglin optimized the cache flushing for vmap ranges. - Arvind Yadav provided a fix for a potential NULL pointer dereference in the parisc perf code (and some code cleanups). - I wired up the new statx system call, fixed some compiler warnings with the access_ok() macro and fixed shutdown code to really halt a system at shutdown instead of crashing & rebooting. * 'parisc-4.11-2' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux: parisc: Fix system shutdown halt parisc: perf: Fix potential NULL pointer dereference parisc: Avoid compiler warnings with access_ok() parisc: Wire up statx system call parisc: Optimize flush_kernel_vmap_range and invalidate_kernel_vmap_range parisc: support R_PARISC_SECREL32 relocation in modules
This commit is contained in:
commit
4571bc5abf
|
@ -43,28 +43,9 @@ static inline void flush_kernel_dcache_page(struct page *page)
|
||||||
|
|
||||||
#define flush_kernel_dcache_range(start,size) \
|
#define flush_kernel_dcache_range(start,size) \
|
||||||
flush_kernel_dcache_range_asm((start), (start)+(size));
|
flush_kernel_dcache_range_asm((start), (start)+(size));
|
||||||
/* vmap range flushes and invalidates. Architecturally, we don't need
|
|
||||||
* the invalidate, because the CPU should refuse to speculate once an
|
|
||||||
* area has been flushed, so invalidate is left empty */
|
|
||||||
static inline void flush_kernel_vmap_range(void *vaddr, int size)
|
|
||||||
{
|
|
||||||
unsigned long start = (unsigned long)vaddr;
|
|
||||||
|
|
||||||
flush_kernel_dcache_range_asm(start, start + size);
|
void flush_kernel_vmap_range(void *vaddr, int size);
|
||||||
}
|
void invalidate_kernel_vmap_range(void *vaddr, int size);
|
||||||
static inline void invalidate_kernel_vmap_range(void *vaddr, int size)
|
|
||||||
{
|
|
||||||
unsigned long start = (unsigned long)vaddr;
|
|
||||||
void *cursor = vaddr;
|
|
||||||
|
|
||||||
for ( ; cursor < vaddr + size; cursor += PAGE_SIZE) {
|
|
||||||
struct page *page = vmalloc_to_page(cursor);
|
|
||||||
|
|
||||||
if (test_and_clear_bit(PG_dcache_dirty, &page->flags))
|
|
||||||
flush_kernel_dcache_page(page);
|
|
||||||
}
|
|
||||||
flush_kernel_dcache_range_asm(start, start + size);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define flush_cache_vmap(start, end) flush_cache_all()
|
#define flush_cache_vmap(start, end) flush_cache_all()
|
||||||
#define flush_cache_vunmap(start, end) flush_cache_all()
|
#define flush_cache_vunmap(start, end) flush_cache_all()
|
||||||
|
|
|
@ -32,7 +32,8 @@
|
||||||
* that put_user is the same as __put_user, etc.
|
* that put_user is the same as __put_user, etc.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define access_ok(type, uaddr, size) (1)
|
#define access_ok(type, uaddr, size) \
|
||||||
|
( (uaddr) == (uaddr) )
|
||||||
|
|
||||||
#define put_user __put_user
|
#define put_user __put_user
|
||||||
#define get_user __get_user
|
#define get_user __get_user
|
||||||
|
|
|
@ -362,8 +362,9 @@
|
||||||
#define __NR_copy_file_range (__NR_Linux + 346)
|
#define __NR_copy_file_range (__NR_Linux + 346)
|
||||||
#define __NR_preadv2 (__NR_Linux + 347)
|
#define __NR_preadv2 (__NR_Linux + 347)
|
||||||
#define __NR_pwritev2 (__NR_Linux + 348)
|
#define __NR_pwritev2 (__NR_Linux + 348)
|
||||||
|
#define __NR_statx (__NR_Linux + 349)
|
||||||
|
|
||||||
#define __NR_Linux_syscalls (__NR_pwritev2 + 1)
|
#define __NR_Linux_syscalls (__NR_statx + 1)
|
||||||
|
|
||||||
|
|
||||||
#define __IGNORE_select /* newselect */
|
#define __IGNORE_select /* newselect */
|
||||||
|
|
|
@ -616,3 +616,25 @@ flush_cache_page(struct vm_area_struct *vma, unsigned long vmaddr, unsigned long
|
||||||
__flush_cache_page(vma, vmaddr, PFN_PHYS(pfn));
|
__flush_cache_page(vma, vmaddr, PFN_PHYS(pfn));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void flush_kernel_vmap_range(void *vaddr, int size)
|
||||||
|
{
|
||||||
|
unsigned long start = (unsigned long)vaddr;
|
||||||
|
|
||||||
|
if ((unsigned long)size > parisc_cache_flush_threshold)
|
||||||
|
flush_data_cache();
|
||||||
|
else
|
||||||
|
flush_kernel_dcache_range_asm(start, start + size);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(flush_kernel_vmap_range);
|
||||||
|
|
||||||
|
void invalidate_kernel_vmap_range(void *vaddr, int size)
|
||||||
|
{
|
||||||
|
unsigned long start = (unsigned long)vaddr;
|
||||||
|
|
||||||
|
if ((unsigned long)size > parisc_cache_flush_threshold)
|
||||||
|
flush_data_cache();
|
||||||
|
else
|
||||||
|
flush_kernel_dcache_range_asm(start, start + size);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(invalidate_kernel_vmap_range);
|
||||||
|
|
|
@ -620,6 +620,10 @@ int apply_relocate_add(Elf_Shdr *sechdrs,
|
||||||
*/
|
*/
|
||||||
*loc = fsel(val, addend);
|
*loc = fsel(val, addend);
|
||||||
break;
|
break;
|
||||||
|
case R_PARISC_SECREL32:
|
||||||
|
/* 32-bit section relative address. */
|
||||||
|
*loc = fsel(val, addend);
|
||||||
|
break;
|
||||||
case R_PARISC_DPREL21L:
|
case R_PARISC_DPREL21L:
|
||||||
/* left 21 bit of relative address */
|
/* left 21 bit of relative address */
|
||||||
val = lrsel(val - dp, addend);
|
val = lrsel(val - dp, addend);
|
||||||
|
@ -807,6 +811,10 @@ int apply_relocate_add(Elf_Shdr *sechdrs,
|
||||||
*/
|
*/
|
||||||
*loc = fsel(val, addend);
|
*loc = fsel(val, addend);
|
||||||
break;
|
break;
|
||||||
|
case R_PARISC_SECREL32:
|
||||||
|
/* 32-bit section relative address. */
|
||||||
|
*loc = fsel(val, addend);
|
||||||
|
break;
|
||||||
case R_PARISC_FPTR64:
|
case R_PARISC_FPTR64:
|
||||||
/* 64-bit function address */
|
/* 64-bit function address */
|
||||||
if(in_local(me, (void *)(val + addend))) {
|
if(in_local(me, (void *)(val + addend))) {
|
||||||
|
|
|
@ -195,8 +195,8 @@ static int perf_config(uint32_t *image_ptr);
|
||||||
static int perf_release(struct inode *inode, struct file *file);
|
static int perf_release(struct inode *inode, struct file *file);
|
||||||
static int perf_open(struct inode *inode, struct file *file);
|
static int perf_open(struct inode *inode, struct file *file);
|
||||||
static ssize_t perf_read(struct file *file, char __user *buf, size_t cnt, loff_t *ppos);
|
static ssize_t perf_read(struct file *file, char __user *buf, size_t cnt, loff_t *ppos);
|
||||||
static ssize_t perf_write(struct file *file, const char __user *buf, size_t count,
|
static ssize_t perf_write(struct file *file, const char __user *buf,
|
||||||
loff_t *ppos);
|
size_t count, loff_t *ppos);
|
||||||
static long perf_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
|
static long perf_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
|
||||||
static void perf_start_counters(void);
|
static void perf_start_counters(void);
|
||||||
static int perf_stop_counters(uint32_t *raddr);
|
static int perf_stop_counters(uint32_t *raddr);
|
||||||
|
@ -298,8 +298,8 @@ static ssize_t perf_read(struct file *file, char __user *buf, size_t cnt, loff_t
|
||||||
* called on the processor that the download should happen
|
* called on the processor that the download should happen
|
||||||
* on.
|
* on.
|
||||||
*/
|
*/
|
||||||
static ssize_t perf_write(struct file *file, const char __user *buf, size_t count,
|
static ssize_t perf_write(struct file *file, const char __user *buf,
|
||||||
loff_t *ppos)
|
size_t count, loff_t *ppos)
|
||||||
{
|
{
|
||||||
size_t image_size;
|
size_t image_size;
|
||||||
uint32_t image_type;
|
uint32_t image_type;
|
||||||
|
@ -330,10 +330,10 @@ static ssize_t perf_write(struct file *file, const char __user *buf, size_t coun
|
||||||
|
|
||||||
/* First check the machine type is correct for
|
/* First check the machine type is correct for
|
||||||
the requested image */
|
the requested image */
|
||||||
if (((perf_processor_interface == CUDA_INTF) &&
|
if (((perf_processor_interface == CUDA_INTF) &&
|
||||||
(interface_type != CUDA_INTF)) ||
|
(interface_type != CUDA_INTF)) ||
|
||||||
((perf_processor_interface == ONYX_INTF) &&
|
((perf_processor_interface == ONYX_INTF) &&
|
||||||
(interface_type != ONYX_INTF)))
|
(interface_type != ONYX_INTF)))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
/* Next check to make sure the requested image
|
/* Next check to make sure the requested image
|
||||||
|
@ -808,6 +808,10 @@ static int perf_write_image(uint64_t *memaddr)
|
||||||
}
|
}
|
||||||
|
|
||||||
runway = ioremap_nocache(cpu_device->hpa.start, 4096);
|
runway = ioremap_nocache(cpu_device->hpa.start, 4096);
|
||||||
|
if (!runway) {
|
||||||
|
pr_err("perf_write_image: ioremap failed!\n");
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
/* Merge intrigue bits into Runway STATUS 0 */
|
/* Merge intrigue bits into Runway STATUS 0 */
|
||||||
tmp64 = __raw_readq(runway + RUNWAY_STATUS) & 0xffecfffffffffffful;
|
tmp64 = __raw_readq(runway + RUNWAY_STATUS) & 0xffecfffffffffffful;
|
||||||
|
|
|
@ -142,6 +142,8 @@ void machine_power_off(void)
|
||||||
|
|
||||||
printk(KERN_EMERG "System shut down completed.\n"
|
printk(KERN_EMERG "System shut down completed.\n"
|
||||||
"Please power this system off now.");
|
"Please power this system off now.");
|
||||||
|
|
||||||
|
for (;;);
|
||||||
}
|
}
|
||||||
|
|
||||||
void (*pm_power_off)(void) = machine_power_off;
|
void (*pm_power_off)(void) = machine_power_off;
|
||||||
|
|
|
@ -444,6 +444,7 @@
|
||||||
ENTRY_SAME(copy_file_range)
|
ENTRY_SAME(copy_file_range)
|
||||||
ENTRY_COMP(preadv2)
|
ENTRY_COMP(preadv2)
|
||||||
ENTRY_COMP(pwritev2)
|
ENTRY_COMP(pwritev2)
|
||||||
|
ENTRY_SAME(statx)
|
||||||
|
|
||||||
|
|
||||||
.ifne (. - 90b) - (__NR_Linux_syscalls * (91b - 90b))
|
.ifne (. - 90b) - (__NR_Linux_syscalls * (91b - 90b))
|
||||||
|
|
Loading…
Reference in New Issue