Openrisc patchees from backlog for 4.11
Subsystems (5)
Stafford Horne
maintainercover Openrisc patchees from backlog for 4.11
Hi All,
This is another set of patches which I have been pulling out of the openrisc backlogs. Its a bit of a process since I need to cleanup commit messages, review and test the patches.
The interesting things here are:
- optimized memset and memcpy routines, ~20% boot time saving
- support for cpu idling
- adding support for l.swa and l.lwa atomic operations (in spec from 2014)
- use atomics to implement: bitops, cmpxchg, futex, spinlocks
- the atomics are in preparation for SMP support
Testing:
I have used the kselftests to validate the changes especially the futex operations with the futex test. Other atomic operations are common so no explicit testing.
Note for testers:
The l.swa and l.lwa emulation is broken in qemu openrisc port. I have sent patches [1] to qemu-devel to fix the qemu issues.
[1] lists.nongnu.org/archive/html/qemu-devel/2017-01/msg02764.html
Jonas Bonn (1):
openrisc: use SPARSE_IRQ
Olof Kindgren (1):
openrisc: Add optimized memset
Sebastian Macke (2):
openrisc: Fix the bitmask for the unit present register
openrisc: Initial support for the idle state
Stafford Horne (7):
openrisc: Add optimized memcpy routine
openrisc: Add .gitignore
MAINTAINERS: Add the openrisc official repository scripts/checkstack.pl: Add openrisc support
openrisc: entry: Whitespace and comment cleanups
openrisc: entry: Fix delay slot detection
openrisc: head: Move init strings to rodata section
Stefan Kristiansson (11):
openrisc: add cache way information to cpuinfo
openrisc: tlb miss handler optimizations
openrisc: head: use THREAD_SIZE instead of magic constant
openrisc: head: refactor out tlb flush into it's own function
openrisc: add l.lwa/l.swa emulation
openrisc: add atomic bitops
openrisc: add cmpxchg and xchg implementations
openrisc: add optimized atomic operations
openrisc: add spinlock implementation
openrisc: add futex_atomic_* implementations
openrisc: remove unnecessary stddef.h include
MAINTAINERS | 1 + arch/openrisc/Kconfig | 1 + arch/openrisc/TODO.openrisc | 1 - arch/openrisc/include/asm/Kbuild | 5 +- arch/openrisc/include/asm/atomic.h | 53 +++++++ arch/openrisc/include/asm/bitops.h | 2 +- arch/openrisc/include/asm/bitops/atomic.h | 103 +++++++++++++ arch/openrisc/include/asm/cmpxchg.h | 82 ++++++++++ arch/openrisc/include/asm/cpuinfo.h | 2 + arch/openrisc/include/asm/futex.h | 135 +++++++++++++++++ arch/openrisc/include/asm/spinlock.h | 232 ++++++++++++++++++++++++++++- arch/openrisc/include/asm/spinlock_types.h | 28 ++++ arch/openrisc/include/asm/spr_defs.h | 4 +- arch/openrisc/include/asm/string.h | 10 ++ arch/openrisc/kernel/.gitignore | 1 + arch/openrisc/kernel/entry.S | 60 +++++--- arch/openrisc/kernel/head.S | 195 +++++++++--------------- arch/openrisc/kernel/or32_ksyms.c | 1 + arch/openrisc/kernel/process.c | 17 +++ arch/openrisc/kernel/ptrace.c | 1 - arch/openrisc/kernel/setup.c | 67 +++++---- arch/openrisc/kernel/traps.c | 183 +++++++++++++++++++++++ arch/openrisc/lib/Makefile | 2 +- arch/openrisc/lib/memcpy.c | 124 +++++++++++++++ arch/openrisc/lib/memset.S | 98 ++++++++++++ scripts/checkstack.pl | 3 + 26 files changed, 1224 insertions(+), 187 deletions(-) create mode 100644 arch/openrisc/include/asm/atomic.h create mode 100644 arch/openrisc/include/asm/bitops/atomic.h create mode 100644 arch/openrisc/include/asm/cmpxchg.h create mode 100644 arch/openrisc/include/asm/futex.h create mode 100644 arch/openrisc/include/asm/spinlock_types.h create mode 100644 arch/openrisc/include/asm/string.h create mode 100644 arch/openrisc/kernel/.gitignore create mode 100644 arch/openrisc/lib/memcpy.c create mode 100644 arch/openrisc/lib/memset.S
Signature · 1 line
2.9.3
Stafford Horne
maintainerPATCH 1/22 openrisc: use SPARSE_IRQ
From: Jonas Bonn <[email protected]>
The sparse IRQ framework is preferred nowadays so switch over to it.
--- arch/openrisc/Kconfig | 1 + arch/openrisc/include/asm/Kbuild | 1 + 2 files changed, 2 insertions(+)
arch/openrisc/Kconfig +1 -0
@@ -12,6 +12,7 @@ config OPENRISC select HAVE_MEMBLOCK select GPIOLIB select HAVE_ARCH_TRACEHOOK + select SPARSE_IRQ select GENERIC_IRQ_CHIP select GENERIC_IRQ_PROBE select GENERIC_IRQ_SHOW
arch/openrisc/include/asm/Kbuild +1 -0
@@ -29,6 +29,7 @@ generic-y += hw_irq.h generic-y += ioctl.h generic-y += ioctls.h generic-y += ipcbuf.h +generic-y += irq.h generic-y += irq_regs.h generic-y += irq_work.h generic-y += kdebug.h
Signature · 1 line
2.9.3
Stafford Horne
maintainerPATCH 2/22 openrisc: add cache way information to cpuinfo
In reply to Stafford HorneFrom: Stefan Kristiansson <[email protected]>
Motivation for this is to be able to print the way information properly in print_cpuinfo(), instead of hardcoding it to one.
--- arch/openrisc/include/asm/cpuinfo.h | 2 ++ arch/openrisc/kernel/setup.c | 67 ++++++++++++++++++++----------------- 2 files changed, 38 insertions(+), 31 deletions(-)
arch/openrisc/include/asm/cpuinfo.h +2 -0
@@ -24,9 +24,11 @@ struct cpuinfo {u32 icache_size;u32 icache_block_size; +u32 icache_ways;u32 dcache_size;u32 dcache_block_size; +u32 dcache_ways; };extern struct cpuinfo cpuinfo;
arch/openrisc/kernel/setup.c +36 -31
104 lines not on this page · raw message
Signature · 1 line
2.9.3
Stafford Horne
maintainerPATCH 3/22 openrisc: tlb miss handler optimizations
In reply to Stafford HorneFrom: Stefan Kristiansson <[email protected]>
By slightly reorganizing the code, the number of registers used in the tlb miss handlers can be reduced by two, thus removing the need to save them to memory.
Also, some dead and commented out code is removed.
No functional change.
--- arch/openrisc/kernel/head.S | 141 +++++++++++++++----------------------------- 1 file changed, 46 insertions(+), 95 deletions(-)
arch/openrisc/kernel/head.S +46 -95
@@ -971,8 +971,6 @@ ENTRY(dtlb_miss_handler) EXCEPTION_STORE_GPR2 EXCEPTION_STORE_GPR3 EXCEPTION_STORE_GPR4 - EXCEPTION_STORE_GPR5 - EXCEPTION_STORE_GPR6 /* * get EA of the miss */
@@ -980,91 +978,70 @@ ENTRY(dtlb_miss_handler) /* * pmd = (pmd_t *)(current_pgd + pgd_index(daddr)); */ - GET_CURRENT_PGD(r3,r5) // r3 is current_pgd, r5 is temp + GET_CURRENT_PGD(r3,r4) // r3 is current_pgd, r4 is temp l.srli r4,r2,0x18 // >> PAGE_SHIFT + (PAGE_SHIFT - 2) l.slli r4,r4,0x2 // to get address << 2 - l.add r5,r4,r3 // r4 is pgd_index(daddr) + l.add r3,r4,r3 // r4 is pgd_index(daddr) /* * if (pmd_none(*pmd)) * goto pmd_none: */ - tophys (r4,r5) + tophys (r4,r3) l.lwz r3,0x0(r4) // get *pmd value l.sfne r3,r0 l.bnf d_pmd_none - l.andi r3,r3,~PAGE_MASK //0x1fff // ~PAGE_MASK - /* - * if (pmd_bad(*pmd)) - * pmd_clear(pmd) - * goto pmd_bad: - */ -// l.sfeq r3,r0 // check *pmd value -// l.bf d_pmd_good - l.addi r3,r0,0xffffe000 // PAGE_MASK -// l.j d_pmd_bad -// l.sw 0x0(r4),r0 // clear pmd + l.addi r3,r0,0xffffe000 // PAGE_MASK + d_pmd_good: /* * pte = *pte_offset(pmd, daddr); */ l.lwz r4,0x0(r4) // get **pmd value l.and r4,r4,r3 // & PAGE_MASK - l.srli r5,r2,0xd // >> PAGE_SHIFT, r2 == EEAR - l.andi r3,r5,0x7ff // (1UL << PAGE_SHIFT - 2) - 1 + l.srli r2,r2,0xd // >> PAGE_SHIFT, r2 == EEAR + l.andi r3,r2,0x7ff // (1UL << PAGE_SHIFT - 2) - 1 l.slli r3,r3,0x2 // to get address << 2 l.add r3,r3,r4 - l.lwz r2,0x0(r3) // this is pte at last + l.lwz r3,0x0(r3) // this is pte@last /* * if (!pte_present(pte)) */ - l.andi r4,r2,0x1 + l.andi r4,r3,0x1 l.sfne r4,r0 // is pte present l.bnf d_pte_not_present - l.addi r3,r0,0xffffe3fa // PAGE_MASK | DTLB_UP_CONVERT_MASK + l.addi r4,r0,0xffffe3fa // PAGE_MASK | DTLB_UP_CONVERT_MASK /* * fill DTLB TR register */ - l.and r4,r2,r3 // apply the mask + l.and r4,r3,r4 // apply the mask // Determine number of DMMU sets - l.mfspr r6, r0, SPR_DMMUCFGR - l.andi r6, r6, SPR_DMMUCFGR_NTS - l.srli r6, r6, SPR_DMMUCFGR_NTS_OFF + l.mfspr r2, r0, SPR_DMMUCFGR + l.andi r2, r2, SPR_DMMUCFGR_NTS + l.srli r2, r2, SPR_DMMUCFGR_NTS_OFF l.ori r3, r0, 0x1 - l.sll r3, r3, r6 // r3 = number DMMU sets DMMUCFGR - l.addi r6, r3, -1 // r6 = nsets mask - l.and r5, r5, r6 // calc offset: & (NUM_TLB_ENTRIES-1) + l.sll r3, r3, r2 // r3 = number DMMU sets DMMUCFGR + l.addi r2, r3, -1 // r2 = nsets mask + l.mfspr r3, r0, SPR_EEAR_BASE + l.srli r3, r3, 0xd // >> PAGE_SHIFT + l.and r2, r3, r2 // calc offset: & (NUM_TLB_ENTRIES-1) //NUM_TLB_ENTRIES - l.mtspr r5,r4,SPR_DTLBTR_BASE(0) + l.mtspr r2,r4,SPR_DTLBTR_BASE(0) /* * fill DTLB MR register */ - l.mfspr r2,r0,SPR_EEAR_BASE - l.addi r3,r0,0xffffe000 // PAGE_MASK - l.and r4,r2,r3 // apply PAGE_MASK to EA (__PHX__ do we really need this?) - l.ori r4,r4,0x1 // set hardware valid bit: DTBL_MR entry - l.mtspr r5,r4,SPR_DTLBMR_BASE(0) + l.slli r3, r3, 0xd /* << PAGE_SHIFT => EA & PAGE_MASK */ + l.ori r4,r3,0x1 // set hardware valid bit: DTBL_MR entry + l.mtspr r2,r4,SPR_DTLBMR_BASE(0) EXCEPTION_LOAD_GPR2 EXCEPTION_LOAD_GPR3 EXCEPTION_LOAD_GPR4 - EXCEPTION_LOAD_GPR5 - EXCEPTION_LOAD_GPR6 - l.rfe -d_pmd_bad: - l.nop 1 - EXCEPTION_LOAD_GPR2 - EXCEPTION_LOAD_GPR3 - EXCEPTION_LOAD_GPR4 - EXCEPTION_LOAD_GPR5 - EXCEPTION_LOAD_GPR6 l.rfe d_pmd_none: d_pte_not_present: EXCEPTION_LOAD_GPR2 EXCEPTION_LOAD_GPR3 EXCEPTION_LOAD_GPR4 - EXCEPTION_LOAD_GPR5 - EXCEPTION_LOAD_GPR6 EXCEPTION_HANDLE(_dtlb_miss_page_fault_handler) /* ==============================================[ ITLB miss handler ]=== */
@@ -1072,8 +1049,6 @@ ENTRY(itlb_miss_handler) EXCEPTION_STORE_GPR2 EXCEPTION_STORE_GPR3 EXCEPTION_STORE_GPR4 - EXCEPTION_STORE_GPR5 - EXCEPTION_STORE_GPR6 /* * get EA of the miss */
@@ -1083,30 +1058,19 @@ ENTRY(itlb_miss_handler) * pmd = (pmd_t *)(current_pgd + pgd_index(daddr)); * */ - GET_CURRENT_PGD(r3,r5) // r3 is current_pgd, r5 is temp + GET_CURRENT_PGD(r3,r4) // r3 is current_pgd, r5 is temp l.srli r4,r2,0x18 // >> PAGE_SHIFT + (PAGE_SHIFT - 2) l.slli r4,r4,0x2 // to get address << 2 - l.add r5,r4,r3 // r4 is pgd_index(daddr) + l.add r3,r4,r3 // r4 is pgd_index(daddr) /* * if (pmd_none(*pmd)) * goto pmd_none: */ - tophys (r4,r5) + tophys (r4,r3) l.lwz r3,0x0(r4) // get *pmd value l.sfne r3,r0 l.bnf i_pmd_none - l.andi r3,r3,0x1fff // ~PAGE_MASK - /* - * if (pmd_bad(*pmd)) - * pmd_clear(pmd) - * goto pmd_bad: - */ - -// l.sfeq r3,r0 // check *pmd value -// l.bf i_pmd_good - l.addi r3,r0,0xffffe000 // PAGE_MASK -// l.j i_pmd_bad -// l.sw 0x0(r4),r0 // clear pmd + l.addi r3,r0,0xffffe000 // PAGE_MASK i_pmd_good: /*
@@ -1115,35 +1079,36 @@ i_pmd_good: */ l.lwz r4,0x0(r4) // get **pmd value l.and r4,r4,r3 // & PAGE_MASK - l.srli r5,r2,0xd // >> PAGE_SHIFT, r2 == EEAR - l.andi r3,r5,0x7ff // (1UL << PAGE_SHIFT - 2) - 1 + l.srli r2,r2,0xd // >> PAGE_SHIFT, r2 == EEAR + l.andi r3,r2,0x7ff // (1UL << PAGE_SHIFT - 2) - 1 l.slli r3,r3,0x2 // to get address << 2 l.add r3,r3,r4 - l.lwz r2,0x0(r3) // this is pte at last + l.lwz r3,0x0(r3) // this is pte@last /* * if (!pte_present(pte)) * */ - l.andi r4,r2,0x1 + l.andi r4,r3,0x1 l.sfne r4,r0 // is pte present l.bnf i_pte_not_present - l.addi r3,r0,0xffffe03a // PAGE_MASK | ITLB_UP_CONVERT_MASK + l.addi r4,r0,0xffffe03a // PAGE_MASK | ITLB_UP_CONVERT_MASK /* * fill ITLB TR register */ - l.and r4,r2,r3 // apply the mask - l.andi r3,r2,0x7c0 // _PAGE_EXEC | _PAGE_SRE | _PAGE_SWE | _PAGE_URE | _PAGE_UWE -// l.andi r3,r2,0x400 // _PAGE_EXEC + l.and r4,r3,r4 // apply the mask + l.andi r3,r3,0x7c0 // _PAGE_EXEC | _PAGE_SRE | _PAGE_SWE | _PAGE_URE | _PAGE_UWE l.sfeq r3,r0 l.bf itlb_tr_fill //_workaround // Determine number of IMMU sets - l.mfspr r6, r0, SPR_IMMUCFGR - l.andi r6, r6, SPR_IMMUCFGR_NTS - l.srli r6, r6, SPR_IMMUCFGR_NTS_OFF + l.mfspr r2, r0, SPR_IMMUCFGR + l.andi r2, r2, SPR_IMMUCFGR_NTS + l.srli r2, r2, SPR_IMMUCFGR_NTS_OFF l.ori r3, r0, 0x1 - l.sll r3, r3, r6 // r3 = number IMMU sets IMMUCFGR - l.addi r6, r3, -1 // r6 = nsets mask - l.and r5, r5, r6 // calc offset: & (NUM_TLB_ENTRIES-1) + l.sll r3, r3, r2 // r3 = number IMMU sets IMMUCFGR + l.addi r2, r3, -1 // r2 = nsets mask + l.mfspr r3, r0, SPR_EEAR_BASE + l.srli r3, r3, 0xd // >> PAGE_SHIFT + l.and r2, r3, r2 // calc offset: & (NUM_TLB_ENTRIES-1) /* * __PHX__ :: fixme
@@ -1155,38 +1120,24 @@ i_pmd_good: itlb_tr_fill_workaround: l.ori r4,r4,0xc0 // | (SPR_ITLBTR_UXE | ITLBTR_SXE) itlb_tr_fill: - l.mtspr r5,r4,SPR_ITLBTR_BASE(0) + l.mtspr r2,r4,SPR_ITLBTR_BASE(0) /* * fill DTLB MR register */ - l.mfspr r2,r0,SPR_EEAR_BASE - l.addi r3,r0,0xffffe000 // PAGE_MASK - l.and r4,r2,r3 // apply PAGE_MASK to EA (__PHX__ do we really need this?) - l.ori r4,r4,0x1 // set hardware valid bit: DTBL_MR entry - l.mtspr r5,r4,SPR_ITLBMR_BASE(0) + l.slli r3, r3, 0xd /* << PAGE_SHIFT => EA & PAGE_MASK */ + l.ori r4,r3,0x1 // set hardware valid bit: ITBL_MR entry + l.mtspr r2,r4,SPR_ITLBMR_BASE(0) EXCEPTION_LOAD_GPR2 EXCEPTION_LOAD_GPR3 EXCEPTION_LOAD_GPR4 - EXCEPTION_LOAD_GPR5 - EXCEPTION_LOAD_GPR6 l.rfe -i_pmd_bad: - l.nop 1 - EXCEPTION_LOAD_GPR2 - EXCEPTION_LOAD_GPR3 - EXCEPTION_LOAD_GPR4 - EXCEPTION_LOAD_GPR5 - EXCEPTION_LOAD_GPR6 - l.rfe i_pmd_none: i_pte_not_present: EXCEPTION_LOAD_GPR2 EXCEPTION_LOAD_GPR3 EXCEPTION_LOAD_GPR4 - EXCEPTION_LOAD_GPR5 - EXCEPTION_LOAD_GPR6 EXCEPTION_HANDLE(_itlb_miss_page_fault_handler) /* ==============================================[ boot tlb handlers ]=== */
Signature · 1 line
2.9.3
Stafford Horne
maintainerPATCH 4/22 openrisc: head: use THREAD_SIZE instead of magic constant
In reply to Stafford HorneFrom: Stefan Kristiansson <[email protected]>
The stack size was hard coded to 0x2000, use the standard THREAD_SIZE definition loaded from thread_info.h.
--- arch/openrisc/kernel/head.S | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
arch/openrisc/kernel/head.S +3 -1
@@ -24,6 +24,7 @@ #include <asm/page.h> #include <asm/mmu.h> #include <asm/pgtable.h> +#include <asm/thread_info.h> #include <asm/cache.h> #include <asm/spr_defs.h> #include <asm/asm-offsets.h>
@@ -486,7 +487,8 @@ _start: /* * set up initial ksp and current */ - LOAD_SYMBOL_2_GPR(r1,init_thread_union+0x2000) // setup kernel stack + /* setup kernel stack */ + LOAD_SYMBOL_2_GPR(r1,init_thread_union + THREAD_SIZE) LOAD_SYMBOL_2_GPR(r10,init_thread_union) // setup current tophys (r31,r10) l.sw TI_KSP(r31), r1
Signature · 1 line
2.9.3
Stafford Horne
maintainerPATCH 5/22 openrisc: head: refactor out tlb flush into it's own function
In reply to Stafford HorneFrom: Stefan Kristiansson <[email protected]>
This brings it inline with the other setup oprations done like the cache enables _ic_enable and _dc_enable. Also, this is going to make it easier to initialize additional cpu's when smp is introduced.
--- arch/openrisc/kernel/head.S | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-)
arch/openrisc/kernel/head.S +22 -16
@@ -522,22 +522,8 @@ enable_dc: l.nop flush_tlb: - /* - * I N V A L I D A T E T L B e n t r i e s - */ - LOAD_SYMBOL_2_GPR(r5,SPR_DTLBMR_BASE(0)) - LOAD_SYMBOL_2_GPR(r6,SPR_ITLBMR_BASE(0)) - l.addi r7,r0,128 /* Maximum number of sets */ -1: - l.mtspr r5,r0,0x0 - l.mtspr r6,r0,0x0 - - l.addi r5,r5,1 - l.addi r6,r6,1 - l.sfeq r7,r0 - l.bnf 1b - l.addi r7,r7,-1 - + l.jal _flush_tlb + l.nop /* The MMU needs to be enabled before or32_early_setup is called */
@@ -629,6 +615,26 @@ jump_start_kernel: l.jr r30 l.nop +_flush_tlb: + /* + * I N V A L I D A T E T L B e n t r i e s + */ + LOAD_SYMBOL_2_GPR(r5,SPR_DTLBMR_BASE(0)) + LOAD_SYMBOL_2_GPR(r6,SPR_ITLBMR_BASE(0)) + l.addi r7,r0,128 /* Maximum number of sets */ +1: + l.mtspr r5,r0,0x0 + l.mtspr r6,r0,0x0 + + l.addi r5,r5,1 + l.addi r6,r6,1 + l.sfeq r7,r0 + l.bnf 1b + l.addi r7,r7,-1 + + l.jr r9 + l.nop + /* ========================================[ cache ]=== */ /* aligment here so we don't change memory offsets with
Signature · 1 line
2.9.3
Stafford Horne
maintainerPATCH 6/22 openrisc: add l.lwa/l.swa emulation
In reply to Stafford HorneFrom: Stefan Kristiansson <[email protected]>
This adds an emulation layer for implementations that lack the l.lwa and l.swa instructions. It handles these instructions both in kernel space and user space.
--- arch/openrisc/kernel/entry.S | 22 ++++- arch/openrisc/kernel/process.c | 3 + arch/openrisc/kernel/traps.c | 183 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 206 insertions(+), 2 deletions(-)
arch/openrisc/kernel/entry.S +20 -2
@@ -173,6 +173,11 @@ handler: ;\ l.j _ret_from_exception ;\ l.nop +/* clobbers 'reg' */ +#define CLEAR_LWA_FLAG(reg) \ + l.movhi reg,hi(lwa_flag) ;\ + l.ori reg,reg,lo(lwa_flag) ;\ + l.sw 0(reg),r0 /* * NOTE: one should never assume that SPR_EPC, SPR_ESR, SPR_EEAR * contain the same values as when exception we're handling
@@ -193,6 +198,7 @@ EXCEPTION_ENTRY(_tng_kernel_start) /* ---[ 0x200: BUS exception ]------------------------------------------- */ EXCEPTION_ENTRY(_bus_fault_handler) + CLEAR_LWA_FLAG(r3) /* r4: EA of fault (set by EXCEPTION_HANDLE) */ l.jal do_bus_fault l.addi r3,r1,0 /* pt_regs */
@@ -202,11 +208,13 @@ EXCEPTION_ENTRY(_bus_fault_handler) /* ---[ 0x300: Data Page Fault exception ]------------------------------- */ EXCEPTION_ENTRY(_dtlb_miss_page_fault_handler) + CLEAR_LWA_FLAG(r3) l.and r5,r5,r0 l.j 1f l.nop EXCEPTION_ENTRY(_data_page_fault_handler) + CLEAR_LWA_FLAG(r3) /* set up parameters for do_page_fault */ l.ori r5,r0,0x300 // exception vector 1:
@@ -282,11 +290,13 @@ EXCEPTION_ENTRY(_data_page_fault_handler) /* ---[ 0x400: Insn Page Fault exception ]------------------------------- */ EXCEPTION_ENTRY(_itlb_miss_page_fault_handler) + CLEAR_LWA_FLAG(r3) l.and r5,r5,r0 l.j 1f l.nop EXCEPTION_ENTRY(_insn_page_fault_handler) + CLEAR_LWA_FLAG(r3) /* set up parameters for do_page_fault */ l.ori r5,r0,0x400 // exception vector 1:
@@ -304,6 +314,7 @@ EXCEPTION_ENTRY(_insn_page_fault_handler) /* ---[ 0x500: Timer exception ]----------------------------------------- */ EXCEPTION_ENTRY(_timer_handler) + CLEAR_LWA_FLAG(r3) l.jal timer_interrupt l.addi r3,r1,0 /* pt_regs */
@@ -313,6 +324,7 @@ EXCEPTION_ENTRY(_timer_handler) /* ---[ 0x600: Aligment exception ]-------------------------------------- */ EXCEPTION_ENTRY(_alignment_handler) + CLEAR_LWA_FLAG(r3) /* r4: EA of fault (set by EXCEPTION_HANDLE) */ l.jal do_unaligned_access l.addi r3,r1,0 /* pt_regs */
@@ -509,6 +521,7 @@ EXCEPTION_ENTRY(_external_irq_handler) // l.sw PT_SR(r1),r4 1: #endif + CLEAR_LWA_FLAG(r3) l.addi r3,r1,0 l.movhi r8,hi(do_IRQ) l.ori r8,r8,lo(do_IRQ)
@@ -556,8 +569,12 @@ ENTRY(_sys_call_handler) * they should be clobbered, otherwise */ l.sw PT_GPR3(r1),r3 - /* r4 already saved */ - /* r4 holds the EEAR address of the fault, load the original r4 */ + /* + * r4 already saved + * r4 holds the EEAR address of the fault, use it as screatch reg and + * then load the original r4 + */ + CLEAR_LWA_FLAG(r4) l.lwz r4,PT_GPR4(r1) l.sw PT_GPR5(r1),r5 l.sw PT_GPR6(r1),r6
@@ -776,6 +793,7 @@ UNHANDLED_EXCEPTION(_vector_0xd00,0xd00) /* ---[ 0xe00: Trap exception ]------------------------------------------ */ EXCEPTION_ENTRY(_trap_handler) + CLEAR_LWA_FLAG(r3) /* r4: EA of fault (set by EXCEPTION_HANDLE) */ l.jal do_trap l.addi r3,r1,0 /* pt_regs */
arch/openrisc/kernel/process.c +3 -0
@@ -226,6 +226,7 @@ int dump_fpu(struct pt_regs *regs, elf_fpregset_t * fpu)extern struct thread_info *_switch (struct thread_info *old_ti,struct thread_info *new_ti); +extern int lwa_flag;struct task_struct *__switch_to (struct task_struct *old,struct task_struct *new)
@@ -243,6 +244,8 @@ struct task_struct *__switch_to(struct task_struct *old, new_ti = new->stack; old_ti = old->stack; + lwa_flag =0 ; + current_thread_info_set[smp_processor_id ()] = new_ti; last = (_switch (old_ti, new_ti))->task;
arch/openrisc/kernel/traps.c +183 -0
199 lines not on this page · raw message
Signature · 1 line
2.9.3
Stafford Horne
maintainerPATCH 7/22 openrisc: add atomic bitops
In reply to Stafford HorneFrom: Stefan Kristiansson <[email protected]>
This utilize the load-link/store-conditional l.lwa and l.swa instructions to implement the atomic bitops.
When those instructions are not available emulation is provided.
[shorne at gmail.com: remove OPENRISC_HAVE_INST_LWA_SWA config suggesed by Alan Cox https://lkml.org/lkml/2014/7/23/666]
--- arch/openrisc/include/asm/bitops.h | 2 +- arch/openrisc/include/asm/bitops/atomic.h | 103 ++++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 arch/openrisc/include/asm/bitops/atomic.h
arch/openrisc/include/asm/bitops.h +1 -1
@@ -45,7 +45,7 @@#include <asm-generic/bitops/hweight.h> #include <asm-generic/bitops/lock.h> -#include <asm-generic/bitops/atomic.h> +#include <asm/bitops/atomic.h> #include <asm-generic/bitops/non-atomic.h> #include <asm-generic/bitops/le.h> #include <asm-generic/bitops/ext2-atomic.h>
arch/openrisc/include/asm/bitops/atomic.h new file +103 -0
103 lines not on this page · raw message
Signature · 1 line
2.9.3
Stafford Horne
maintainerPATCH 8/22 openrisc: add cmpxchg and xchg implementations
In reply to Stafford HorneFrom: Stefan Kristiansson <[email protected]>
Optimized version that make use of the l.lwa and l.swa atomic instruction pair.
Most openrisc cores provide these instructions now, if not available emulation is provided.
[shorne at gmail.com: remove OPENRISC_HAVE_INST_LWA_SWA config suggesed by Alan Cox https://lkml.org/lkml/2014/7/23/666]
[shorne at gmail.com: fixed unused calculated value compiler warning in define cmpxchg]
--- arch/openrisc/include/asm/Kbuild | 2 - arch/openrisc/include/asm/cmpxchg.h | 82 +++++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 arch/openrisc/include/asm/cmpxchg.h
arch/openrisc/include/asm/Kbuild +0 -2
@@ -10,8 +10,6 @@ generic-y += bugs.h generic-y += cacheflush.h generic-y += checksum.h generic-y += clkdev.h -generic-y += cmpxchg-local.h -generic-y += cmpxchg.h generic-y += cputime.h generic-y += current.h generic-y += device.h
arch/openrisc/include/asm/cmpxchg.h new file +82 -0
82 lines not on this page · raw message
Signature · 1 line
2.9.3
Stafford Horne
maintainerPATCH 9/22 openrisc: add optimized atomic operations
In reply to Stafford HorneFrom: Stefan Kristiansson <[email protected]>
Using the l.lwa and l.swa atomic instruction pair.
Most openrisc processor cores provide these instructions now. If the instructions are not available emulation is provided.
[shorne at gmail.com: remove OPENRISC_HAVE_INST_LWA_SWA config suggesed by Alan Cox https://lkml.org/lkml/2014/7/23/666]
--- arch/openrisc/include/asm/Kbuild | 1 - arch/openrisc/include/asm/atomic.h | 53 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 arch/openrisc/include/asm/atomic.h
arch/openrisc/include/asm/Kbuild +0 -1
@@ -1,7 +1,6 @@ header-y += ucontext.h -generic-y += atomic.h generic-y += auxvec.h generic-y += barrier.h generic-y += bitsperlong.h
arch/openrisc/include/asm/atomic.h new file +53 -0
53 lines not on this page · raw message
Signature · 1 line
2.9.3
Stafford Horne
maintainerPATCH 10/22 openrisc: add spinlock implementation
In reply to Stafford HorneFrom: Stefan Kristiansson <[email protected]>
Heavily based on the ARM implementation, this adds ticket spinlock support for OpenRISC.
--- arch/openrisc/include/asm/spinlock.h | 232 ++++++++++++++++++++++++++++- arch/openrisc/include/asm/spinlock_types.h | 28 ++++ 2 files changed, 259 insertions(+), 1 deletion(-) create mode 100644 arch/openrisc/include/asm/spinlock_types.h
arch/openrisc/include/asm/spinlock.h +231 -1
@@ -9,6 +9,9 @@* Copyright (C) 2003 Matjaz Breskvar <[email protected]> * Copyright (C) 2010-2011 Jonas Bonn <[email protected]> * et al. +* Copyright (C) 2014 Stefan Kristiansson <[email protected]> +* +* Ticket spinlocks, based on the ARM implementation. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by
@@ -19,6 +22,233 @@#ifndef __ASM_OPENRISC_SPINLOCK_H#define __ASM_OPENRISC_SPINLOCK_H -#error "or32 doesn't do SMP yet" +#include <asm/spinlock_types.h> + +#define arch_spin_unlock_wait (lock) \ + do { while (arch_spin_is_locked(lock)) cpu_relax(); } while (0) + +#define arch_spin_lock_flags (lock, flags) arch_spin_lock(lock) + +static inline void arch_spin_lock (arch_spinlock_t *lock) +{ +u32 newval; +arch_spinlock_t lockval; + + __asm__ __volatile__( +"1: l.lwa %0, 0(%2) \n" +" l.add %1, %0, %3 \n" +" l.swa 0(%2), %1 \n" +" l.bnf 1b \n" +" l.nop \n" + :"=&r" (lockval),"=&r" (newval) + :"r" (&lock->slock),"r" (1 <<TICKET_SHIFT ) + :"cc" ,"memory" ); + +while (lockval.tickets.next != lockval.tickets.owner) + lockval.tickets.owner =ACCESS_ONCE (lock->tickets.owner); + +smp_mb (); +} + +static inline int arch_spin_trylock (arch_spinlock_t *lock) +{ +unsigned long contended, tmp; +u32 slock; + +/* contended = (lock->tickets.owner != lock->tickets.next) */ + __asm__ __volatile__( +"1: l.lwa %0, 0(%3) \n" +" l.srli %1, %0, 16 \n" +" l.andi %2, %0, 0xffff \n" +" l.sfeq %1, %2 \n" +" l.bnf 1f \n" +" l.ori %1, r0, 1 \n" +" l.add %0, %0, %4 \n" +" l.swa 0(%3), %0 \n" +" l.bnf 1b \n" +" l.ori %1, r0, 0 \n" +"1: \n" + :"=&r" (slock),"=&r" (contended),"=&r" (tmp) + :"r" (&lock->slock),"r" (1 <<TICKET_SHIFT ) + :"cc" ,"memory" ); + +if (!contended) { +smp_mb (); +return 1 ; + }else { +return 0 ; + } +} + +static inline void arch_spin_unlock (arch_spinlock_t *lock) +{ +smp_mb (); + lock->tickets.owner++; +} + +static inline int arch_spin_value_unlocked (arch_spinlock_t lock) +{ +return lock.tickets.owner == lock.tickets.next; +} + +static inline int arch_spin_is_locked (arch_spinlock_t *lock) +{ +return !arch_spin_value_unlocked (ACCESS_ONCE (*lock)); +} + +static inline int arch_spin_is_contended (arch_spinlock_t *lock) +{ +struct __raw_tickets tickets =ACCESS_ONCE (lock->tickets); + +return (tickets.next - tickets.owner) >1 ; +} +#define arch_spin_is_contended arch_spin_is_contended + +/* +* RWLOCKS +* +* +* Write locks are easy - we just set bit 31. When unlocking, we can +* just write zero since the lock is exclusively held. +*/ + +static inline void arch_write_lock (arch_rwlock_t *rw) +{ +unsigned long tmp; + + __asm__ __volatile__( +"1: l.lwa %0, 0(%1) \n" +" l.sfeqi %0, 0 \n" +" l.bnf 1f \n" +" l.nop \n" +" l.swa 0(%1), %2 \n" +" l.bnf 1b \n" +" l.nop \n" +"1: \n" + :"=&r" (tmp) + :"r" (&rw->lock),"r" (0x80000000 ) + :"cc" ,"memory" ); + +smp_mb (); +} + +static inline int arch_write_trylock (arch_rwlock_t *rw) +{ +unsigned long contended; + + __asm__ __volatile__( +"1: l.lwa %0, 0(%1) \n" +" l.sfeqi %0, 0 \n" +" l.bnf 1f \n" +" l.nop \n" +" l.swa 0(%1), %2 \n" +" l.bnf 1b \n" +" l.nop \n" +"1: \n" + :"=&r" (contended) + :"r" (&rw->lock),"r" (0x80000000 ) + :"cc" ,"memory" ); + +if (!contended) { +smp_mb (); +return 1 ; + }else { +return 0 ; + } +} + +static inline void arch_write_unlock (arch_rwlock_t *rw) +{ +smp_mb (); + rw->lock =0 ; +} + +/* write_can_lock - would write_trylock() succeed? */ +#define arch_write_can_lock (x) (ACCESS_ONCE((x)->lock) == 0) + +/* +* Read locks are a bit more hairy: +* - Exclusively load the lock value. +* - Increment it. +* - Store new lock value if positive, and we still own this location. +* If the value is negative, we've already failed. +* - If we failed to store the value, we want a negative result. +* - If we failed, try again. +* Unlocking is similarly hairy. We may have multiple read locks +* currently active. However, we know we won't have any write +* locks. +*/ +static inline void arch_read_lock (arch_rwlock_t *rw) +{ +unsigned long tmp; + + __asm__ __volatile__( +"1: l.lwa %0, 0(%1) \n" +" l.sfltsi %0, -1 \n" +" l.bf 1b \n" +" l.addi %0, %0, 1 \n" +" l.swa 0(%1), %0 \n" +" l.bnf 1b \n" +" l.nop \n" + :"=&r" (tmp) + :"r" (&rw->lock) + :"cc" ,"memory" ); + +smp_mb (); +} + +static inline void arch_read_unlock (arch_rwlock_t *rw) +{ +unsigned long tmp; + +smp_mb (); + + __asm__ __volatile__( +"1: l.lwa %0, 0(%1) \n" +" l.addi %0, %0, -1 \n" +" l.swa 0(%1), %0 \n" +" l.bnf 1b \n" +" l.nop \n" + :"=&r" (tmp) + :"r" (&rw->lock) + :"cc" ,"memory" ); + +} + +static inline int arch_read_trylock (arch_rwlock_t *rw) +{ +unsigned long contended; + + __asm__ __volatile__( +"1: l.lwa %0, 0(%1) \n" +" l.sfltsi %0, -1 \n" +" l.bf 1f \n" +" l.addi %0, %0, 1 \n" +" l.swa 0(%1), %0 \n" +" l.bnf 1b \n" +" l.nop \n" +"1: \n" + :"=&r" (contended) + :"r" (&rw->lock) + :"cc" ,"memory" ); + +/* If the lock is negative, then it is already held for write. */ +if (contended <0x80000000 ) { +smp_mb (); +return 1 ; + }else { +return 0 ; + } +} + +/* read_can_lock - would read_trylock() succeed? */ +#define arch_read_can_lock (x) (ACCESS_ONCE((x)->lock) < 0x80000000) + +#define arch_read_lock_flags (lock, flags) arch_read_lock(lock) +#define arch_write_lock_flags (lock, flags) arch_write_lock(lock) + +#define arch_spin_relax (lock) cpu_relax() +#define arch_read_relax (lock) cpu_relax() +#define arch_write_relax (lock) cpu_relax()#endif
arch/openrisc/include/asm/spinlock_types.h new file +28 -0
@@ -0,0 +1,28 @@ +#ifndef __ASM_SPINLOCK_TYPES_H +#define __ASM_SPINLOCK_TYPES_H + +#ifndef __LINUX_SPINLOCK_TYPES_H +# error "please don't include this file directly" +#endif + +#define TICKET_SHIFT 16 + +typedef struct { +union { +u32 slock; +struct __raw_tickets { +u16 next; +u16 owner; + } tickets; + }; +}arch_spinlock_t ; + +#define __ARCH_SPIN_LOCK_UNLOCKED { { 0 } } + +typedef struct { +u32 lock; +}arch_rwlock_t ; + +#define __ARCH_RW_LOCK_UNLOCKED { 0 } + +#endif
Signature · 1 line
2.9.3
Stafford Horne
maintainerPATCH 11/22 openrisc: add futex_atomic_* implementations
In reply to Stafford HorneFrom: Stefan Kristiansson <[email protected]>
Support for the futex_atomic_* operations by using the load-link/store-conditional l.lwa/l.swa instructions. Most openrisc cores provide these instructions now if not available, emulation is provided.
[shorne at gmail.com: remove OPENRISC_HAVE_INST_LWA_SWA config suggesed by Alan Cox https://lkml.org/lkml/2014/7/23/666]
--- arch/openrisc/include/asm/Kbuild | 1 - arch/openrisc/include/asm/futex.h | 135 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 135 insertions(+), 1 deletion(-) create mode 100644 arch/openrisc/include/asm/futex.h
arch/openrisc/include/asm/Kbuild +0 -1
@@ -20,7 +20,6 @@ generic-y += exec.h generic-y += fb.h generic-y += fcntl.h generic-y += ftrace.h -generic-y += futex.h generic-y += hardirq.h generic-y += hw_irq.h generic-y += ioctl.h
arch/openrisc/include/asm/futex.h new file +135 -0
135 lines not on this page · raw message
Signature · 1 line
2.9.3
Stafford Horne
maintainerPATCH 12/22 openrisc: remove unnecessary stddef.h include
In reply to Stafford HorneFrom: Stefan Kristiansson <[email protected]>
This causes the build to fail when building with the or1k-musl-linux- toolchain and it is not needed.
--- arch/openrisc/kernel/ptrace.c | 1 - 1 file changed, 1 deletion(-)
arch/openrisc/kernel/ptrace.c +0 -1
@@ -16,7 +16,6 @@* 2 of the License, or (at your option) any later version. */ -#include <stddef.h> #include <linux/kernel.h> #include <linux/sched.h> #include <linux/string.h>
Signature · 1 line
2.9.3
Stafford Horne
maintainerPATCH 13/22 openrisc: Fix the bitmask for the unit present register
In reply to Stafford HorneFrom: Sebastian Macke <[email protected]>
The bits were swapped, as per spec and processor implementation the power management present bit is 9 and PIC bit is 8. This patch brings the definitions into spec.
--- arch/openrisc/include/asm/spr_defs.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/openrisc/include/asm/spr_defs.h +2 -2
@@ -152,8 +152,8 @@#define SPR_UPR_MP 0x00000020/* MAC present */ #define SPR_UPR_DUP 0x00000040/* Debug unit present */ #define SPR_UPR_PCUP 0x00000080/* Performance counters unit present */ -#define SPR_UPR_PMP 0x00000100/* Power management present */ -#define SPR_UPR_PICP 0x00000200/* PIC present */ +#define SPR_UPR_PICP 0x00000100/* PIC present */ +#define SPR_UPR_PMP 0x00000200/* Power management present */ #define SPR_UPR_TTP 0x00000400/* Tick timer present */ #define SPR_UPR_RES 0x00fe0000/* Reserved */ #define SPR_UPR_CUP 0xff000000/* Context units present */
Signature · 1 line
2.9.3
Stafford Horne
maintainerPATCH 14/22 openrisc: Initial support for the idle state
In reply to Stafford HorneFrom: Sebastian Macke <[email protected]>
This patch adds basic support for the idle state of the cpu. The patch overrides the regular idle function, enables the interupts, checks for the power management unit and enables the cpu doze mode if available.
--- arch/openrisc/kernel/process.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+)
arch/openrisc/kernel/process.c +14 -0
@@ -75,6 +75,20 @@ void machine_power_off(void) __asm__("l.nop 1" ); } +/* +* Send the doze signal to the cpu if available. +* Make sure, that all interrupts are enabled +*/ +void arch_cpu_idle (void ) +{ +unsigned long upr; + +local_irq_enable (); + upr =mfspr (SPR_UPR ); +if (upr &SPR_UPR_PMP ) +mtspr (SPR_PMR ,mfspr (SPR_PMR ) |SPR_PMR_DME ); +} +void (*pm_power_off) (void ) = machine_power_off;/*
Signature · 1 line
2.9.3
Stafford Horne
maintainerPATCH 15/22 openrisc: Add optimized memset
In reply to Stafford HorneFrom: Olof Kindgren <[email protected]>
This adds a hand-optimized assembler version of memset and sets __HAVE_ARCH_MEMSET to use this version instead of the generic C routine
--- arch/openrisc/include/asm/string.h | 7 +++ arch/openrisc/kernel/or32_ksyms.c | 1 + arch/openrisc/lib/Makefile | 2 +- arch/openrisc/lib/memset.S | 98 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 107 insertions(+), 1 deletion(-) create mode 100644 arch/openrisc/include/asm/string.h create mode 100644 arch/openrisc/lib/memset.S
arch/openrisc/include/asm/string.h new file +7 -0
@@ -0,0 +1,7 @@ +#ifndef __ASM_OPENRISC_STRING_H +#define __ASM_OPENRISC_STRING_H + +#define __HAVE_ARCH_MEMSET +extern void *memset (void *s,int c,__kernel_size_t n); + +#endif /* __ASM_OPENRISC_STRING_H */
arch/openrisc/kernel/or32_ksyms.c +1 -0
@@ -44,3 +44,4 @@ DECLARE_EXPORT(__ashldi3);DECLARE_EXPORT (__lshrdi3);EXPORT_SYMBOL (__copy_tofrom_user); +EXPORT_SYMBOL (memset);
arch/openrisc/lib/Makefile +1 -1
@@ -2,4 +2,4 @@ # Makefile for or32 specific library files.. # -obj-y = string.o delay.o +obj-y = memset.o string.o delay.o
arch/openrisc/lib/memset.S new file +98 -0
98 lines not on this page · raw message
Signature · 1 line
2.9.3
Stafford Horne
maintainerPATCH 16/22 openrisc: Add optimized memcpy routine
In reply to Stafford HorneThe generic memcpy routine provided in kernel does only byte copies. Using word copies we can lower boot time and cycles spend in memcpy quite significantly.
Booting on my de0 nano I see boot times go from 7.2 to 5.6 seconds. The avg cycles in memcpy during boot go from 6467 to 1887.
I tested several algorithms (see code in previous patch mails)
The implementations I tested and avg cycles:
- Word Copies + Loop Unrolls + Non Aligned 1882 - Word Copies + Loop Unrolls 1887 - Word Copies 2441 - Byte Copies + Loop Unrolls 6467 - Byte Copies 7600
In the end I ended up going with Word Copies + Loop Unrolls as it provides best tradeoff between simplicity and boot speedups.
--- arch/openrisc/TODO.openrisc | 1 - arch/openrisc/include/asm/string.h | 3 + arch/openrisc/lib/Makefile | 2 +- arch/openrisc/lib/memcpy.c | 124 +++++++++++++++++++++++++++++++++++++ 4 files changed, 128 insertions(+), 2 deletions(-) create mode 100644 arch/openrisc/lib/memcpy.c
arch/openrisc/TODO.openrisc +0 -1
@@ -10,4 +10,3 @@ that are due for investigation shortly, i.e. our TODO list: or1k and this change is slowly trickling through the stack. For the time being, or32 is equivalent to or1k. --- Implement optimized version of memcpy and memset
arch/openrisc/include/asm/string.h +3 -0
@@ -4,4 +4,7 @@#define __HAVE_ARCH_MEMSETextern void *memset (void *s,int c,__kernel_size_t n); +#define __HAVE_ARCH_MEMCPY +extern void *memcpy(void *dest, __const void *src, __kernel_size_t n); +#endif /* __ASM_OPENRISC_STRING_H */
arch/openrisc/lib/Makefile +1 -1
@@ -2,4 +2,4 @@ # Makefile for or32 specific library files.. # -obj-y = memset.o string.o delay.o +obj-y := delay.o string.o memset.o memcpy.o
arch/openrisc/lib/memcpy.c new file +124 -0
124 lines not on this page · raw message
Signature · 1 line
2.9.3
Stafford Horne
maintainerPATCH 17/22 openrisc: Add .gitignore
In reply to Stafford HorneThis helps to suppress the vmlinux.lds file.
--- arch/openrisc/kernel/.gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 arch/openrisc/kernel/.gitignore
arch/openrisc/kernel/.gitignore new file +1 -0
@@ -0,0 +1 @@ +vmlinux.lds
Signature · 1 line
2.9.3
Stafford Horne
maintainerPATCH 18/22 MAINTAINERS: Add the openrisc official repository
In reply to Stafford HorneThe openrisc official repository and patch work happens currently on github. Add the repo for reference.
--- MAINTAINERS | 1 + 1 file changed, 1 insertion(+)
MAINTAINERS +1 -0
@@ -9171,6 +9171,7 @@ OPENRISC ARCHITECTURE M: Jonas Bonn <[email protected]> M: Stefan Kristiansson <[email protected]> M: Stafford Horne <[email protected]> +T: git git://github.com/openrisc/linux.git L: openrisc at lists.librecores.org W: http://openrisc.io S: Maintained
Signature · 1 line
2.9.3
Stafford Horne
maintainerPATCH 19/22 scripts/checkstack.pl: Add openrisc support
In reply to Stafford HorneOpenrisc stack pointer is managed by decrementing r1. Add regexes to recognize this.
--- scripts/checkstack.pl | 3 +++ 1 file changed, 3 insertions(+)
scripts/checkstack.pl +3 -0
@@ -106,6 +106,9 @@ my (@stack, $re, $dre, $x, $xs, $funcre); } elsif ($arch eq 'sparc' || $arch eq 'sparc64') { # f0019d10: 9d e3 bf 90 save %sp, -112, %sp $re = qr/.*save.*%sp, -(([0-9]{2}|[3-9])[0-9]{2}), %sp/o; + } elsif ($arch eq 'openrisc') { + # c000043c: 9c 21 fe f0 l.addi r1,r1,-272 + $re = qr/.*l\.addi.*r1,r1,-(([0-9]{2}|[3-9])[0-9]{2})/o; } else { print("wrong or unknown architecture \"$arch\"\n"); exit
Signature · 1 line
2.9.3
Stafford Horne
maintainerPATCH 20/22 openrisc: entry: Whitespace and comment cleanups
In reply to Stafford HorneCleanups to whitespace and add some comments. Reading through the delay slot logic I noticed some things:
- Delay slot instructions were not indented
- Some comments are not lined up
- Use tabs and spaces consistent with other code
No functional change
--- arch/openrisc/kernel/entry.S | 38 ++++++++++++++++++-------------------- 1 file changed, 18 insertions(+), 20 deletions(-)
arch/openrisc/kernel/entry.S +18 -20
@@ -228,7 +228,7 @@ EXCEPTION_ENTRY(_data_page_fault_handler) * DTLB miss handler in the CONFIG_GUARD_PROTECTED_CORE part */ #ifdef CONFIG_OPENRISC_NO_SPR_SR_DSX - l.lwz r6,PT_PC(r3) // address of an offending insn + l.lwz r6,PT_PC(r3) // address of an offending insn l.lwz r6,0(r6) // instruction that caused pf l.srli r6,r6,26 // check opcode for jump insn
@@ -244,49 +244,47 @@ EXCEPTION_ENTRY(_data_page_fault_handler) l.bf 8f l.sfeqi r6,0x12 // l.jalr l.bf 8f - - l.nop + l.nop l.j 9f - l.nop -8: + l.nop - l.lwz r6,PT_PC(r3) // address of an offending insn +8: // offending insn is in delay slot + l.lwz r6,PT_PC(r3) // address of an offending insn l.addi r6,r6,4 l.lwz r6,0(r6) // instruction that caused pf l.srli r6,r6,26 // get opcode -9: +9: // offending instruction opcode loaded in r6 #else - l.mfspr r6,r0,SPR_SR // SR -// l.lwz r6,PT_SR(r3) // ESR - l.andi r6,r6,SPR_SR_DSX // check for delay slot exception - l.sfeqi r6,0x1 // exception happened in delay slot - l.bnf 7f - l.lwz r6,PT_PC(r3) // address of an offending insn + l.mfspr r6,r0,SPR_SR // SR + l.andi r6,r6,SPR_SR_DSX // check for delay slot exception + l.sfeqi r6,0x1 // exception happened in delay slot + l.bnf 7f + l.lwz r6,PT_PC(r3) // address of an offending insn - l.addi r6,r6,4 // offending insn is in delay slot + l.addi r6,r6,4 // offending insn is in delay slot 7: l.lwz r6,0(r6) // instruction that caused pf l.srli r6,r6,26 // check opcode for write access #endif - l.sfgeui r6,0x33 // check opcode for write access + l.sfgeui r6,0x33 // check opcode for write access l.bnf 1f l.sfleui r6,0x37 l.bnf 1f l.ori r6,r0,0x1 // write access l.j 2f - l.nop + l.nop 1: l.ori r6,r0,0x0 // !write access 2: /* call fault.c handler in or32/mm/fault.c */ l.jal do_page_fault - l.nop + l.nop l.j _ret_from_exception - l.nop + l.nop /* ---[ 0x400: Insn Page Fault exception ]------------------------------- */ EXCEPTION_ENTRY(_itlb_miss_page_fault_handler)
@@ -306,9 +304,9 @@ EXCEPTION_ENTRY(_insn_page_fault_handler) /* call fault.c handler in or32/mm/fault.c */ l.jal do_page_fault - l.nop + l.nop l.j _ret_from_exception - l.nop + l.nop /* ---[ 0x500: Timer exception ]----------------------------------------- */
Signature · 1 line
2.9.3
Stafford Horne
maintainerPATCH 21/22 openrisc: entry: Fix delay slot detection
In reply to Stafford HorneUse execption SR stored in pt_regs for detection, the current SR is not correct as the handler is running after return from exception.
Also, The code that checks for a delay slot uses a flag bitmask and then wants to check if the result is not zero. The test it implemented was wrong.
Correct it by changing the test to check result against non zero.
--- arch/openrisc/kernel/entry.S | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/openrisc/kernel/entry.S +2 -2
@@ -258,9 +258,9 @@ EXCEPTION_ENTRY(_data_page_fault_handler) #else - l.mfspr r6,r0,SPR_SR // SR + l.lwz r6,PT_SR(r3) // SR l.andi r6,r6,SPR_SR_DSX // check for delay slot exception - l.sfeqi r6,0x1 // exception happened in delay slot + l.sfne r6,r0 // exception happened in delay slot l.bnf 7f l.lwz r6,PT_PC(r3) // address of an offending insn
Signature · 1 line
2.9.3
Stafford Horne
maintainerPATCH 22/22 openrisc: head: Move init strings to rodata section
In reply to Stafford HorneThe strings used during the head/init phase of openrisc bootup were stored in the executable section of the binary.
This causes compilation to fail when using CONFIG_DEBUG_INFO with error:
Error: unaligned opcodes detected in executable segment
Also, this patch removes unused strings.
--- arch/openrisc/kernel/head.S | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-)
arch/openrisc/kernel/head.S +1 -11
@@ -1530,11 +1530,7 @@ ENTRY(_early_uart_init) l.jr r9 l.nop -_string_copying_linux: - .string "\n\n\n\n\n\rCopying Linux... \0" - -_string_ok_booting: - .string "Ok, booting the kernel.\n\r\0" + .section .rodata _string_unhandled_exception: .string "\n\rRunarunaround: Unhandled exception 0x\0"
@@ -1545,12 +1541,6 @@ _string_epc_prefix: _string_nl: .string "\n\r\0" - .global _string_esr_irq_bug -_string_esr_irq_bug: - .string "\n\rESR external interrupt bug, for details look into entry.S\n\r\0" - - - /* ========================================[ page aligned structures ]=== */ /*
Signature · 1 line
2.9.3
Quoted 13 lines · Stafford Horne
Hi All,
This is another set of patches which I have been pulling out of the openrisc backlogs. Its a bit of a process since I need to cleanup commit messages, review and test the patches.
The interesting things here are:
- optimized memset and memcpy routines, ~20% boot time saving
- support for cpu idling
- adding support for l.swa and l.lwa atomic operations (in spec from 2014)
- use atomics to implement: bitops, cmpxchg, futex, spinlocks
- the atomics are in preparation for SMP support
Quoted 9 lines
Testing:
I have used the kselftests to validate the changes especially the futex operations with the futex test. Other atomic operations are common so no explicit testing.Note for testers:
The l.swa and l.lwa emulation is broken in qemu openrisc port. I have sent patches [1] to qemu-devel to fix the qemu issues.
Thanks a lot for the note. Cherry-picked and applied ...
Are you going to add the series to -next ? That would give it some automatic test exposure (including the various auto-builders).
Anyway, today's -next gets a warning traceback as attached. That happens even with the above mentioned patch applied to qemu.
Guenter
---
OpenRISC Linux -- http://openrisc.io
------------[ cut here ]------------ WARNING: CPU: 0 PID: 0 at ./include/linux/jump_label.h:198 0xc02d758c static_key_slow_inc used before call to jump_label_init Modules linked in: CPU: 0 PID: 0 Comm: swapper Not tainted 4.10.0-rc3-next-20170113 #1
Stack dump [0xc0385f3c]:
sp + 00: 0xc0385f3c
sp + 04: 0xc0385f60
sp + 08: 0xc047a0b4
sp + 12: 0xc0303662
sp + 16: 0x00000000
sp + 20: 0xc02d758c
sp + 24: 0x00000009
sp + 28: 0x000000c6
sp + 32: 0xc0167bc0
sp + 36: 0xc0385f68
sp + 40: 0xc000b5d8
sp + 44: 0x00000000
sp + 48: 0x00000000
sp + 52: 0xc0303662
sp + 56: 0x000000c6
sp + 60: 0xc02d758c
sp + 64: 0xc0385f9c
sp + 68: 0xc0385fb0
sp + 72: 0xc0483954
sp + 76: 0xc04839b0
sp + 80: 0xc1fff1e0
sp + 84: 0xc047a00c
sp + 88: 0x00000000
sp + 92: 0xc000b620
sp + 96: 0xc030367f
sp + 100: 0xc0385fb0
sp + 104: 0xc0385fb0
sp + 108: 0xc0483930
sp + 112: 0xc02d758c
sp + 116: 0xc02e1cc4
sp + 120: 0x00000000
sp + 124: 0x00000000
sp + 128: 0xc03a6798
sp + 132: 0xc0385fd8
sp + 136: 0xc047a014
sp + 140: 0xc047a02c
sp + 144: 0xc03beb14
sp + 148: 0xc1fff1e0
sp + 152: 0xc03a68e0
sp + 156: 0xc02e0070
sp + 160: 0xc03b9e74
sp + 164: 0xc03beb14
sp + 168: 0xc0386000
sp + 172: 0x00000000
sp + 176: 0x00000000
sp + 180: 0x00000000
sp + 184: 0x00000000
sp + 188: 0x00000000
sp + 192: 0x00000000
[<c02d758c>]
[<c0167bc0>]
[<c000b5d8>]
[<c02d758c>]
[<c000b620>]
[<c02d758c>]
[<c03a6798>]
[<c03a68e0>]
[<c03b9e74>]
=======================
---[ end trace 0000000000000000 ]---
kbuild test robot
build botRe: [PATCH 07/22] openrisc: add atomic bitops
In reply to Stafford Horneurl: https://github.com/0day-ci/linux/commits/Stafford-Horne/Openrisc-patchees-from-backlog-for-4-11/20170115-121623 config: openrisc-or1ksim_defconfig (attached as .config) compiler: or32-linux-gcc…
Hi Stefan,
[auto build test ERROR on linus/master]
[also build test ERROR on v4.10-rc3 next-20170113]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Stafford-Horne/Openrisc-patchees-from-backlog-for-4-11/20170115-121623
config: openrisc-or1ksim_defconfig (attached as .config)
compiler: or32-linux-gcc (GCC) 4.5.1-or32-1.0rc1
reproduce:
wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
make.cross ARCH=openrisc
All errors (new ones prefixed by >>):
arch/openrisc/include/asm/bitops/atomic.h: Assembler messages:
>> arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2 `l.lwa'. >> arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2 `l.swa'. -- arch/openrisc/include/asm/bitops/atomic.h: Assembler messages: >> arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2 `l.lwa'. >> arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2 `l.swa'. >> arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2 `l.lwa'. >> arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2 `l.swa'.
--
arch/openrisc/include/asm/bitops/atomic.h: Assembler messages:
arch/openrisc/include/asm/bitops/atomic.h:90: Error: unknown opcode2 l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:92: Error: unknown opcode2 l.swa'. arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2 l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2 l.swa'. arch/openrisc/include/asm/bitops/atomic.h:90: Error: unknown opcode2 l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:92: Error: unknown opcode2 l.swa'. arch/openrisc/include/asm/bitops/atomic.h:35: Error: unknown opcode2 l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:37: Error: unknown opcode2 l.swa'. arch/openrisc/include/asm/bitops/atomic.h:35: Error: unknown opcode2 l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:37: Error: unknown opcode2 l.swa'.
>> arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2 `l.lwa'. >> arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2 `l.swa'. >> arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2 `l.lwa'. >> arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2 `l.swa'. arch/openrisc/include/asm/bitops/atomic.h:90: Error: unknown opcode2 `l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:92: Error: unknown opcode2 `l.swa'. arch/openrisc/include/asm/bitops/atomic.h:90: Error: unknown opcode2 `l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:92: Error: unknown opcode2 `l.swa'. arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2 `l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2 `l.swa'. arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2 `l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2 `l.swa'. arch/openrisc/include/asm/bitops/atomic.h:90: Error: unknown opcode2 `l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:92: Error: unknown opcode2 `l.swa'. >> arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2 `l.lwa'. >> arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2 `l.swa'. arch/openrisc/include/asm/bitops/atomic.h:35: Error: unknown opcode2 `l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:37: Error: unknown opcode2 `l.swa'. arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2 `l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2 `l.swa'. >> arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2 `l.lwa'. >> arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2 `l.swa'. >> arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2 `l.lwa'. >> arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2 `l.swa'. >> arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2 `l.lwa'. >> arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2 `l.swa'. >> arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2 `l.lwa'. >> arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2 `l.swa'. arch/openrisc/include/asm/bitops/atomic.h:35: Error: unknown opcode2 `l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:37: Error: unknown opcode2 `l.swa'. arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2 `l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2 `l.swa'. >> arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2 `l.lwa'. >> arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2 `l.swa'. arch/openrisc/include/asm/bitops/atomic.h:90: Error: unknown opcode2 `l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:92: Error: unknown opcode2 `l.swa'. >> arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2 `l.lwa'. >> arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2 `l.swa'.
net/core/dev.c: In function 'validate_xmit_skb_list':
net/core/dev.c:2989:39: warning: 'tail' may be used uninitialized in this function arch/openrisc/include/asm/bitops/atomic.h:35: Error: unknown opcode2 l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:37: Error: unknown opcode2 l.swa'. arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2 l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2 l.swa'. arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2 l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2 l.swa'. arch/openrisc/include/asm/bitops/atomic.h:35: Error: unknown opcode2 l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:37: Error: unknown opcode2 l.swa'. arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2 l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2 l.swa'.
--
arch/openrisc/include/asm/bitops/atomic.h: Assembler messages:
arch/openrisc/include/asm/bitops/atomic.h:35: Error: unknown opcode2 l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:37: Error: unknown opcode2 l.swa'.
>> arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2 `l.lwa'. >> arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2 `l.swa'. >> arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2 `l.lwa'. >> arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2 `l.swa'.
arch/openrisc/include/asm/bitops/atomic.h:35: Error: unknown opcode2 l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:37: Error: unknown opcode2 l.swa'.
--
arch/openrisc/include/asm/bitops/atomic.h: Assembler messages:
arch/openrisc/include/asm/bitops/atomic.h:35: Error: unknown opcode2 l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:37: Error: unknown opcode2 l.swa'.
>> arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2 `l.lwa'. >> arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2 `l.swa'.
arch/openrisc/include/asm/bitops/atomic.h:90: Error: unknown opcode2 l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:92: Error: unknown opcode2 l.swa'. arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2 l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2 l.swa'. arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2 l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2 l.swa'. arch/openrisc/include/asm/bitops/atomic.h:35: Error: unknown opcode2 l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:37: Error: unknown opcode2 l.swa'. arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2 l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2 l.swa'. arch/openrisc/include/asm/bitops/atomic.h:90: Error: unknown opcode2 l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:92: Error: unknown opcode2 l.swa'. arch/openrisc/include/asm/bitops/atomic.h:35: Error: unknown opcode2 l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:37: Error: unknown opcode2 l.swa'. arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2 l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2 l.swa'. arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2 l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2 l.swa'.
--
arch/openrisc/include/asm/bitops/atomic.h: Assembler messages:
arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2 l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2 l.swa'. arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2 l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2 l.swa'.
>> arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2 `l.lwa'. >> arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2 `l.swa'.
arch/openrisc/include/asm/bitops/atomic.h:90: Error: unknown opcode2 l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:92: Error: unknown opcode2 l.swa'. arch/openrisc/include/asm/bitops/atomic.h:90: Error: unknown opcode2 l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:92: Error: unknown opcode2 l.swa'.
--
arch/openrisc/include/asm/bitops/atomic.h: Assembler messages:
arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2 l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2 l.swa'.
>> arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2 `l.lwa'. >> arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2 `l.swa'. arch/openrisc/include/asm/bitops/atomic.h:35: Error: unknown opcode2 `l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:37: Error: unknown opcode2 `l.swa'. >> arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2 `l.lwa'. >> arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2 `l.swa'. >> arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2 `l.lwa'. >> arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2 `l.swa'. arch/openrisc/include/asm/bitops/atomic.h:35: Error: unknown opcode2 `l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:37: Error: unknown opcode2 `l.swa'. >> arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2 `l.lwa'. >> arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2 `l.swa'. arch/openrisc/include/asm/bitops/atomic.h:35: Error: unknown opcode2 `l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:37: Error: unknown opcode2 `l.swa'. arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2 `l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2 `l.swa'. >> arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2 `l.lwa'. >> arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2 `l.swa'. arch/openrisc/include/asm/bitops/atomic.h:35: Error: unknown opcode2 `l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:37: Error: unknown opcode2 `l.swa'. >> arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2 `l.lwa'. >> arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2 `l.swa'.
arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2 l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2 l.swa'. arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2 l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2 l.swa'.
--
arch/openrisc/include/asm/bitops/atomic.h: Assembler messages:
arch/openrisc/include/asm/bitops/atomic.h:35: Error: unknown opcode2 l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:37: Error: unknown opcode2 l.swa'. arch/openrisc/include/asm/bitops/atomic.h:35: Error: unknown opcode2 l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:37: Error: unknown opcode2 l.swa'. arch/openrisc/include/asm/bitops/atomic.h:35: Error: unknown opcode2 l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:37: Error: unknown opcode2 l.swa'. arch/openrisc/include/asm/bitops/atomic.h:35: Error: unknown opcode2 l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:37: Error: unknown opcode2 l.swa'. arch/openrisc/include/asm/bitops/atomic.h:35: Error: unknown opcode2 l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:37: Error: unknown opcode2 l.swa'. arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2 l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2 l.swa'. arch/openrisc/include/asm/bitops/atomic.h:90: Error: unknown opcode2 l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:92: Error: unknown opcode2 l.swa'. arch/openrisc/include/asm/bitops/atomic.h:35: Error: unknown opcode2 l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:37: Error: unknown opcode2 l.swa'. arch/openrisc/include/asm/bitops/atomic.h:35: Error: unknown opcode2 l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:37: Error: unknown opcode2 l.swa'. arch/openrisc/include/asm/bitops/atomic.h:90: Error: unknown opcode2 l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:92: Error: unknown opcode2 l.swa'. arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2 l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2 l.swa'. arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2 l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2 l.swa'. arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2 l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2 l.swa'. arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2 l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2 l.swa'.
>> arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2 `l.lwa'. >> arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2 `l.swa'. >> arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2 `l.lwa'. >> arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2 `l.swa'. arch/openrisc/include/asm/bitops/atomic.h:90: Error: unknown opcode2 `l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:92: Error: unknown opcode2 `l.swa'. arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2 `l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2 `l.swa'. >> arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2 `l.lwa'. >> arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2 `l.swa'. >> arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2 `l.lwa'. >> arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2 `l.swa'. arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2 `l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2 `l.swa'. >> arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2 `l.lwa'. >> arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2 `l.swa'. arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2 `l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2 `l.swa'. arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2 `l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2 `l.swa'. >> arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2 `l.lwa'. >> arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2 `l.swa'. -- arch/openrisc/include/asm/bitops/atomic.h: Assembler messages: >> arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2 `l.lwa'. >> arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2 `l.swa'.
arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2 l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2 l.swa'.
vim +70 arch/openrisc/include/asm/bitops/atomic.h
64 {
65 unsigned long mask = BIT_MASK(nr);
66 unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr);
67 unsigned long old;
68 unsigned long tmp;
69
> 70 __asm__ __volatile__(
71 "1: l.lwa %0,0(%2) \n"
> 72 " l.or %1,%0,%3 \n"
73 " l.swa 0(%2),%1 \n"
74 " l.bnf 1b \n"
75 " l.nop \n"---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
Stafford Horne
maintainerRe: [PATCH 07/22] openrisc: add atomic bitops
Hello,
Quoted 231 lines · kbuild test robot
Hi Stefan,
[auto build test ERROR on linus/master]
[also build test ERROR on v4.10-rc3 next-20170113]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]url: https://github.com/0day-ci/linux/commits/Stafford-Horne/Openrisc-patchees-from-backlog-for-4-11/20170115-121623
config: openrisc-or1ksim_defconfig (attached as .config)
compiler: or32-linux-gcc (GCC) 4.5.1-or32-1.0rc1
reproduce:
wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
make.cross ARCH=openriscAll errors (new ones prefixed by >>):
arch/openrisc/include/asm/bitops/atomic.h: Assembler messages:Quoted 2 lines
Quoted 2 lines
arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2l.swa'.--
arch/openrisc/include/asm/bitops/atomic.h: Assembler messages:Quoted 4 lines
Quoted 4 lines
arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2l.swa'.arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2l.swa'.--
arch/openrisc/include/asm/bitops/atomic.h: Assembler messages:
arch/openrisc/include/asm/bitops/atomic.h:90: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:92: Error: unknown opcode2l.swa'.arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2l.swa'.arch/openrisc/include/asm/bitops/atomic.h:90: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:92: Error: unknown opcode2l.swa'.arch/openrisc/include/asm/bitops/atomic.h:35: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:37: Error: unknown opcode2l.swa'.arch/openrisc/include/asm/bitops/atomic.h:35: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:37: Error: unknown opcode2l.swa'.Quoted 4 lines
Quoted 4 lines
arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2l.swa'.arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2l.swa'.
arch/openrisc/include/asm/bitops/atomic.h:90: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:92: Error: unknown opcode2l.swa'.arch/openrisc/include/asm/bitops/atomic.h:90: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:92: Error: unknown opcode2l.swa'.arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2l.swa'.arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2l.swa'.arch/openrisc/include/asm/bitops/atomic.h:90: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:92: Error: unknown opcode2l.swa'.Quoted 2 lines
Quoted 2 lines
arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2l.swa'.
arch/openrisc/include/asm/bitops/atomic.h:35: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:37: Error: unknown opcode2l.swa'.arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2l.swa'.Quoted 8 lines
Quoted 8 lines
arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2l.swa'.arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2l.swa'.arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2l.swa'.arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2l.swa'.
arch/openrisc/include/asm/bitops/atomic.h:35: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:37: Error: unknown opcode2l.swa'.arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2l.swa'.Quoted 2 lines
Quoted 2 lines
arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2l.swa'.
arch/openrisc/include/asm/bitops/atomic.h:90: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:92: Error: unknown opcode2l.swa'.Quoted 2 lines
Quoted 2 lines
arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2l.swa'.
net/core/dev.c: In function 'validate_xmit_skb_list':
net/core/dev.c:2989:39: warning: 'tail' may be used uninitialized in this functionarch/openrisc/include/asm/bitops/atomic.h:35: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:37: Error: unknown opcode2l.swa'.arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2l.swa'.arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2l.swa'.arch/openrisc/include/asm/bitops/atomic.h:35: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:37: Error: unknown opcode2l.swa'.arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2l.swa'.
--
arch/openrisc/include/asm/bitops/atomic.h: Assembler messages:
arch/openrisc/include/asm/bitops/atomic.h:35: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:37: Error: unknown opcode2l.swa'.Quoted 4 lines
Quoted 4 lines
arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2l.swa'.arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2l.swa'.
arch/openrisc/include/asm/bitops/atomic.h:35: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:37: Error: unknown opcode2l.swa'.
--
arch/openrisc/include/asm/bitops/atomic.h: Assembler messages:
arch/openrisc/include/asm/bitops/atomic.h:35: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:37: Error: unknown opcode2l.swa'.Quoted 2 lines
Quoted 2 lines
arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2l.swa'.
arch/openrisc/include/asm/bitops/atomic.h:90: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:92: Error: unknown opcode2l.swa'.arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2l.swa'.arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2l.swa'.arch/openrisc/include/asm/bitops/atomic.h:35: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:37: Error: unknown opcode2l.swa'.arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2l.swa'.arch/openrisc/include/asm/bitops/atomic.h:90: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:92: Error: unknown opcode2l.swa'.arch/openrisc/include/asm/bitops/atomic.h:35: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:37: Error: unknown opcode2l.swa'.arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2l.swa'.arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2l.swa'.
--
arch/openrisc/include/asm/bitops/atomic.h: Assembler messages:
arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2l.swa'.arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2l.swa'.Quoted 2 lines
Quoted 2 lines
arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2l.swa'.
arch/openrisc/include/asm/bitops/atomic.h:90: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:92: Error: unknown opcode2l.swa'.arch/openrisc/include/asm/bitops/atomic.h:90: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:92: Error: unknown opcode2l.swa'.
--
arch/openrisc/include/asm/bitops/atomic.h: Assembler messages:
arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2l.swa'.Quoted 2 lines
Quoted 2 lines
arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2l.swa'.
arch/openrisc/include/asm/bitops/atomic.h:35: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:37: Error: unknown opcode2l.swa'.Quoted 4 lines
Quoted 4 lines
arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2l.swa'.arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2l.swa'.
arch/openrisc/include/asm/bitops/atomic.h:35: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:37: Error: unknown opcode2l.swa'.Quoted 2 lines
Quoted 2 lines
arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2l.swa'.
arch/openrisc/include/asm/bitops/atomic.h:35: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:37: Error: unknown opcode2l.swa'.arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2l.swa'.Quoted 2 lines
Quoted 2 lines
arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2l.swa'.
arch/openrisc/include/asm/bitops/atomic.h:35: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:37: Error: unknown opcode2l.swa'.Quoted 2 lines
Quoted 2 lines
arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2l.swa'.
arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2l.swa'.arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2l.swa'.
--
arch/openrisc/include/asm/bitops/atomic.h: Assembler messages:
arch/openrisc/include/asm/bitops/atomic.h:35: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:37: Error: unknown opcode2l.swa'.arch/openrisc/include/asm/bitops/atomic.h:35: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:37: Error: unknown opcode2l.swa'.arch/openrisc/include/asm/bitops/atomic.h:35: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:37: Error: unknown opcode2l.swa'.arch/openrisc/include/asm/bitops/atomic.h:35: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:37: Error: unknown opcode2l.swa'.arch/openrisc/include/asm/bitops/atomic.h:35: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:37: Error: unknown opcode2l.swa'.arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2l.swa'.arch/openrisc/include/asm/bitops/atomic.h:90: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:92: Error: unknown opcode2l.swa'.arch/openrisc/include/asm/bitops/atomic.h:35: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:37: Error: unknown opcode2l.swa'.arch/openrisc/include/asm/bitops/atomic.h:35: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:37: Error: unknown opcode2l.swa'.arch/openrisc/include/asm/bitops/atomic.h:90: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:92: Error: unknown opcode2l.swa'.arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2l.swa'.arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2l.swa'.arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2l.swa'.arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2l.swa'.Quoted 4 lines
Quoted 4 lines
arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2l.swa'.arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2l.swa'.
arch/openrisc/include/asm/bitops/atomic.h:90: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:92: Error: unknown opcode2l.swa'.arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2l.swa'.Quoted 4 lines
Quoted 4 lines
arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2l.swa'.arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2l.swa'.
arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2l.swa'.Quoted 2 lines
Quoted 2 lines
arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2l.swa'.
arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2l.swa'.arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2l.swa'.Quoted 2 lines
Quoted 2 lines
arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2l.swa'.--
arch/openrisc/include/asm/bitops/atomic.h: Assembler messages:Quoted 2 lines
Quoted 2 lines
arch/openrisc/include/asm/bitops/atomic.h:70: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:72: Error: unknown opcode2l.swa'.
arch/openrisc/include/asm/bitops/atomic.h:18: Error: unknown opcode2l.lwa'. arch/openrisc/include/asm/bitops/atomic.h:20: Error: unknown opcode2l.swa'.vim +70
arch/openrisc/include/asm/bitops/atomic.h64 { 65 unsigned long mask = BIT_MASK(nr); 66 unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr); 67 unsigned long old; 68 unsigned long tmp; 69
Quoted 7 lines
Quoted 1 line
70
__asm____volatile__(71 "1: l.lwa %0,0(%2) \n"Quoted 1 line
72 " l.or %1,%0,%3 \n"
73 " l.swa 0(%2),%1 \n" 74 " l.bnf 1b \n" 75 " l.nop \n"
All of these are due to the lwa/swa instructions. A toolchain from the last 2 years would be needed to build these instructions. Can I suggest that the test chain be updated? I would suggest musl. But there are currently two options openrisc team is maintaining.
:: or1k-musl-linux- chain ::
Get it here:
https://github.com/openrisc/or1k-gcc/tree/musl-5.4.0/gcc
- build using
https://github.com/openrisc/musl-cross
(would suggest my pull request - will merge soon
https://github.com/openrisc/musl-cross/pull/1)
:: or1k-elf- chain ::
Get it here:
https://github.com/openrisc/or1k-gcc/tree/or1k-5.4.0/gcc
- build using baremetal/newlib
https://github.com/openrisc/newlib
- instructions
http://openrisc.io/newlib/building.html
- Stafford
Stafford Horne
maintainerHello Guenter,
Quoted 24 lines · Guenter Roeck
Quoted 13 lines · Stafford Horne
Hi All,
This is another set of patches which I have been pulling out of the openrisc backlogs. Its a bit of a process since I need to cleanup commit messages, review and test the patches.
The interesting things here are:
- optimized memset and memcpy routines, ~20% boot time saving
- support for cpu idling
- adding support for l.swa and l.lwa atomic operations (in spec from 2014)
- use atomics to implement: bitops, cmpxchg, futex, spinlocks
- the atomics are in preparation for SMP supportQuoted 9 lines
Testing:
I have used the kselftests to validate the changes especially the futex operations with the futex test. Other atomic operations are common so no explicit testing.Note for testers:
The l.swa and l.lwa emulation is broken in qemu openrisc port. I have sent patches [1] to qemu-devel to fix the qemu issues.
Quoted 4 lines
Thanks a lot for the note. Cherry-picked and applied ...
Are you going to add the series to -next ? That would give it some automatic test exposure (including the various auto-builders).
Yes, I was planning to push to my next branch, but I wanted to make sure I sent this note on qemu before pushing it because I was sure it would break.
Also, as found by the build robots a late version toolchain would also be required to build/test these.
Let me know if there is an issue or if you need any help with this.
:: or1k-musl-linux- chain ::
Get it here:
https://github.com/openrisc/or1k-gcc/tree/musl-5.4.0/gcc
- build using
https://github.com/openrisc/musl-cross
(would suggest my pull request - will merge soon
https://github.com/openrisc/musl-cross/pull/1)
OR
:: or1k-elf- chain ::
Get it here:
https://github.com/openrisc/or1k-gcc/tree/or1k-5.4.0/gcc
- build using baremetal/newlib
https://github.com/openrisc/newlib
- instructions
http://openrisc.io/newlib/building.html
Quoted 2 lines
Anyway, today's -next gets a warning traceback as attached. That happens even with the above mentioned patch applied to qemu.
Oh, I didnt see this. I will look into it, thanks for highlighting. I havent started testing -next yet.
-Stafford
Quoted 77 lines
OpenRISC Linux -- http://openrisc.io
------------[ cut here ]------------ WARNING: CPU: 0 PID: 0 at ./include/linux/jump_label.h:198 0xc02d758c static_key_slow_inc used before call to jump_label_init Modules linked in: CPU: 0 PID: 0 Comm: swapper Not tainted 4.10.0-rc3-next-20170113 #1Stack dump [
0xc0385f3c]:
sp + 00:0xc0385f3c
sp + 04:0xc0385f60
sp + 08:0xc047a0b4
sp + 12:0xc0303662
sp + 16:0x00000000
sp + 20:0xc02d758c
sp + 24:0x00000009
sp + 28:0x000000c6
sp + 32:0xc0167bc0
sp + 36:0xc0385f68
sp + 40:0xc000b5d8
sp + 44:0x00000000
sp + 48:0x00000000
sp + 52:0xc0303662
sp + 56:0x000000c6
sp + 60:0xc02d758c
sp + 64:0xc0385f9c
sp + 68:0xc0385fb0
sp + 72:0xc0483954
sp + 76:0xc04839b0
sp + 80:0xc1fff1e0
sp + 84:0xc047a00c
sp + 88:0x00000000
sp + 92:0xc000b620
sp + 96:0xc030367f
sp + 100:0xc0385fb0
sp + 104:0xc0385fb0
sp + 108:0xc0483930
sp + 112:0xc02d758c
sp + 116:0xc02e1cc4
sp + 120:0x00000000
sp + 124:0x00000000
sp + 128:0xc03a6798
sp + 132:0xc0385fd8
sp + 136:0xc047a014
sp + 140:0xc047a02c
sp + 144:0xc03beb14
sp + 148:0xc1fff1e0
sp + 152:0xc03a68e0
sp + 156:0xc02e0070
sp + 160:0xc03b9e74
sp + 164:0xc03beb14
sp + 168:0xc0386000
sp + 172:0x00000000
sp + 176:0x00000000
sp + 180:0x00000000
sp + 184:0x00000000
sp + 188:0x00000000
sp + 192:0x00000000[<
c02d758c>][<
c0167bc0>][<
c000b5d8>][<
c02d758c>][<
c000b620>][<
c02d758c>][<
c03a6798>][<
c03a68e0>][<
c03b9e74>]=======================
---[ end trace 0000000000000000 ]---
Stafford Horne
maintainer(+Vlastimil Babka)
Hello,
Quoted 105 lines · Guenter Roeck
Quoted 13 lines · Stafford Horne
Hi All,
This is another set of patches which I have been pulling out of the openrisc backlogs. Its a bit of a process since I need to cleanup commit messages, review and test the patches.
The interesting things here are:
- optimized memset and memcpy routines, ~20% boot time saving
- support for cpu idling
- adding support for l.swa and l.lwa atomic operations (in spec from 2014)
- use atomics to implement: bitops, cmpxchg, futex, spinlocks
- the atomics are in preparation for SMP supportQuoted 9 lines
Testing:
I have used the kselftests to validate the changes especially the futex operations with the futex test. Other atomic operations are common so no explicit testing.Note for testers:
The l.swa and l.lwa emulation is broken in qemu openrisc port. I have sent patches [1] to qemu-devel to fix the qemu issues.Thanks a lot for the note. Cherry-picked and applied ...
Are you going to add the series to -next ? That would give it some automatic test exposure (including the various auto-builders).
Anyway, today's -next gets a warning traceback as attached. That happens even with the above mentioned patch applied to qemu.
Guenter
---
OpenRISC Linux -- http://openrisc.io
------------[ cut here ]------------ WARNING: CPU: 0 PID: 0 at ./include/linux/jump_label.h:198 0xc02d758c static_key_slow_inc used before call to jump_label_init Modules linked in: CPU: 0 PID: 0 Comm: swapper Not tainted 4.10.0-rc3-next-20170113 #1Stack dump [
0xc0385f3c]:
sp + 00:0xc0385f3c
sp + 04:0xc0385f60
sp + 08:0xc047a0b4
sp + 12:0xc0303662
sp + 16:0x00000000
sp + 20:0xc02d758c
sp + 24:0x00000009
sp + 28:0x000000c6
sp + 32:0xc0167bc0
sp + 36:0xc0385f68
sp + 40:0xc000b5d8
sp + 44:0x00000000
sp + 48:0x00000000
sp + 52:0xc0303662
sp + 56:0x000000c6
sp + 60:0xc02d758c
sp + 64:0xc0385f9c
sp + 68:0xc0385fb0
sp + 72:0xc0483954
sp + 76:0xc04839b0
sp + 80:0xc1fff1e0
sp + 84:0xc047a00c
sp + 88:0x00000000
sp + 92:0xc000b620
sp + 96:0xc030367f
sp + 100:0xc0385fb0
sp + 104:0xc0385fb0
sp + 108:0xc0483930
sp + 112:0xc02d758c
sp + 116:0xc02e1cc4
sp + 120:0x00000000
sp + 124:0x00000000
sp + 128:0xc03a6798
sp + 132:0xc0385fd8
sp + 136:0xc047a014
sp + 140:0xc047a02c
sp + 144:0xc03beb14
sp + 148:0xc1fff1e0
sp + 152:0xc03a68e0
sp + 156:0xc02e0070
sp + 160:0xc03b9e74
sp + 164:0xc03beb14
sp + 168:0xc0386000
sp + 172:0x00000000
sp + 176:0x00000000
sp + 180:0x00000000
sp + 184:0x00000000
sp + 188:0x00000000
sp + 192:0x00000000[<
c02d758c>][<
c0167bc0>][<
c000b5d8>][<
c02d758c>][<
c000b620>][<
c02d758c>]
Quoted 8 lines
[<
c03a6798>][<
c03a68e0>][<
c03b9e74>]=======================
---[ end trace 0000000000000000 ]---
Annotated stack:
[<c01612cc>] dump_stack()+36 [<c000b830>] __warn()+300 [<c02c4dc8>] build_all_zonelists()+560 [<c02c4dc8>] build_all_zonelists()+560 [<c000b878>] warn_slowpath_fmt()+48 [<c02c4dc8>] build_all_zonelists()+560 [<c0396d98>] setup_per_cpu_areas()+176 [<c038e8fc>] start_kernel()+328 [<c039eb40>] early_init_dt_scan()+36
I bisected this to:
commit f5adbdff6a1c40e19a9e700bd92e8121411b1475
Author: Vlastimil Babka <[email protected]>
Date: Thu Jan 12 12:19:03 2017 +1100
mm, page_alloc: convert page_group_by_mobility_disable to static key
This change uses static keys in build_all_zonelists, but this is before jump_label_init. The below patch fixes this, but I am suprized the issue is not showing up in other targets.
init/main.c +1 -1
@@ -513,6 +513,7 @@ asmlinkage __visible void __init start_kernel(void)boot_cpu_state_init ();smp_prepare_boot_cpu ();/* arch-specific boot-cpu hooks */ +jump_label_init ();build_all_zonelists (NULL ,NULL );page_alloc_init ();
@@ -526,7 +527,6 @@ asmlinkage __visible void __init start_kernel(void)parse_args ("Setting init args" , after_dashes,NULL ,0 ,-1 ,-1 ,NULL , set_init_arg); -jump_label_init ();/* * These use large bootmem allocations and must precede
-Stafford