Commit 4571bc5a authored by Linus Torvalds's avatar Linus Torvalds

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
parents 8aa34172 73580dac
...@@ -43,28 +43,9 @@ static inline void flush_kernel_dcache_page(struct page *page) ...@@ -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);
}
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) { void flush_kernel_vmap_range(void *vaddr, int size);
struct page *page = vmalloc_to_page(cursor); void invalidate_kernel_vmap_range(void *vaddr, int size);
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 @@ ...@@ -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 @@ ...@@ -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 ...@@ -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, ...@@ -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, ...@@ -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))) {
......
...@@ -39,7 +39,7 @@ ...@@ -39,7 +39,7 @@
* the PDC INTRIGUE calls. This is done to eliminate bugs introduced * the PDC INTRIGUE calls. This is done to eliminate bugs introduced
* in various PDC revisions. The code is much more maintainable * in various PDC revisions. The code is much more maintainable
* and reliable this way vs having to debug on every version of PDC * and reliable this way vs having to debug on every version of PDC
* on every box. * on every box.
*/ */
#include <linux/capability.h> #include <linux/capability.h>
...@@ -195,8 +195,8 @@ static int perf_config(uint32_t *image_ptr); ...@@ -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);
...@@ -222,7 +222,7 @@ extern void perf_intrigue_disable_perf_counters (void); ...@@ -222,7 +222,7 @@ extern void perf_intrigue_disable_perf_counters (void);
/* /*
* configure: * configure:
* *
* Configure the cpu with a given data image. First turn off the counters, * Configure the cpu with a given data image. First turn off the counters,
* then download the image, then turn the counters back on. * then download the image, then turn the counters back on.
*/ */
static int perf_config(uint32_t *image_ptr) static int perf_config(uint32_t *image_ptr)
...@@ -234,7 +234,7 @@ static int perf_config(uint32_t *image_ptr) ...@@ -234,7 +234,7 @@ static int perf_config(uint32_t *image_ptr)
error = perf_stop_counters(raddr); error = perf_stop_counters(raddr);
if (error != 0) { if (error != 0) {
printk("perf_config: perf_stop_counters = %ld\n", error); printk("perf_config: perf_stop_counters = %ld\n", error);
return -EINVAL; return -EINVAL;
} }
printk("Preparing to write image\n"); printk("Preparing to write image\n");
...@@ -242,7 +242,7 @@ printk("Preparing to write image\n"); ...@@ -242,7 +242,7 @@ printk("Preparing to write image\n");
error = perf_write_image((uint64_t *)image_ptr); error = perf_write_image((uint64_t *)image_ptr);
if (error != 0) { if (error != 0) {
printk("perf_config: DOWNLOAD = %ld\n", error); printk("perf_config: DOWNLOAD = %ld\n", error);
return -EINVAL; return -EINVAL;
} }
printk("Preparing to start counters\n"); printk("Preparing to start counters\n");
...@@ -254,7 +254,7 @@ printk("Preparing to start counters\n"); ...@@ -254,7 +254,7 @@ printk("Preparing to start counters\n");
} }
/* /*
* Open the device and initialize all of its memory. The device is only * Open the device and initialize all of its memory. The device is only
* opened once, but can be "queried" by multiple processes that know its * opened once, but can be "queried" by multiple processes that know its
* file descriptor. * file descriptor.
*/ */
...@@ -298,19 +298,19 @@ static ssize_t perf_read(struct file *file, char __user *buf, size_t cnt, loff_t ...@@ -298,19 +298,19 @@ 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;
uint32_t interface_type; uint32_t interface_type;
uint32_t test; uint32_t test;
if (perf_processor_interface == ONYX_INTF) if (perf_processor_interface == ONYX_INTF)
image_size = PCXU_IMAGE_SIZE; image_size = PCXU_IMAGE_SIZE;
else if (perf_processor_interface == CUDA_INTF) else if (perf_processor_interface == CUDA_INTF)
image_size = PCXW_IMAGE_SIZE; image_size = PCXW_IMAGE_SIZE;
else else
return -EFAULT; return -EFAULT;
if (!capable(CAP_SYS_ADMIN)) if (!capable(CAP_SYS_ADMIN))
...@@ -330,22 +330,22 @@ static ssize_t perf_write(struct file *file, const char __user *buf, size_t coun ...@@ -330,22 +330,22 @@ 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
is valid */ is valid */
if (((interface_type == CUDA_INTF) && if (((interface_type == CUDA_INTF) &&
(test >= MAX_CUDA_IMAGES)) || (test >= MAX_CUDA_IMAGES)) ||
((interface_type == ONYX_INTF) && ((interface_type == ONYX_INTF) &&
(test >= MAX_ONYX_IMAGES))) (test >= MAX_ONYX_IMAGES)))
return -EINVAL; return -EINVAL;
/* Copy the image into the processor */ /* Copy the image into the processor */
if (interface_type == CUDA_INTF) if (interface_type == CUDA_INTF)
return perf_config(cuda_images[test]); return perf_config(cuda_images[test]);
else else
return perf_config(onyx_images[test]); return perf_config(onyx_images[test]);
...@@ -359,7 +359,7 @@ static ssize_t perf_write(struct file *file, const char __user *buf, size_t coun ...@@ -359,7 +359,7 @@ static ssize_t perf_write(struct file *file, const char __user *buf, size_t coun
static void perf_patch_images(void) static void perf_patch_images(void)
{ {
#if 0 /* FIXME!! */ #if 0 /* FIXME!! */
/* /*
* NOTE: this routine is VERY specific to the current TLB image. * NOTE: this routine is VERY specific to the current TLB image.
* If the image is changed, this routine might also need to be changed. * If the image is changed, this routine might also need to be changed.
*/ */
...@@ -367,9 +367,9 @@ static void perf_patch_images(void) ...@@ -367,9 +367,9 @@ static void perf_patch_images(void)
extern void $i_dtlb_miss_2_0(); extern void $i_dtlb_miss_2_0();
extern void PA2_0_iva(); extern void PA2_0_iva();
/* /*
* We can only use the lower 32-bits, the upper 32-bits should be 0 * We can only use the lower 32-bits, the upper 32-bits should be 0
* anyway given this is in the kernel * anyway given this is in the kernel
*/ */
uint32_t itlb_addr = (uint32_t)&($i_itlb_miss_2_0); uint32_t itlb_addr = (uint32_t)&($i_itlb_miss_2_0);
uint32_t dtlb_addr = (uint32_t)&($i_dtlb_miss_2_0); uint32_t dtlb_addr = (uint32_t)&($i_dtlb_miss_2_0);
...@@ -377,21 +377,21 @@ static void perf_patch_images(void) ...@@ -377,21 +377,21 @@ static void perf_patch_images(void)
if (perf_processor_interface == ONYX_INTF) { if (perf_processor_interface == ONYX_INTF) {
/* clear last 2 bytes */ /* clear last 2 bytes */
onyx_images[TLBMISS][15] &= 0xffffff00; onyx_images[TLBMISS][15] &= 0xffffff00;
/* set 2 bytes */ /* set 2 bytes */
onyx_images[TLBMISS][15] |= (0x000000ff&((dtlb_addr) >> 24)); onyx_images[TLBMISS][15] |= (0x000000ff&((dtlb_addr) >> 24));
onyx_images[TLBMISS][16] = (dtlb_addr << 8)&0xffffff00; onyx_images[TLBMISS][16] = (dtlb_addr << 8)&0xffffff00;
onyx_images[TLBMISS][17] = itlb_addr; onyx_images[TLBMISS][17] = itlb_addr;
/* clear last 2 bytes */ /* clear last 2 bytes */
onyx_images[TLBHANDMISS][15] &= 0xffffff00; onyx_images[TLBHANDMISS][15] &= 0xffffff00;
/* set 2 bytes */ /* set 2 bytes */
onyx_images[TLBHANDMISS][15] |= (0x000000ff&((dtlb_addr) >> 24)); onyx_images[TLBHANDMISS][15] |= (0x000000ff&((dtlb_addr) >> 24));
onyx_images[TLBHANDMISS][16] = (dtlb_addr << 8)&0xffffff00; onyx_images[TLBHANDMISS][16] = (dtlb_addr << 8)&0xffffff00;
onyx_images[TLBHANDMISS][17] = itlb_addr; onyx_images[TLBHANDMISS][17] = itlb_addr;
/* clear last 2 bytes */ /* clear last 2 bytes */
onyx_images[BIG_CPI][15] &= 0xffffff00; onyx_images[BIG_CPI][15] &= 0xffffff00;
/* set 2 bytes */ /* set 2 bytes */
onyx_images[BIG_CPI][15] |= (0x000000ff&((dtlb_addr) >> 24)); onyx_images[BIG_CPI][15] |= (0x000000ff&((dtlb_addr) >> 24));
onyx_images[BIG_CPI][16] = (dtlb_addr << 8)&0xffffff00; onyx_images[BIG_CPI][16] = (dtlb_addr << 8)&0xffffff00;
...@@ -404,24 +404,24 @@ static void perf_patch_images(void) ...@@ -404,24 +404,24 @@ static void perf_patch_images(void)
} else if (perf_processor_interface == CUDA_INTF) { } else if (perf_processor_interface == CUDA_INTF) {
/* Cuda interface */ /* Cuda interface */
cuda_images[TLBMISS][16] = cuda_images[TLBMISS][16] =
(cuda_images[TLBMISS][16]&0xffff0000) | (cuda_images[TLBMISS][16]&0xffff0000) |
((dtlb_addr >> 8)&0x0000ffff); ((dtlb_addr >> 8)&0x0000ffff);
cuda_images[TLBMISS][17] = cuda_images[TLBMISS][17] =
((dtlb_addr << 24)&0xff000000) | ((itlb_addr >> 16)&0x000000ff); ((dtlb_addr << 24)&0xff000000) | ((itlb_addr >> 16)&0x000000ff);
cuda_images[TLBMISS][18] = (itlb_addr << 16)&0xffff0000; cuda_images[TLBMISS][18] = (itlb_addr << 16)&0xffff0000;
cuda_images[TLBHANDMISS][16] = cuda_images[TLBHANDMISS][16] =
(cuda_images[TLBHANDMISS][16]&0xffff0000) | (cuda_images[TLBHANDMISS][16]&0xffff0000) |
((dtlb_addr >> 8)&0x0000ffff); ((dtlb_addr >> 8)&0x0000ffff);
cuda_images[TLBHANDMISS][17] = cuda_images[TLBHANDMISS][17] =
((dtlb_addr << 24)&0xff000000) | ((itlb_addr >> 16)&0x000000ff); ((dtlb_addr << 24)&0xff000000) | ((itlb_addr >> 16)&0x000000ff);
cuda_images[TLBHANDMISS][18] = (itlb_addr << 16)&0xffff0000; cuda_images[TLBHANDMISS][18] = (itlb_addr << 16)&0xffff0000;
cuda_images[BIG_CPI][16] = cuda_images[BIG_CPI][16] =
(cuda_images[BIG_CPI][16]&0xffff0000) | (cuda_images[BIG_CPI][16]&0xffff0000) |
((dtlb_addr >> 8)&0x0000ffff); ((dtlb_addr >> 8)&0x0000ffff);
cuda_images[BIG_CPI][17] = cuda_images[BIG_CPI][17] =
((dtlb_addr << 24)&0xff000000) | ((itlb_addr >> 16)&0x000000ff); ((dtlb_addr << 24)&0xff000000) | ((itlb_addr >> 16)&0x000000ff);
cuda_images[BIG_CPI][18] = (itlb_addr << 16)&0xffff0000; cuda_images[BIG_CPI][18] = (itlb_addr << 16)&0xffff0000;
} else { } else {
...@@ -433,7 +433,7 @@ static void perf_patch_images(void) ...@@ -433,7 +433,7 @@ static void perf_patch_images(void)
/* /*
* ioctl routine * ioctl routine
* All routines effect the processor that they are executed on. Thus you * All routines effect the processor that they are executed on. Thus you
* must be running on the processor that you wish to change. * must be running on the processor that you wish to change.
*/ */
...@@ -459,7 +459,7 @@ static long perf_ioctl(struct file *file, unsigned int cmd, unsigned long arg) ...@@ -459,7 +459,7 @@ static long perf_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
} }
/* copy out the Counters */ /* copy out the Counters */
if (copy_to_user((void __user *)arg, raddr, if (copy_to_user((void __user *)arg, raddr,
sizeof (raddr)) != 0) { sizeof (raddr)) != 0) {
error = -EFAULT; error = -EFAULT;
break; break;
...@@ -487,7 +487,7 @@ static const struct file_operations perf_fops = { ...@@ -487,7 +487,7 @@ static const struct file_operations perf_fops = {
.open = perf_open, .open = perf_open,
.release = perf_release .release = perf_release
}; };
static struct miscdevice perf_dev = { static struct miscdevice perf_dev = {
MISC_DYNAMIC_MINOR, MISC_DYNAMIC_MINOR,
PA_PERF_DEV, PA_PERF_DEV,
...@@ -595,7 +595,7 @@ static int perf_stop_counters(uint32_t *raddr) ...@@ -595,7 +595,7 @@ static int perf_stop_counters(uint32_t *raddr)
/* OR sticky2 (bit 1496) to counter2 bit 32 */ /* OR sticky2 (bit 1496) to counter2 bit 32 */
tmp64 |= (userbuf[23] >> 8) & 0x0000000080000000; tmp64 |= (userbuf[23] >> 8) & 0x0000000080000000;
raddr[2] = (uint32_t)tmp64; raddr[2] = (uint32_t)tmp64;
/* Counter3 is bits 1497 to 1528 */ /* Counter3 is bits 1497 to 1528 */
tmp64 = (userbuf[23] >> 7) & 0x00000000ffffffff; tmp64 = (userbuf[23] >> 7) & 0x00000000ffffffff;
/* OR sticky3 (bit 1529) to counter3 bit 32 */ /* OR sticky3 (bit 1529) to counter3 bit 32 */
...@@ -617,7 +617,7 @@ static int perf_stop_counters(uint32_t *raddr) ...@@ -617,7 +617,7 @@ static int perf_stop_counters(uint32_t *raddr)
userbuf[22] = 0; userbuf[22] = 0;
userbuf[23] = 0; userbuf[23] = 0;
/* /*
* Write back the zeroed bytes + the image given * Write back the zeroed bytes + the image given
* the read was destructive. * the read was destructive.
*/ */
...@@ -625,13 +625,13 @@ static int perf_stop_counters(uint32_t *raddr) ...@@ -625,13 +625,13 @@ static int perf_stop_counters(uint32_t *raddr)
} else { } else {
/* /*
* Read RDR-15 which contains the counters and sticky bits * Read RDR-15 which contains the counters and sticky bits
*/ */
if (!perf_rdr_read_ubuf(15, userbuf)) { if (!perf_rdr_read_ubuf(15, userbuf)) {
return -13; return -13;
} }
/* /*
* Clear out the counters * Clear out the counters
*/ */
perf_rdr_clear(15); perf_rdr_clear(15);
...@@ -644,7 +644,7 @@ static int perf_stop_counters(uint32_t *raddr) ...@@ -644,7 +644,7 @@ static int perf_stop_counters(uint32_t *raddr)
raddr[2] = (uint32_t)((userbuf[1] >> 32) & 0x00000000ffffffffUL); raddr[2] = (uint32_t)((userbuf[1] >> 32) & 0x00000000ffffffffUL);
raddr[3] = (uint32_t)(userbuf[1] & 0x00000000ffffffffUL); raddr[3] = (uint32_t)(userbuf[1] & 0x00000000ffffffffUL);
} }
return 0; return 0;
} }
...@@ -682,7 +682,7 @@ static int perf_rdr_read_ubuf(uint32_t rdr_num, uint64_t *buffer) ...@@ -682,7 +682,7 @@ static int perf_rdr_read_ubuf(uint32_t rdr_num, uint64_t *buffer)
i = tentry->num_words; i = tentry->num_words;
while (i--) { while (i--) {
buffer[i] = 0; buffer[i] = 0;
} }
/* Check for bits an even number of 64 */ /* Check for bits an even number of 64 */
if ((xbits = width & 0x03f) != 0) { if ((xbits = width & 0x03f) != 0) {
...@@ -808,18 +808,22 @@ static int perf_write_image(uint64_t *memaddr) ...@@ -808,18 +808,22 @@ 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;
__raw_writeq(tmp64 | (*memaddr++ & 0x0013000000000000ul), __raw_writeq(tmp64 | (*memaddr++ & 0x0013000000000000ul),
runway + RUNWAY_STATUS); runway + RUNWAY_STATUS);
/* Write RUNWAY DEBUG registers */ /* Write RUNWAY DEBUG registers */
for (i = 0; i < 8; i++) { for (i = 0; i < 8; i++) {
__raw_writeq(*memaddr++, runway + RUNWAY_DEBUG); __raw_writeq(*memaddr++, runway + RUNWAY_DEBUG);
} }
return 0; return 0;
} }
/* /*
...@@ -843,7 +847,7 @@ printk("perf_rdr_write\n"); ...@@ -843,7 +847,7 @@ printk("perf_rdr_write\n");
perf_rdr_shift_out_U(rdr_num, buffer[i]); perf_rdr_shift_out_U(rdr_num, buffer[i]);
} else { } else {
perf_rdr_shift_out_W(rdr_num, buffer[i]); perf_rdr_shift_out_W(rdr_num, buffer[i]);
} }
} }
printk("perf_rdr_write done\n"); printk("perf_rdr_write done\n");
} }
...@@ -142,6 +142,8 @@ void machine_power_off(void) ...@@ -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 @@ ...@@ -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))
......
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