mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-04 01:24:12 +08:00
parisc architecture fixes for kernel v6.5-rc6:
- Fix LWS code to use same lock words as for the parisc lightweight spinlocks - Use PTR_ERR_OR_ZERO() in pdt init code - Fix lots of sparse warnings -----BEGIN PGP SIGNATURE----- iHUEABYKAB0WIQS86RI+GtKfB8BJu973ErUQojoPXwUCZNZG5AAKCRD3ErUQojoP X4tuAP90TJxRks6fRoqZfiNQEd5gXXWnSY5fhbwsMvEONQChcgEAhUVEJB+oYfH1 XZC0Sy1+hJtYuPHUMmJi8aKlKfbkSAw= =LvUn -----END PGP SIGNATURE----- Merge tag 'parisc-for-6.5-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux Pull parisc architecture fixes from Helge Deller: "A bugfix in the LWS code, which used different lock words than the parisc lightweight spinlock checks. This inconsistency triggered false positives when the lightweight spinlock checks checked the locks of mutexes. The other patches are trivial cleanups and most of them fix sparse warnings. Summary: - Fix LWS code to use same lock words as for the parisc lightweight spinlocks - Use PTR_ERR_OR_ZERO() in pdt init code - Fix lots of sparse warnings" * tag 'parisc-for-6.5-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux: parisc: perf: Make cpu_device variable static parisc: ftrace: Add declaration for ftrace_function_trampoline() parisc: boot: Nuke some sparse warnings in decompressor parisc: processor: Include asm/smp.h for init_per_cpu() parisc: unaligned: Include linux/sysctl.h for unaligned_enabled parisc: Move proc_mckinley_root and proc_runway_root to sba_iommu parisc: dma: Add prototype for pcxl_dma_start parisc: parisc_ksyms: Include libgcc.h for libgcc prototypes parisc: ucmpdi2: Fix no previous prototype for '__ucmpdi2' warning parisc: firmware: Mark pdc_result buffers local parisc: firmware: Fix sparse context imbalance warnings parisc: signal: Fix sparse incorrect type in assignment warning parisc: ioremap: Fix sparse warnings parisc: fault: Use C99 arrary initializers parisc: pdt: Use PTR_ERR_OR_ZERO() to simplify code parisc: Fix lightweight spinlock checks to not break futexes
This commit is contained in:
commit
feb0eee9aa
@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
config LIGHTWEIGHT_SPINLOCK_CHECK
|
config LIGHTWEIGHT_SPINLOCK_CHECK
|
||||||
bool "Enable lightweight spinlock checks"
|
bool "Enable lightweight spinlock checks"
|
||||||
depends on SMP && !DEBUG_SPINLOCK
|
depends on DEBUG_KERNEL && SMP && !DEBUG_SPINLOCK
|
||||||
default y
|
default y
|
||||||
help
|
help
|
||||||
Add checks with low performance impact to the spinlock functions
|
Add checks with low performance impact to the spinlock functions
|
||||||
|
@ -117,7 +117,7 @@ char *strchr(const char *s, int c)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int puts(const char *s)
|
static int puts(const char *s)
|
||||||
{
|
{
|
||||||
const char *nuline = s;
|
const char *nuline = s;
|
||||||
|
|
||||||
@ -172,7 +172,7 @@ static int print_num(unsigned long num, int base)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int printf(const char *fmt, ...)
|
static int printf(const char *fmt, ...)
|
||||||
{
|
{
|
||||||
va_list args;
|
va_list args;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
@ -204,13 +204,13 @@ void abort(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#undef malloc
|
#undef malloc
|
||||||
void *malloc(size_t size)
|
static void *malloc(size_t size)
|
||||||
{
|
{
|
||||||
return malloc_gzip(size);
|
return malloc_gzip(size);
|
||||||
}
|
}
|
||||||
|
|
||||||
#undef free
|
#undef free
|
||||||
void free(void *ptr)
|
static void free(void *ptr)
|
||||||
{
|
{
|
||||||
return free_gzip(ptr);
|
return free_gzip(ptr);
|
||||||
}
|
}
|
||||||
@ -278,7 +278,7 @@ static void parse_elf(void *output)
|
|||||||
free(phdrs);
|
free(phdrs);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned long decompress_kernel(unsigned int started_wide,
|
asmlinkage unsigned long __visible decompress_kernel(unsigned int started_wide,
|
||||||
unsigned int command_line,
|
unsigned int command_line,
|
||||||
const unsigned int rd_start,
|
const unsigned int rd_start,
|
||||||
const unsigned int rd_end)
|
const unsigned int rd_end)
|
||||||
|
@ -14,6 +14,8 @@
|
|||||||
#define dma_outb outb
|
#define dma_outb outb
|
||||||
#define dma_inb inb
|
#define dma_inb inb
|
||||||
|
|
||||||
|
extern unsigned long pcxl_dma_start;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** DMA_CHUNK_SIZE is used by the SCSI mid-layer to break up
|
** DMA_CHUNK_SIZE is used by the SCSI mid-layer to break up
|
||||||
** (or rather not merge) DMAs into manageable chunks.
|
** (or rather not merge) DMAs into manageable chunks.
|
||||||
|
@ -12,6 +12,10 @@ extern void mcount(void);
|
|||||||
extern unsigned long sys_call_table[];
|
extern unsigned long sys_call_table[];
|
||||||
|
|
||||||
extern unsigned long return_address(unsigned int);
|
extern unsigned long return_address(unsigned int);
|
||||||
|
struct ftrace_regs;
|
||||||
|
extern void ftrace_function_trampoline(unsigned long parent,
|
||||||
|
unsigned long self_addr, unsigned long org_sp_gr3,
|
||||||
|
struct ftrace_regs *fregs);
|
||||||
|
|
||||||
#ifdef CONFIG_DYNAMIC_FTRACE
|
#ifdef CONFIG_DYNAMIC_FTRACE
|
||||||
extern void ftrace_caller(void);
|
extern void ftrace_caller(void);
|
||||||
|
@ -7,8 +7,6 @@
|
|||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
#include <asm/spinlock_types.h>
|
#include <asm/spinlock_types.h>
|
||||||
|
|
||||||
#define SPINLOCK_BREAK_INSN 0x0000c006 /* break 6,6 */
|
|
||||||
|
|
||||||
static inline void arch_spin_val_check(int lock_val)
|
static inline void arch_spin_val_check(int lock_val)
|
||||||
{
|
{
|
||||||
if (IS_ENABLED(CONFIG_LIGHTWEIGHT_SPINLOCK_CHECK))
|
if (IS_ENABLED(CONFIG_LIGHTWEIGHT_SPINLOCK_CHECK))
|
||||||
|
@ -4,6 +4,10 @@
|
|||||||
|
|
||||||
#define __ARCH_SPIN_LOCK_UNLOCKED_VAL 0x1a46
|
#define __ARCH_SPIN_LOCK_UNLOCKED_VAL 0x1a46
|
||||||
|
|
||||||
|
#define SPINLOCK_BREAK_INSN 0x0000c006 /* break 6,6 */
|
||||||
|
|
||||||
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
#ifdef CONFIG_PA20
|
#ifdef CONFIG_PA20
|
||||||
volatile unsigned int slock;
|
volatile unsigned int slock;
|
||||||
@ -27,6 +31,8 @@ typedef struct {
|
|||||||
volatile unsigned int counter;
|
volatile unsigned int counter;
|
||||||
} arch_rwlock_t;
|
} arch_rwlock_t;
|
||||||
|
|
||||||
|
#endif /* __ASSEMBLY__ */
|
||||||
|
|
||||||
#define __ARCH_RW_LOCK_UNLOCKED__ 0x01000000
|
#define __ARCH_RW_LOCK_UNLOCKED__ 0x01000000
|
||||||
#define __ARCH_RW_LOCK_UNLOCKED { .lock_mutex = __ARCH_SPIN_LOCK_UNLOCKED, \
|
#define __ARCH_RW_LOCK_UNLOCKED { .lock_mutex = __ARCH_SPIN_LOCK_UNLOCKED, \
|
||||||
.counter = __ARCH_RW_LOCK_UNLOCKED__ }
|
.counter = __ARCH_RW_LOCK_UNLOCKED__ }
|
||||||
|
@ -74,8 +74,8 @@
|
|||||||
static DEFINE_SPINLOCK(pdc_lock);
|
static DEFINE_SPINLOCK(pdc_lock);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
unsigned long pdc_result[NUM_PDC_RESULT] __aligned(8);
|
static unsigned long pdc_result[NUM_PDC_RESULT] __aligned(8);
|
||||||
unsigned long pdc_result2[NUM_PDC_RESULT] __aligned(8);
|
static unsigned long pdc_result2[NUM_PDC_RESULT] __aligned(8);
|
||||||
|
|
||||||
#ifdef CONFIG_64BIT
|
#ifdef CONFIG_64BIT
|
||||||
#define WIDE_FIRMWARE 0x1
|
#define WIDE_FIRMWARE 0x1
|
||||||
@ -334,7 +334,7 @@ int __pdc_cpu_rendezvous(void)
|
|||||||
/**
|
/**
|
||||||
* pdc_cpu_rendezvous_lock - Lock PDC while transitioning to rendezvous state
|
* pdc_cpu_rendezvous_lock - Lock PDC while transitioning to rendezvous state
|
||||||
*/
|
*/
|
||||||
void pdc_cpu_rendezvous_lock(void)
|
void pdc_cpu_rendezvous_lock(void) __acquires(&pdc_lock)
|
||||||
{
|
{
|
||||||
spin_lock(&pdc_lock);
|
spin_lock(&pdc_lock);
|
||||||
}
|
}
|
||||||
@ -342,7 +342,7 @@ void pdc_cpu_rendezvous_lock(void)
|
|||||||
/**
|
/**
|
||||||
* pdc_cpu_rendezvous_unlock - Unlock PDC after reaching rendezvous state
|
* pdc_cpu_rendezvous_unlock - Unlock PDC after reaching rendezvous state
|
||||||
*/
|
*/
|
||||||
void pdc_cpu_rendezvous_unlock(void)
|
void pdc_cpu_rendezvous_unlock(void) __releases(&pdc_lock)
|
||||||
{
|
{
|
||||||
spin_unlock(&pdc_lock);
|
spin_unlock(&pdc_lock);
|
||||||
}
|
}
|
||||||
|
@ -53,7 +53,7 @@ static void __hot prepare_ftrace_return(unsigned long *parent,
|
|||||||
|
|
||||||
static ftrace_func_t ftrace_func;
|
static ftrace_func_t ftrace_func;
|
||||||
|
|
||||||
void notrace __hot ftrace_function_trampoline(unsigned long parent,
|
asmlinkage void notrace __hot ftrace_function_trampoline(unsigned long parent,
|
||||||
unsigned long self_addr,
|
unsigned long self_addr,
|
||||||
unsigned long org_sp_gr3,
|
unsigned long org_sp_gr3,
|
||||||
struct ftrace_regs *fregs)
|
struct ftrace_regs *fregs)
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/syscalls.h>
|
#include <linux/syscalls.h>
|
||||||
|
#include <linux/libgcc.h>
|
||||||
|
|
||||||
#include <linux/string.h>
|
#include <linux/string.h>
|
||||||
EXPORT_SYMBOL(memset);
|
EXPORT_SYMBOL(memset);
|
||||||
@ -92,12 +93,6 @@ EXPORT_SYMBOL($$divI_12);
|
|||||||
EXPORT_SYMBOL($$divI_14);
|
EXPORT_SYMBOL($$divI_14);
|
||||||
EXPORT_SYMBOL($$divI_15);
|
EXPORT_SYMBOL($$divI_15);
|
||||||
|
|
||||||
extern void __ashrdi3(void);
|
|
||||||
extern void __ashldi3(void);
|
|
||||||
extern void __lshrdi3(void);
|
|
||||||
extern void __muldi3(void);
|
|
||||||
extern void __ucmpdi2(void);
|
|
||||||
|
|
||||||
EXPORT_SYMBOL(__ashrdi3);
|
EXPORT_SYMBOL(__ashrdi3);
|
||||||
EXPORT_SYMBOL(__ashldi3);
|
EXPORT_SYMBOL(__ashldi3);
|
||||||
EXPORT_SYMBOL(__lshrdi3);
|
EXPORT_SYMBOL(__lshrdi3);
|
||||||
|
@ -39,7 +39,7 @@ static struct proc_dir_entry * proc_gsc_root __read_mostly = NULL;
|
|||||||
static unsigned long pcxl_used_bytes __read_mostly;
|
static unsigned long pcxl_used_bytes __read_mostly;
|
||||||
static unsigned long pcxl_used_pages __read_mostly;
|
static unsigned long pcxl_used_pages __read_mostly;
|
||||||
|
|
||||||
extern unsigned long pcxl_dma_start; /* Start of pcxl dma mapping area */
|
unsigned long pcxl_dma_start __ro_after_init; /* pcxl dma mapping area start */
|
||||||
static DEFINE_SPINLOCK(pcxl_res_lock);
|
static DEFINE_SPINLOCK(pcxl_res_lock);
|
||||||
static char *pcxl_res_map;
|
static char *pcxl_res_map;
|
||||||
static int pcxl_res_hint;
|
static int pcxl_res_hint;
|
||||||
@ -381,7 +381,7 @@ pcxl_dma_init(void)
|
|||||||
pcxl_res_map = (char *)__get_free_pages(GFP_KERNEL,
|
pcxl_res_map = (char *)__get_free_pages(GFP_KERNEL,
|
||||||
get_order(pcxl_res_size));
|
get_order(pcxl_res_size));
|
||||||
memset(pcxl_res_map, 0, pcxl_res_size);
|
memset(pcxl_res_map, 0, pcxl_res_size);
|
||||||
proc_gsc_root = proc_mkdir("gsc", NULL);
|
proc_gsc_root = proc_mkdir("bus/gsc", NULL);
|
||||||
if (!proc_gsc_root)
|
if (!proc_gsc_root)
|
||||||
printk(KERN_WARNING
|
printk(KERN_WARNING
|
||||||
"pcxl_dma_init: Unable to create gsc /proc dir entry\n");
|
"pcxl_dma_init: Unable to create gsc /proc dir entry\n");
|
||||||
|
@ -354,10 +354,8 @@ static int __init pdt_initcall(void)
|
|||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
kpdtd_task = kthread_run(pdt_mainloop, NULL, "kpdtd");
|
kpdtd_task = kthread_run(pdt_mainloop, NULL, "kpdtd");
|
||||||
if (IS_ERR(kpdtd_task))
|
|
||||||
return PTR_ERR(kpdtd_task);
|
|
||||||
|
|
||||||
return 0;
|
return PTR_ERR_OR_ZERO(kpdtd_task);
|
||||||
}
|
}
|
||||||
|
|
||||||
late_initcall(pdt_initcall);
|
late_initcall(pdt_initcall);
|
||||||
|
@ -57,7 +57,7 @@ struct rdr_tbl_ent {
|
|||||||
static int perf_processor_interface __read_mostly = UNKNOWN_INTF;
|
static int perf_processor_interface __read_mostly = UNKNOWN_INTF;
|
||||||
static int perf_enabled __read_mostly;
|
static int perf_enabled __read_mostly;
|
||||||
static DEFINE_SPINLOCK(perf_lock);
|
static DEFINE_SPINLOCK(perf_lock);
|
||||||
struct parisc_device *cpu_device __read_mostly;
|
static struct parisc_device *cpu_device __read_mostly;
|
||||||
|
|
||||||
/* RDRs to write for PCX-W */
|
/* RDRs to write for PCX-W */
|
||||||
static const int perf_rdrs_W[] =
|
static const int perf_rdrs_W[] =
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
#include <asm/pdc.h>
|
#include <asm/pdc.h>
|
||||||
|
#include <asm/smp.h>
|
||||||
#include <asm/pdcpat.h>
|
#include <asm/pdcpat.h>
|
||||||
#include <asm/irq.h> /* for struct irq_region */
|
#include <asm/irq.h> /* for struct irq_region */
|
||||||
#include <asm/parisc-device.h>
|
#include <asm/parisc-device.h>
|
||||||
|
@ -40,11 +40,6 @@
|
|||||||
|
|
||||||
static char __initdata command_line[COMMAND_LINE_SIZE];
|
static char __initdata command_line[COMMAND_LINE_SIZE];
|
||||||
|
|
||||||
/* Intended for ccio/sba/cpu statistics under /proc/bus/{runway|gsc} */
|
|
||||||
struct proc_dir_entry * proc_runway_root __read_mostly = NULL;
|
|
||||||
struct proc_dir_entry * proc_gsc_root __read_mostly = NULL;
|
|
||||||
struct proc_dir_entry * proc_mckinley_root __read_mostly = NULL;
|
|
||||||
|
|
||||||
static void __init setup_cmdline(char **cmdline_p)
|
static void __init setup_cmdline(char **cmdline_p)
|
||||||
{
|
{
|
||||||
extern unsigned int boot_args[];
|
extern unsigned int boot_args[];
|
||||||
@ -196,48 +191,6 @@ const struct seq_operations cpuinfo_op = {
|
|||||||
.show = show_cpuinfo
|
.show = show_cpuinfo
|
||||||
};
|
};
|
||||||
|
|
||||||
static void __init parisc_proc_mkdir(void)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
** Can't call proc_mkdir() until after proc_root_init() has been
|
|
||||||
** called by start_kernel(). In other words, this code can't
|
|
||||||
** live in arch/.../setup.c because start_parisc() calls
|
|
||||||
** start_kernel().
|
|
||||||
*/
|
|
||||||
switch (boot_cpu_data.cpu_type) {
|
|
||||||
case pcxl:
|
|
||||||
case pcxl2:
|
|
||||||
if (NULL == proc_gsc_root)
|
|
||||||
{
|
|
||||||
proc_gsc_root = proc_mkdir("bus/gsc", NULL);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case pcxt_:
|
|
||||||
case pcxu:
|
|
||||||
case pcxu_:
|
|
||||||
case pcxw:
|
|
||||||
case pcxw_:
|
|
||||||
case pcxw2:
|
|
||||||
if (NULL == proc_runway_root)
|
|
||||||
{
|
|
||||||
proc_runway_root = proc_mkdir("bus/runway", NULL);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case mako:
|
|
||||||
case mako2:
|
|
||||||
if (NULL == proc_mckinley_root)
|
|
||||||
{
|
|
||||||
proc_mckinley_root = proc_mkdir("bus/mckinley", NULL);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
/* FIXME: this was added to prevent the compiler
|
|
||||||
* complaining about missing pcx, pcxs and pcxt
|
|
||||||
* I'm assuming they have neither gsc nor runway */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct resource central_bus = {
|
static struct resource central_bus = {
|
||||||
.name = "Central Bus",
|
.name = "Central Bus",
|
||||||
.start = F_EXTEND(0xfff80000),
|
.start = F_EXTEND(0xfff80000),
|
||||||
@ -294,7 +247,6 @@ static int __init parisc_init(void)
|
|||||||
{
|
{
|
||||||
u32 osid = (OS_ID_LINUX << 16);
|
u32 osid = (OS_ID_LINUX << 16);
|
||||||
|
|
||||||
parisc_proc_mkdir();
|
|
||||||
parisc_init_resources();
|
parisc_init_resources();
|
||||||
do_device_inventory(); /* probe for hardware */
|
do_device_inventory(); /* probe for hardware */
|
||||||
|
|
||||||
|
@ -423,7 +423,7 @@ static void check_syscallno_in_delay_branch(struct pt_regs *regs)
|
|||||||
regs->gr[31] -= 8; /* delayed branching */
|
regs->gr[31] -= 8; /* delayed branching */
|
||||||
|
|
||||||
/* Get assembler opcode of code in delay branch */
|
/* Get assembler opcode of code in delay branch */
|
||||||
uaddr = (unsigned int *) ((regs->gr[31] & ~3) + 4);
|
uaddr = (u32 __user *) ((regs->gr[31] & ~3) + 4);
|
||||||
err = get_user(opcode, uaddr);
|
err = get_user(opcode, uaddr);
|
||||||
if (err)
|
if (err)
|
||||||
return;
|
return;
|
||||||
|
@ -39,6 +39,7 @@ registers).
|
|||||||
#include <asm/assembly.h>
|
#include <asm/assembly.h>
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
#include <asm/cache.h>
|
#include <asm/cache.h>
|
||||||
|
#include <asm/spinlock_types.h>
|
||||||
|
|
||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
|
|
||||||
@ -66,6 +67,16 @@ registers).
|
|||||||
stw \reg1, 0(%sr2,\reg2)
|
stw \reg1, 0(%sr2,\reg2)
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
|
/* raise exception if spinlock content is not zero or
|
||||||
|
* __ARCH_SPIN_LOCK_UNLOCKED_VAL */
|
||||||
|
.macro spinlock_check spin_val,tmpreg
|
||||||
|
#ifdef CONFIG_LIGHTWEIGHT_SPINLOCK_CHECK
|
||||||
|
ldi __ARCH_SPIN_LOCK_UNLOCKED_VAL, \tmpreg
|
||||||
|
andcm,= \spin_val, \tmpreg, %r0
|
||||||
|
.word SPINLOCK_BREAK_INSN
|
||||||
|
#endif
|
||||||
|
.endm
|
||||||
|
|
||||||
.text
|
.text
|
||||||
|
|
||||||
.import syscall_exit,code
|
.import syscall_exit,code
|
||||||
@ -508,7 +519,8 @@ lws_start:
|
|||||||
|
|
||||||
lws_exit_noerror:
|
lws_exit_noerror:
|
||||||
lws_pagefault_enable %r1,%r21
|
lws_pagefault_enable %r1,%r21
|
||||||
stw,ma %r20, 0(%sr2,%r20)
|
ldi __ARCH_SPIN_LOCK_UNLOCKED_VAL, %r21
|
||||||
|
stw,ma %r21, 0(%sr2,%r20)
|
||||||
ssm PSW_SM_I, %r0
|
ssm PSW_SM_I, %r0
|
||||||
b lws_exit
|
b lws_exit
|
||||||
copy %r0, %r21
|
copy %r0, %r21
|
||||||
@ -521,7 +533,8 @@ lws_wouldblock:
|
|||||||
|
|
||||||
lws_pagefault:
|
lws_pagefault:
|
||||||
lws_pagefault_enable %r1,%r21
|
lws_pagefault_enable %r1,%r21
|
||||||
stw,ma %r20, 0(%sr2,%r20)
|
ldi __ARCH_SPIN_LOCK_UNLOCKED_VAL, %r21
|
||||||
|
stw,ma %r21, 0(%sr2,%r20)
|
||||||
ssm PSW_SM_I, %r0
|
ssm PSW_SM_I, %r0
|
||||||
ldo 3(%r0),%r28
|
ldo 3(%r0),%r28
|
||||||
b lws_exit
|
b lws_exit
|
||||||
@ -619,6 +632,7 @@ lws_compare_and_swap:
|
|||||||
|
|
||||||
/* Try to acquire the lock */
|
/* Try to acquire the lock */
|
||||||
LDCW 0(%sr2,%r20), %r28
|
LDCW 0(%sr2,%r20), %r28
|
||||||
|
spinlock_check %r28, %r21
|
||||||
comclr,<> %r0, %r28, %r0
|
comclr,<> %r0, %r28, %r0
|
||||||
b,n lws_wouldblock
|
b,n lws_wouldblock
|
||||||
|
|
||||||
@ -772,6 +786,7 @@ cas2_lock_start:
|
|||||||
|
|
||||||
/* Try to acquire the lock */
|
/* Try to acquire the lock */
|
||||||
LDCW 0(%sr2,%r20), %r28
|
LDCW 0(%sr2,%r20), %r28
|
||||||
|
spinlock_check %r28, %r21
|
||||||
comclr,<> %r0, %r28, %r0
|
comclr,<> %r0, %r28, %r0
|
||||||
b,n lws_wouldblock
|
b,n lws_wouldblock
|
||||||
|
|
||||||
@ -1001,6 +1016,7 @@ atomic_xchg_start:
|
|||||||
|
|
||||||
/* Try to acquire the lock */
|
/* Try to acquire the lock */
|
||||||
LDCW 0(%sr2,%r20), %r28
|
LDCW 0(%sr2,%r20), %r28
|
||||||
|
spinlock_check %r28, %r21
|
||||||
comclr,<> %r0, %r28, %r0
|
comclr,<> %r0, %r28, %r0
|
||||||
b,n lws_wouldblock
|
b,n lws_wouldblock
|
||||||
|
|
||||||
@ -1199,6 +1215,7 @@ atomic_store_start:
|
|||||||
|
|
||||||
/* Try to acquire the lock */
|
/* Try to acquire the lock */
|
||||||
LDCW 0(%sr2,%r20), %r28
|
LDCW 0(%sr2,%r20), %r28
|
||||||
|
spinlock_check %r28, %r21
|
||||||
comclr,<> %r0, %r28, %r0
|
comclr,<> %r0, %r28, %r0
|
||||||
b,n lws_wouldblock
|
b,n lws_wouldblock
|
||||||
|
|
||||||
@ -1330,7 +1347,7 @@ ENTRY(lws_lock_start)
|
|||||||
/* lws locks */
|
/* lws locks */
|
||||||
.rept 256
|
.rept 256
|
||||||
/* Keep locks aligned at 16-bytes */
|
/* Keep locks aligned at 16-bytes */
|
||||||
.word 1
|
.word __ARCH_SPIN_LOCK_UNLOCKED_VAL
|
||||||
.word 0
|
.word 0
|
||||||
.word 0
|
.word 0
|
||||||
.word 0
|
.word 0
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
#include <linux/signal.h>
|
#include <linux/signal.h>
|
||||||
#include <linux/ratelimit.h>
|
#include <linux/ratelimit.h>
|
||||||
#include <linux/uaccess.h>
|
#include <linux/uaccess.h>
|
||||||
|
#include <linux/sysctl.h>
|
||||||
#include <asm/unaligned.h>
|
#include <asm/unaligned.h>
|
||||||
#include <asm/hardirq.h>
|
#include <asm/hardirq.h>
|
||||||
#include <asm/traps.h>
|
#include <asm/traps.h>
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
|
#include <linux/libgcc.h>
|
||||||
|
|
||||||
union ull_union {
|
union ull_union {
|
||||||
unsigned long long ull;
|
unsigned long long ull;
|
||||||
@ -9,7 +10,7 @@ union ull_union {
|
|||||||
} ui;
|
} ui;
|
||||||
};
|
};
|
||||||
|
|
||||||
int __ucmpdi2(unsigned long long a, unsigned long long b)
|
word_type __ucmpdi2(unsigned long long a, unsigned long long b)
|
||||||
{
|
{
|
||||||
union ull_union au = {.ull = a};
|
union ull_union au = {.ull = a};
|
||||||
union ull_union bu = {.ull = b};
|
union ull_union bu = {.ull = b};
|
||||||
|
@ -192,31 +192,31 @@ int fixup_exception(struct pt_regs *regs)
|
|||||||
* For implementation see handle_interruption() in traps.c
|
* For implementation see handle_interruption() in traps.c
|
||||||
*/
|
*/
|
||||||
static const char * const trap_description[] = {
|
static const char * const trap_description[] = {
|
||||||
[1] "High-priority machine check (HPMC)",
|
[1] = "High-priority machine check (HPMC)",
|
||||||
[2] "Power failure interrupt",
|
[2] = "Power failure interrupt",
|
||||||
[3] "Recovery counter trap",
|
[3] = "Recovery counter trap",
|
||||||
[5] "Low-priority machine check",
|
[5] = "Low-priority machine check",
|
||||||
[6] "Instruction TLB miss fault",
|
[6] = "Instruction TLB miss fault",
|
||||||
[7] "Instruction access rights / protection trap",
|
[7] = "Instruction access rights / protection trap",
|
||||||
[8] "Illegal instruction trap",
|
[8] = "Illegal instruction trap",
|
||||||
[9] "Break instruction trap",
|
[9] = "Break instruction trap",
|
||||||
[10] "Privileged operation trap",
|
[10] = "Privileged operation trap",
|
||||||
[11] "Privileged register trap",
|
[11] = "Privileged register trap",
|
||||||
[12] "Overflow trap",
|
[12] = "Overflow trap",
|
||||||
[13] "Conditional trap",
|
[13] = "Conditional trap",
|
||||||
[14] "FP Assist Exception trap",
|
[14] = "FP Assist Exception trap",
|
||||||
[15] "Data TLB miss fault",
|
[15] = "Data TLB miss fault",
|
||||||
[16] "Non-access ITLB miss fault",
|
[16] = "Non-access ITLB miss fault",
|
||||||
[17] "Non-access DTLB miss fault",
|
[17] = "Non-access DTLB miss fault",
|
||||||
[18] "Data memory protection/unaligned access trap",
|
[18] = "Data memory protection/unaligned access trap",
|
||||||
[19] "Data memory break trap",
|
[19] = "Data memory break trap",
|
||||||
[20] "TLB dirty bit trap",
|
[20] = "TLB dirty bit trap",
|
||||||
[21] "Page reference trap",
|
[21] = "Page reference trap",
|
||||||
[22] "Assist emulation trap",
|
[22] = "Assist emulation trap",
|
||||||
[25] "Taken branch trap",
|
[25] = "Taken branch trap",
|
||||||
[26] "Data memory access rights trap",
|
[26] = "Data memory access rights trap",
|
||||||
[27] "Data memory protection ID trap",
|
[27] = "Data memory protection ID trap",
|
||||||
[28] "Unaligned data reference trap",
|
[28] = "Unaligned data reference trap",
|
||||||
};
|
};
|
||||||
|
|
||||||
const char *trap_name(unsigned long code)
|
const char *trap_name(unsigned long code)
|
||||||
|
@ -523,10 +523,6 @@ void mark_rodata_ro(void)
|
|||||||
void *parisc_vmalloc_start __ro_after_init;
|
void *parisc_vmalloc_start __ro_after_init;
|
||||||
EXPORT_SYMBOL(parisc_vmalloc_start);
|
EXPORT_SYMBOL(parisc_vmalloc_start);
|
||||||
|
|
||||||
#ifdef CONFIG_PA11
|
|
||||||
unsigned long pcxl_dma_start __ro_after_init;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void __init mem_init(void)
|
void __init mem_init(void)
|
||||||
{
|
{
|
||||||
/* Do sanity checks on IPC (compat) structures */
|
/* Do sanity checks on IPC (compat) structures */
|
||||||
|
@ -27,7 +27,7 @@
|
|||||||
*/
|
*/
|
||||||
void __iomem *ioremap(unsigned long phys_addr, unsigned long size)
|
void __iomem *ioremap(unsigned long phys_addr, unsigned long size)
|
||||||
{
|
{
|
||||||
void __iomem *addr;
|
uintptr_t addr;
|
||||||
struct vm_struct *area;
|
struct vm_struct *area;
|
||||||
unsigned long offset, last_addr;
|
unsigned long offset, last_addr;
|
||||||
pgprot_t pgprot;
|
pgprot_t pgprot;
|
||||||
@ -79,10 +79,9 @@ void __iomem *ioremap(unsigned long phys_addr, unsigned long size)
|
|||||||
if (!area)
|
if (!area)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
addr = (void __iomem *) area->addr;
|
addr = (uintptr_t) area->addr;
|
||||||
if (ioremap_page_range((unsigned long)addr, (unsigned long)addr + size,
|
if (ioremap_page_range(addr, addr + size, phys_addr, pgprot)) {
|
||||||
phys_addr, pgprot)) {
|
vunmap(area->addr);
|
||||||
vunmap(addr);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -121,6 +121,8 @@ module_param(sba_reserve_agpgart, int, 0444);
|
|||||||
MODULE_PARM_DESC(sba_reserve_agpgart, "Reserve half of IO pdir as AGPGART");
|
MODULE_PARM_DESC(sba_reserve_agpgart, "Reserve half of IO pdir as AGPGART");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
struct proc_dir_entry *proc_runway_root __ro_after_init;
|
||||||
|
struct proc_dir_entry *proc_mckinley_root __ro_after_init;
|
||||||
|
|
||||||
/************************************
|
/************************************
|
||||||
** SBA register read and write support
|
** SBA register read and write support
|
||||||
@ -1968,11 +1970,15 @@ static int __init sba_driver_callback(struct parisc_device *dev)
|
|||||||
#ifdef CONFIG_PROC_FS
|
#ifdef CONFIG_PROC_FS
|
||||||
switch (dev->id.hversion) {
|
switch (dev->id.hversion) {
|
||||||
case PLUTO_MCKINLEY_PORT:
|
case PLUTO_MCKINLEY_PORT:
|
||||||
|
if (!proc_mckinley_root)
|
||||||
|
proc_mckinley_root = proc_mkdir("bus/mckinley", NULL);
|
||||||
root = proc_mckinley_root;
|
root = proc_mckinley_root;
|
||||||
break;
|
break;
|
||||||
case ASTRO_RUNWAY_PORT:
|
case ASTRO_RUNWAY_PORT:
|
||||||
case IKE_MERCED_PORT:
|
case IKE_MERCED_PORT:
|
||||||
default:
|
default:
|
||||||
|
if (!proc_runway_root)
|
||||||
|
proc_runway_root = proc_mkdir("bus/runway", NULL);
|
||||||
root = proc_runway_root;
|
root = proc_runway_root;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user