Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
f2ed8beb
Commit
f2ed8beb
authored
Apr 06, 2017
by
Al Viro
Browse files
Options
Browse Files
Download
Plain Diff
Merge commit '
a7d2475a
' into uaccess.powerpc
backmerge of sorting the arch/powerpc/Kconfig
parents
527b5bae
a7d2475a
Changes
20
Show whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
729 additions
and
124 deletions
+729
-124
arch/powerpc/Kconfig
arch/powerpc/Kconfig
+72
-66
arch/powerpc/Makefile
arch/powerpc/Makefile
+10
-1
arch/powerpc/include/asm/checksum.h
arch/powerpc/include/asm/checksum.h
+1
-1
arch/powerpc/include/asm/cpuidle.h
arch/powerpc/include/asm/cpuidle.h
+2
-2
arch/powerpc/include/asm/elf.h
arch/powerpc/include/asm/elf.h
+2
-2
arch/powerpc/include/asm/nohash/pgtable.h
arch/powerpc/include/asm/nohash/pgtable.h
+1
-1
arch/powerpc/include/asm/ppc-opcode.h
arch/powerpc/include/asm/ppc-opcode.h
+7
-0
arch/powerpc/include/asm/prom.h
arch/powerpc/include/asm/prom.h
+12
-6
arch/powerpc/kernel/idle_book3s.S
arch/powerpc/kernel/idle_book3s.S
+6
-4
arch/powerpc/kernel/prom_init.c
arch/powerpc/kernel/prom_init.c
+113
-7
arch/powerpc/kernel/setup_64.c
arch/powerpc/kernel/setup_64.c
+4
-1
arch/powerpc/lib/Makefile
arch/powerpc/lib/Makefile
+1
-0
arch/powerpc/lib/sstep.c
arch/powerpc/lib/sstep.c
+0
-20
arch/powerpc/lib/test_emulate_step.c
arch/powerpc/lib/test_emulate_step.c
+434
-0
arch/powerpc/mm/init_64.c
arch/powerpc/mm/init_64.c
+30
-6
arch/powerpc/mm/pgtable-radix.c
arch/powerpc/mm/pgtable-radix.c
+4
-0
arch/powerpc/platforms/powernv/opal-wrappers.S
arch/powerpc/platforms/powernv/opal-wrappers.S
+2
-2
arch/powerpc/sysdev/xics/icp-opal.c
arch/powerpc/sysdev/xics/icp-opal.c
+10
-0
arch/powerpc/sysdev/xics/xics-common.c
arch/powerpc/sysdev/xics/xics-common.c
+14
-3
tools/testing/selftests/powerpc/harness.c
tools/testing/selftests/powerpc/harness.c
+4
-2
No files found.
arch/powerpc/Kconfig
View file @
f2ed8beb
...
...
@@ -80,93 +80,99 @@ config ARCH_HAS_DMA_SET_COHERENT_MASK
config PPC
bool
default y
select BUILDTIME_EXTABLE_SORT
#
# Please keep this list sorted alphabetically.
#
select ARCH_HAS_DEVMEM_IS_ALLOWED
select ARCH_HAS_DMA_SET_COHERENT_MASK
select ARCH_HAS_ELF_RANDOMIZE
select ARCH_HAS_GCOV_PROFILE_ALL
select ARCH_HAS_SCALED_CPUTIME if VIRT_CPU_ACCOUNTING_NATIVE
select ARCH_HAS_SG_CHAIN
select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST
select ARCH_HAS_UBSAN_SANITIZE_ALL
select ARCH_HAVE_NMI_SAFE_CMPXCHG
select ARCH_MIGHT_HAVE_PC_PARPORT
select ARCH_MIGHT_HAVE_PC_SERIO
select ARCH_SUPPORTS_ATOMIC_RMW
select ARCH_SUPPORTS_DEFERRED_STRUCT_PAGE_INIT
select ARCH_USE_BUILTIN_BSWAP
select ARCH_USE_CMPXCHG_LOCKREF if PPC64
select ARCH_WANT_IPC_PARSE_VERSION
select BINFMT_ELF
select ARCH_HAS_ELF_RANDOMIZE
select OF
select OF_EARLY_FLATTREE
select OF_RESERVED_MEM
select HAVE_FTRACE_MCOUNT_RECORD
select BUILDTIME_EXTABLE_SORT
select CLONE_BACKWARDS
select DCACHE_WORD_ACCESS if PPC64 && CPU_LITTLE_ENDIAN
select EDAC_ATOMIC_SCRUB
select EDAC_SUPPORT
select GENERIC_ATOMIC64 if PPC32
select GENERIC_CLOCKEVENTS
select GENERIC_CLOCKEVENTS_BROADCAST if SMP
select GENERIC_CMOS_UPDATE
select GENERIC_CPU_AUTOPROBE
select GENERIC_IRQ_SHOW
select GENERIC_IRQ_SHOW_LEVEL
select GENERIC_SMP_IDLE_THREAD
select GENERIC_STRNCPY_FROM_USER
select GENERIC_STRNLEN_USER
select GENERIC_TIME_VSYSCALL_OLD
select HAVE_ARCH_AUDITSYSCALL
select HAVE_ARCH_HARDENED_USERCOPY
select HAVE_ARCH_JUMP_LABEL
select HAVE_ARCH_KGDB
select HAVE_ARCH_SECCOMP_FILTER
select HAVE_ARCH_TRACEHOOK
select HAVE_CBPF_JIT if !PPC64
select HAVE_CONTEXT_TRACKING if PPC64
select HAVE_DEBUG_KMEMLEAK
select HAVE_DEBUG_STACKOVERFLOW
select HAVE_DMA_API_DEBUG
select HAVE_DYNAMIC_FTRACE
select HAVE_DYNAMIC_FTRACE_WITH_REGS if MPROFILE_KERNEL
select HAVE_FUNCTION_TRACER
select HAVE_EBPF_JIT if PPC64
select HAVE_EFFICIENT_UNALIGNED_ACCESS if !(CPU_LITTLE_ENDIAN && POWER7_CPU)
select HAVE_FTRACE_MCOUNT_RECORD
select HAVE_FUNCTION_GRAPH_TRACER
select HAVE_FUNCTION_TRACER
select HAVE_GCC_PLUGINS
select
SYSCTL_EXCEPTION_TRACE
select
VIRT_TO_BUS if !PPC64
select
HAVE_GENERIC_RCU_GUP
select
HAVE_HW_BREAKPOINT if PERF_EVENTS && (PPC_BOOK3S || PPC_8xx)
select HAVE_IDE
select HAVE_IOREMAP_PROT
select HAVE_EFFICIENT_UNALIGNED_ACCESS if !(CPU_LITTLE_ENDIAN && POWER7_CPU)
select HAVE_IRQ_EXIT_ON_IRQ_STACK
select HAVE_KERNEL_GZIP
select HAVE_KPROBES
select HAVE_OPTPROBES if PPC64
select HAVE_ARCH_KGDB
select HAVE_KRETPROBES
select HAVE_
ARCH_TRACEHOOK
select HAVE_
LIVEPATCH if HAVE_DYNAMIC_FTRACE_WITH_REGS
select HAVE_MEMBLOCK
select HAVE_MEMBLOCK_NODE_MAP
select HAVE_DMA_API_DEBUG
select HAVE_MOD_ARCH_SPECIFIC
select HAVE_NMI if PERF_EVENTS
select HAVE_OPROFILE
select HAVE_DEBUG_KMEMLEAK
select ARCH_HAS_SG_CHAIN
select GENERIC_ATOMIC64 if PPC32
select HAVE_OPTPROBES if PPC64
select HAVE_PERF_EVENTS
select HAVE_PERF_EVENTS_NMI if PPC64
select HAVE_PERF_REGS
select HAVE_PERF_USER_STACK_DUMP
select HAVE_RCU_TABLE_FREE if SMP
select HAVE_REGS_AND_STACK_ACCESS_API
select HAVE_HW_BREAKPOINT if PERF_EVENTS && (PPC_BOOK3S || PPC_8xx)
select ARCH_WANT_IPC_PARSE_VERSION
select SPARSE_IRQ
select HAVE_SYSCALL_TRACEPOINTS
select HAVE_VIRT_CPU_ACCOUNTING
select IRQ_DOMAIN
select GENERIC_IRQ_SHOW
select GENERIC_IRQ_SHOW_LEVEL
select IRQ_FORCED_THREADING
select HAVE_RCU_TABLE_FREE if SMP
select HAVE_SYSCALL_TRACEPOINTS
select HAVE_CBPF_JIT if !PPC64
select HAVE_EBPF_JIT if PPC64
select HAVE_ARCH_JUMP_LABEL
select ARCH_HAVE_NMI_SAFE_CMPXCHG
select ARCH_HAS_GCOV_PROFILE_ALL
select GENERIC_SMP_IDLE_THREAD
select GENERIC_CMOS_UPDATE
select GENERIC_TIME_VSYSCALL_OLD
select GENERIC_CLOCKEVENTS
select GENERIC_CLOCKEVENTS_BROADCAST if SMP
select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST
select GENERIC_STRNCPY_FROM_USER
select GENERIC_STRNLEN_USER
select HAVE_MOD_ARCH_SPECIFIC
select MODULES_USE_ELF_RELA
select CLONE_BACKWARDS
select ARCH_USE_BUILTIN_BSWAP
select OLD_SIGSUSPEND
select OLD_SIGACTION if PPC32
select HAVE_DEBUG_STACKOVERFLOW
select HAVE_IRQ_EXIT_ON_IRQ_STACK
select ARCH_USE_CMPXCHG_LOCKREF if PPC64
select HAVE_ARCH_AUDITSYSCALL
select ARCH_SUPPORTS_ATOMIC_RMW
select DCACHE_WORD_ACCESS if PPC64 && CPU_LITTLE_ENDIAN
select NO_BOOTMEM
select HAVE_GENERIC_RCU_GUP
select HAVE_PERF_EVENTS_NMI if PPC64
select HAVE_NMI if PERF_EVENTS
select EDAC_SUPPORT
select EDAC_ATOMIC_SCRUB
select ARCH_HAS_DMA_SET_COHERENT_MASK
select ARCH_HAS_DEVMEM_IS_ALLOWED
select HAVE_ARCH_SECCOMP_FILTER
select ARCH_HAS_UBSAN_SANITIZE_ALL
select ARCH_SUPPORTS_DEFERRED_STRUCT_PAGE_INIT
select HAVE_LIVEPATCH if HAVE_DYNAMIC_FTRACE_WITH_REGS
select GENERIC_CPU_AUTOPROBE
select HAVE_VIRT_CPU_ACCOUNTING
select ARCH_HAS_SCALED_CPUTIME if VIRT_CPU_ACCOUNTING_NATIVE
select HAVE_ARCH_HARDENED_USERCOPY
select HAVE_KERNEL_GZIP
select HAVE_CONTEXT_TRACKING if PPC64
select OF
select OF_EARLY_FLATTREE
select OF_RESERVED_MEM
select OLD_SIGACTION if PPC32
select OLD_SIGSUSPEND
select SPARSE_IRQ
select SYSCTL_EXCEPTION_TRACE
select VIRT_TO_BUS if !PPC64
#
# Please keep this list sorted alphabetically.
#
config GENERIC_CSUM
def_bool n
...
...
arch/powerpc/Makefile
View file @
f2ed8beb
...
...
@@ -72,8 +72,15 @@ GNUTARGET := powerpc
MULTIPLEWORD
:=
-mmultiple
endif
cflags-$(CONFIG_CPU_BIG_ENDIAN)
+=
$(
call
cc-option,-mbig-endian
)
ifdef
CONFIG_PPC64
cflags-$(CONFIG_CPU_BIG_ENDIAN)
+=
$(
call
cc-option,-mabi
=
elfv1
)
cflags-$(CONFIG_CPU_BIG_ENDIAN)
+=
$(
call
cc-option,-mcall-aixdesc
)
aflags-$(CONFIG_CPU_BIG_ENDIAN)
+=
$(
call
cc-option,-mabi
=
elfv1
)
aflags-$(CONFIG_CPU_LITTLE_ENDIAN)
+=
-mabi
=
elfv2
endif
cflags-$(CONFIG_CPU_LITTLE_ENDIAN)
+=
-mlittle-endian
cflags-$(CONFIG_CPU_BIG_ENDIAN)
+=
$(
call
cc-option,-mbig-endian
)
ifneq
($(cc-name),clang)
cflags-$(CONFIG_CPU_LITTLE_ENDIAN)
+=
-mno-strict-align
endif
...
...
@@ -113,7 +120,9 @@ ifeq ($(CONFIG_CPU_LITTLE_ENDIAN),y)
CFLAGS-$(CONFIG_PPC64)
+=
$(
call
cc-option,-mabi
=
elfv2,
$(
call
cc-option,-mcall-aixdesc
))
AFLAGS-$(CONFIG_PPC64)
+=
$(
call
cc-option,-mabi
=
elfv2
)
else
CFLAGS-$(CONFIG_PPC64)
+=
$(
call
cc-option,-mabi
=
elfv1
)
CFLAGS-$(CONFIG_PPC64)
+=
$(
call
cc-option,-mcall-aixdesc
)
AFLAGS-$(CONFIG_PPC64)
+=
$(
call
cc-option,-mabi
=
elfv1
)
endif
CFLAGS-$(CONFIG_PPC64)
+=
$(
call
cc-option,-mcmodel
=
medium,
$(
call
cc-option,-mminimal-toc
))
CFLAGS-$(CONFIG_PPC64)
+=
$(
call
cc-option,-mno-pointers-to-nested-functions
)
...
...
arch/powerpc/include/asm/checksum.h
View file @
f2ed8beb
...
...
@@ -112,7 +112,7 @@ static inline __wsum csum_add(__wsum csum, __wsum addend)
#ifdef __powerpc64__
res
+=
(
__force
u64
)
addend
;
return
(
__force
__wsum
)
((
u32
)
res
+
(
res
>>
32
)
);
return
(
__force
__wsum
)
from64to32
(
res
);
#else
asm
(
"addc %0,%0,%1;"
"addze %0,%0;"
...
...
arch/powerpc/include/asm/cpuidle.h
View file @
f2ed8beb
...
...
@@ -70,8 +70,8 @@ static inline void report_invalid_psscr_val(u64 psscr_val, int err)
std r0,0(r1); \
ptesync; \
ld r0,0(r1); \
1
: cmpd cr0,r0,r0; \
bne
1
b; \
236
: cmpd cr0,r0,r0; \
bne
236
b; \
IDLE_INST; \
#define IDLE_STATE_ENTER_SEQ_NORET(IDLE_INST) \
...
...
arch/powerpc/include/asm/elf.h
View file @
f2ed8beb
...
...
@@ -144,8 +144,8 @@ extern int arch_setup_additional_pages(struct linux_binprm *bprm,
#define ARCH_DLINFO_CACHE_GEOMETRY \
NEW_AUX_ENT(AT_L1I_CACHESIZE, ppc64_caches.l1i.size); \
NEW_AUX_ENT(AT_L1I_CACHEGEOMETRY, get_cache_geometry(l1i)); \
NEW_AUX_ENT(AT_L1D_CACHESIZE, ppc64_caches.l1
i
.size); \
NEW_AUX_ENT(AT_L1D_CACHEGEOMETRY, get_cache_geometry(l1
i
)); \
NEW_AUX_ENT(AT_L1D_CACHESIZE, ppc64_caches.l1
d
.size); \
NEW_AUX_ENT(AT_L1D_CACHEGEOMETRY, get_cache_geometry(l1
d
)); \
NEW_AUX_ENT(AT_L2_CACHESIZE, ppc64_caches.l2.size); \
NEW_AUX_ENT(AT_L2_CACHEGEOMETRY, get_cache_geometry(l2)); \
NEW_AUX_ENT(AT_L3_CACHESIZE, ppc64_caches.l3.size); \
...
...
arch/powerpc/include/asm/nohash/pgtable.h
View file @
f2ed8beb
...
...
@@ -230,7 +230,7 @@ static inline int hugepd_ok(hugepd_t hpd)
return
((
hpd_val
(
hpd
)
&
0x4
)
!=
0
);
#else
/* We clear the top bit to indicate hugepd */
return
(
(
hpd_val
(
hpd
)
&
PD_HUGE
)
==
0
);
return
(
hpd_val
(
hpd
)
&&
(
hpd_val
(
hpd
)
&
PD_HUGE
)
==
0
);
#endif
}
...
...
arch/powerpc/include/asm/ppc-opcode.h
View file @
f2ed8beb
...
...
@@ -284,6 +284,13 @@
#define PPC_INST_BRANCH_COND 0x40800000
#define PPC_INST_LBZCIX 0x7c0006aa
#define PPC_INST_STBCIX 0x7c0007aa
#define PPC_INST_LWZX 0x7c00002e
#define PPC_INST_LFSX 0x7c00042e
#define PPC_INST_STFSX 0x7c00052e
#define PPC_INST_LFDX 0x7c0004ae
#define PPC_INST_STFDX 0x7c0005ae
#define PPC_INST_LVX 0x7c0000ce
#define PPC_INST_STVX 0x7c0001ce
/* macros to insert fields into opcodes */
#define ___PPC_RA(a) (((a) & 0x1f) << 16)
...
...
arch/powerpc/include/asm/prom.h
View file @
f2ed8beb
...
...
@@ -160,12 +160,18 @@ struct of_drconf_cell {
#define OV5_PFO_HW_ENCR 0x1120
/* PFO Encryption Accelerator */
#define OV5_SUB_PROCESSORS 0x1501
/* 1,2,or 4 Sub-Processors supported */
#define OV5_XIVE_EXPLOIT 0x1701
/* XIVE exploitation supported */
#define OV5_MMU_RADIX_300 0x1880
/* ISA v3.00 radix MMU supported */
#define OV5_MMU_HASH_300 0x1840
/* ISA v3.00 hash MMU supported */
#define OV5_MMU_SEGM_RADIX 0x1820
/* radix mode (no segmentation) */
#define OV5_MMU_PROC_TBL 0x1810
/* hcall selects SLB or proc table */
#define OV5_MMU_SLB 0x1800
/* always use SLB */
#define OV5_MMU_GTSE 0x1808
/* Guest translation shootdown */
/* MMU Base Architecture */
#define OV5_MMU_SUPPORT 0x18C0
/* MMU Mode Support Mask */
#define OV5_MMU_HASH 0x1800
/* Hash MMU Only */
#define OV5_MMU_RADIX 0x1840
/* Radix MMU Only */
#define OV5_MMU_EITHER 0x1880
/* Hash or Radix Supported */
#define OV5_MMU_DYNAMIC 0x18C0
/* Hash or Radix Can Switch Later */
#define OV5_NMMU 0x1820
/* Nest MMU Available */
/* Hash Table Extensions */
#define OV5_HASH_SEG_TBL 0x1980
/* In Memory Segment Tables Available */
#define OV5_HASH_GTSE 0x1940
/* Guest Translation Shoot Down Avail */
/* Radix Table Extensions */
#define OV5_RADIX_GTSE 0x1A40
/* Guest Translation Shoot Down Avail */
/* Option Vector 6: IBM PAPR hints */
#define OV6_LINUX 0x02
/* Linux is our OS */
...
...
arch/powerpc/kernel/idle_book3s.S
View file @
f2ed8beb
...
...
@@ -276,19 +276,21 @@ power_enter_stop:
*/
andis
.
r4
,
r3
,
PSSCR_EC_ESL_MASK_SHIFTED
clrldi
r3
,
r3
,
60
/*
r3
=
Bits
[
60
:
63
]
=
Requested
Level
(
RL
)
*/
bne
1
f
bne
.
Lhandle_esl_ec_set
IDLE_STATE_ENTER_SEQ
(
PPC_STOP
)
li
r3
,
0
/*
Since
we
didn
't lose state, return 0 */
b
pnv_wakeup_noloss
.
Lhandle_esl_ec_set
:
/*
*
Check
if
the
requested
state
is
a
deep
idle
state
.
*/
1
:
LOAD_REG_ADDRBASE
(
r5
,
pnv_first_deep_stop_state
)
LOAD_REG_ADDRBASE
(
r5
,
pnv_first_deep_stop_state
)
ld
r4
,
ADDROFF
(
pnv_first_deep_stop_state
)(
r5
)
cmpd
r3
,
r4
bge
2
f
bge
.
Lhandle_deep_stop
IDLE_STATE_ENTER_SEQ_NORET
(
PPC_STOP
)
2
:
.
Lhandle_deep_stop
:
/*
*
Entering
deep
idle
state
.
*
Clear
thread
bit
in
PACA_CORE_IDLE_STATE
,
save
SPRs
to
...
...
arch/powerpc/kernel/prom_init.c
View file @
f2ed8beb
...
...
@@ -168,6 +168,14 @@ static unsigned long __initdata prom_tce_alloc_start;
static
unsigned
long
__initdata
prom_tce_alloc_end
;
#endif
static
bool
__initdata
prom_radix_disable
;
struct
platform_support
{
bool
hash_mmu
;
bool
radix_mmu
;
bool
radix_gtse
;
};
/* Platforms codes are now obsolete in the kernel. Now only used within this
* file and ultimately gone too. Feel free to change them if you need, they
* are not shared with anything outside of this file anymore
...
...
@@ -626,6 +634,12 @@ static void __init early_cmdline_parse(void)
prom_memory_limit
=
ALIGN
(
prom_memory_limit
,
0x1000000
);
#endif
}
opt
=
strstr
(
prom_cmd_line
,
"disable_radix"
);
if
(
opt
)
{
prom_debug
(
"Radix disabled from cmdline
\n
"
);
prom_radix_disable
=
true
;
}
}
#if defined(CONFIG_PPC_PSERIES) || defined(CONFIG_PPC_POWERNV)
...
...
@@ -695,6 +709,8 @@ struct option_vector5 {
u8
byte22
;
u8
intarch
;
u8
mmu
;
u8
hash_ext
;
u8
radix_ext
;
}
__packed
;
struct
option_vector6
{
...
...
@@ -850,8 +866,9 @@ struct ibm_arch_vec __cacheline_aligned ibm_architecture_vec = {
.
reserved3
=
0
,
.
subprocessors
=
1
,
.
intarch
=
0
,
.
mmu
=
OV5_FEAT
(
OV5_MMU_RADIX_300
)
|
OV5_FEAT
(
OV5_MMU_HASH_300
)
|
OV5_FEAT
(
OV5_MMU_PROC_TBL
)
|
OV5_FEAT
(
OV5_MMU_GTSE
),
.
mmu
=
0
,
.
hash_ext
=
0
,
.
radix_ext
=
0
,
},
/* option vector 6: IBM PAPR hints */
...
...
@@ -990,6 +1007,92 @@ static int __init prom_count_smt_threads(void)
}
static
void
__init
prom_parse_mmu_model
(
u8
val
,
struct
platform_support
*
support
)
{
switch
(
val
)
{
case
OV5_FEAT
(
OV5_MMU_DYNAMIC
):
case
OV5_FEAT
(
OV5_MMU_EITHER
):
/* Either Available */
prom_debug
(
"MMU - either supported
\n
"
);
support
->
radix_mmu
=
!
prom_radix_disable
;
support
->
hash_mmu
=
true
;
break
;
case
OV5_FEAT
(
OV5_MMU_RADIX
):
/* Only Radix */
prom_debug
(
"MMU - radix only
\n
"
);
if
(
prom_radix_disable
)
{
/*
* If we __have__ to do radix, we're better off ignoring
* the command line rather than not booting.
*/
prom_printf
(
"WARNING: Ignoring cmdline option disable_radix
\n
"
);
}
support
->
radix_mmu
=
true
;
break
;
case
OV5_FEAT
(
OV5_MMU_HASH
):
prom_debug
(
"MMU - hash only
\n
"
);
support
->
hash_mmu
=
true
;
break
;
default:
prom_debug
(
"Unknown mmu support option: 0x%x
\n
"
,
val
);
break
;
}
}
static
void
__init
prom_parse_platform_support
(
u8
index
,
u8
val
,
struct
platform_support
*
support
)
{
switch
(
index
)
{
case
OV5_INDX
(
OV5_MMU_SUPPORT
):
/* MMU Model */
prom_parse_mmu_model
(
val
&
OV5_FEAT
(
OV5_MMU_SUPPORT
),
support
);
break
;
case
OV5_INDX
(
OV5_RADIX_GTSE
):
/* Radix Extensions */
if
(
val
&
OV5_FEAT
(
OV5_RADIX_GTSE
))
{
prom_debug
(
"Radix - GTSE supported
\n
"
);
support
->
radix_gtse
=
true
;
}
break
;
}
}
static
void
__init
prom_check_platform_support
(
void
)
{
struct
platform_support
supported
=
{
.
hash_mmu
=
false
,
.
radix_mmu
=
false
,
.
radix_gtse
=
false
};
int
prop_len
=
prom_getproplen
(
prom
.
chosen
,
"ibm,arch-vec-5-platform-support"
);
if
(
prop_len
>
1
)
{
int
i
;
u8
vec
[
prop_len
];
prom_debug
(
"Found ibm,arch-vec-5-platform-support, len: %d
\n
"
,
prop_len
);
prom_getprop
(
prom
.
chosen
,
"ibm,arch-vec-5-platform-support"
,
&
vec
,
sizeof
(
vec
));
for
(
i
=
0
;
i
<
prop_len
;
i
+=
2
)
{
prom_debug
(
"%d: index = 0x%x val = 0x%x
\n
"
,
i
/
2
,
vec
[
i
]
,
vec
[
i
+
1
]);
prom_parse_platform_support
(
vec
[
i
],
vec
[
i
+
1
],
&
supported
);
}
}
if
(
supported
.
radix_mmu
&&
supported
.
radix_gtse
)
{
/* Radix preferred - but we require GTSE for now */
prom_debug
(
"Asking for radix with GTSE
\n
"
);
ibm_architecture_vec
.
vec5
.
mmu
=
OV5_FEAT
(
OV5_MMU_RADIX
);
ibm_architecture_vec
.
vec5
.
radix_ext
=
OV5_FEAT
(
OV5_RADIX_GTSE
);
}
else
if
(
supported
.
hash_mmu
)
{
/* Default to hash mmu (if we can) */
prom_debug
(
"Asking for hash
\n
"
);
ibm_architecture_vec
.
vec5
.
mmu
=
OV5_FEAT
(
OV5_MMU_HASH
);
}
else
{
/* We're probably on a legacy hypervisor */
prom_debug
(
"Assuming legacy hash support
\n
"
);
}
}
static
void
__init
prom_send_capabilities
(
void
)
{
...
...
@@ -997,6 +1100,9 @@ static void __init prom_send_capabilities(void)
prom_arg_t
ret
;
u32
cores
;
/* Check ibm,arch-vec-5-platform-support and fixup vec5 if required */
prom_check_platform_support
();
root
=
call_prom
(
"open"
,
1
,
1
,
ADDR
(
"/"
));
if
(
root
!=
0
)
{
/* We need to tell the FW about the number of cores we support.
...
...
@@ -2993,6 +3099,11 @@ unsigned long __init prom_init(unsigned long r3, unsigned long r4,
*/
prom_check_initrd
(
r3
,
r4
);
/*
* Do early parsing of command line
*/
early_cmdline_parse
();
#if defined(CONFIG_PPC_PSERIES) || defined(CONFIG_PPC_POWERNV)
/*
* On pSeries, inform the firmware about our capabilities
...
...
@@ -3008,11 +3119,6 @@ unsigned long __init prom_init(unsigned long r3, unsigned long r4,
if
(
of_platform
!=
PLATFORM_POWERMAC
)
copy_and_flush
(
0
,
kbase
,
0x100
,
0
);
/*
* Do early parsing of command line
*/
early_cmdline_parse
();
/*
* Initialize memory management within prom_init
*/
...
...
arch/powerpc/kernel/setup_64.c
View file @
f2ed8beb
...
...
@@ -408,7 +408,10 @@ static void init_cache_info(struct ppc_cache_info *info, u32 size, u32 lsize,
info
->
line_size
=
lsize
;
info
->
block_size
=
bsize
;
info
->
log_block_size
=
__ilog2
(
bsize
);
if
(
bsize
)
info
->
blocks_per_page
=
PAGE_SIZE
/
bsize
;
else
info
->
blocks_per_page
=
0
;
if
(
sets
==
0
)
info
->
assoc
=
0xffff
;
...
...
arch/powerpc/lib/Makefile
View file @
f2ed8beb
...
...
@@ -20,6 +20,7 @@ obj64-y += copypage_64.o copyuser_64.o usercopy_64.o mem_64.o hweight_64.o \
obj64-$(CONFIG_SMP)
+=
locks.o
obj64-$(CONFIG_ALTIVEC)
+=
vmx-helper.o
obj64-$(CONFIG_KPROBES_SANITY_TEST)
+=
test_emulate_step.o
obj-y
+=
checksum_
$(BITS)
.o checksum_wrappers.o
...
...
arch/powerpc/lib/sstep.c
View file @
f2ed8beb
...
...
@@ -1799,8 +1799,6 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr)
goto
instr_done
;
case
LARX
:
if
(
regs
->
msr
&
MSR_LE
)
return
0
;
if
(
op
.
ea
&
(
size
-
1
))
break
;
/* can't handle misaligned */
if
(
!
address_ok
(
regs
,
op
.
ea
,
size
))
...
...
@@ -1823,8 +1821,6 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr)
goto
ldst_done
;
case
STCX
:
if
(
regs
->
msr
&
MSR_LE
)
return
0
;
if
(
op
.
ea
&
(
size
-
1
))
break
;
/* can't handle misaligned */
if
(
!
address_ok
(
regs
,
op
.
ea
,
size
))
...
...
@@ -1849,8 +1845,6 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr)
goto
ldst_done
;
case
LOAD
:
if
(
regs
->
msr
&
MSR_LE
)
return
0
;
err
=
read_mem
(
&
regs
->
gpr
[
op
.
reg
],
op
.
ea
,
size
,
regs
);
if
(
!
err
)
{
if
(
op
.
type
&
SIGNEXT
)
...
...
@@ -1862,8 +1856,6 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr)
#ifdef CONFIG_PPC_FPU
case
LOAD_FP
:
if
(
regs
->
msr
&
MSR_LE
)
return
0
;
if
(
size
==
4
)
err
=
do_fp_load
(
op
.
reg
,
do_lfs
,
op
.
ea
,
size
,
regs
);
else
...
...
@@ -1872,15 +1864,11 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr)
#endif
#ifdef CONFIG_ALTIVEC
case
LOAD_VMX
:
if
(
regs
->
msr
&
MSR_LE
)
return
0
;
err
=
do_vec_load
(
op
.
reg
,
do_lvx
,
op
.
ea
&
~
0xfUL
,
regs
);
goto
ldst_done
;
#endif
#ifdef CONFIG_VSX
case
LOAD_VSX
:
if
(
regs
->
msr
&
MSR_LE
)
return
0
;
err
=
do_vsx_load
(
op
.
reg
,
do_lxvd2x
,
op
.
ea
,
regs
);
goto
ldst_done
;
#endif
...
...
@@ -1903,8 +1891,6 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr)
goto
instr_done
;
case
STORE
:
if
(
regs
->
msr
&
MSR_LE
)
return
0
;
if
((
op
.
type
&
UPDATE
)
&&
size
==
sizeof
(
long
)
&&
op
.
reg
==
1
&&
op
.
update_reg
==
1
&&
!
(
regs
->
msr
&
MSR_PR
)
&&
...
...
@@ -1917,8 +1903,6 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr)
#ifdef CONFIG_PPC_FPU
case
STORE_FP
:
if
(
regs
->
msr
&
MSR_LE
)
return
0
;
if
(
size
==
4
)
err
=
do_fp_store
(
op
.
reg
,
do_stfs
,
op
.
ea
,
size
,
regs
);
else
...
...
@@ -1927,15 +1911,11 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr)
#endif
#ifdef CONFIG_ALTIVEC
case
STORE_VMX
:
if
(
regs
->
msr
&
MSR_LE
)
return
0
;
err
=
do_vec_store
(
op
.
reg
,
do_stvx
,
op
.
ea
&
~
0xfUL
,
regs
);
goto
ldst_done
;
#endif
#ifdef CONFIG_VSX
case
STORE_VSX
:
if
(
regs
->
msr
&
MSR_LE
)
return
0
;
err
=
do_vsx_store
(
op
.
reg
,
do_stxvd2x
,
op
.
ea
,
regs
);
goto
ldst_done
;
#endif
...
...
arch/powerpc/lib/test_emulate_step.c
0 → 100644
View file @
f2ed8beb
/*
* Simple sanity test for emulate_step load/store instructions.
*
* Copyright IBM Corp. 2016
*
* 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
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*/
#define pr_fmt(fmt) "emulate_step_test: " fmt
#include <linux/ptrace.h>
#include <asm/sstep.h>
#include <asm/ppc-opcode.h>
#define IMM_L(i) ((uintptr_t)(i) & 0xffff)
/*
* Defined with TEST_ prefix so it does not conflict with other
* definitions.
*/
#define TEST_LD(r, base, i) (PPC_INST_LD | ___PPC_RT(r) | \
___PPC_RA(base) | IMM_L(i))
#define TEST_LWZ(r, base, i) (PPC_INST_LWZ | ___PPC_RT(r) | \
___PPC_RA(base) | IMM_L(i))
#define TEST_LWZX(t, a, b) (PPC_INST_LWZX | ___PPC_RT(t) | \
___PPC_RA(a) | ___PPC_RB(b))
#define TEST_STD(r, base, i) (PPC_INST_STD | ___PPC_RS(r) | \
___PPC_RA(base) | ((i) & 0xfffc))
#define TEST_LDARX(t, a, b, eh) (PPC_INST_LDARX | ___PPC_RT(t) | \
___PPC_RA(a) | ___PPC_RB(b) | \
__PPC_EH(eh))
#define TEST_STDCX(s, a, b) (PPC_INST_STDCX | ___PPC_RS(s) | \
___PPC_RA(a) | ___PPC_RB(b))
#define TEST_LFSX(t, a, b) (PPC_INST_LFSX | ___PPC_RT(t) | \
___PPC_RA(a) | ___PPC_RB(b))
#define TEST_STFSX(s, a, b) (PPC_INST_STFSX | ___PPC_RS(s) | \
___PPC_RA(a) | ___PPC_RB(b))
#define TEST_LFDX(t, a, b) (PPC_INST_LFDX | ___PPC_RT(t) | \
___PPC_RA(a) | ___PPC_RB(b))
#define TEST_STFDX(s, a, b) (PPC_INST_STFDX | ___PPC_RS(s) | \
___PPC_RA(a) | ___PPC_RB(b))
#define TEST_LVX(t, a, b) (PPC_INST_LVX | ___PPC_RT(t) | \
___PPC_RA(a) | ___PPC_RB(b))
#define TEST_STVX(s, a, b) (PPC_INST_STVX | ___PPC_RS(s) | \
___PPC_RA(a) | ___PPC_RB(b))
#define TEST_LXVD2X(s, a, b) (PPC_INST_LXVD2X | VSX_XX1((s), R##a, R##b))
#define TEST_STXVD2X(s, a, b) (PPC_INST_STXVD2X | VSX_XX1((s), R##a, R##b))
static
void
__init
init_pt_regs
(
struct
pt_regs
*
regs
)
{
static
unsigned
long
msr
;
static
bool
msr_cached
;
memset
(
regs
,
0
,
sizeof
(
struct
pt_regs
));
if
(
likely
(
msr_cached
))
{
regs
->
msr
=
msr
;
return
;
}
asm
volatile
(
"mfmsr %0"
:
"=r"
(
regs
->
msr
));
regs
->
msr
|=
MSR_FP
;
regs
->
msr
|=
MSR_VEC
;
regs
->
msr
|=
MSR_VSX
;
msr
=
regs
->
msr
;
msr_cached
=
true
;
}
static
void
__init
show_result
(
char
*
ins
,
char
*
result
)
{
pr_info
(
"%-14s : %s
\n
"
,
ins
,
result
);
}
static
void
__init
test_ld
(
void
)
{
struct
pt_regs
regs
;
unsigned
long
a
=
0x23
;
int
stepped
=
-
1
;
init_pt_regs
(
&
regs
);
regs
.
gpr
[
3
]
=
(
unsigned
long
)
&
a
;
/* ld r5, 0(r3) */
stepped
=
emulate_step
(
&
regs
,
TEST_LD
(
5
,
3
,
0
));
if
(
stepped
==
1
&&
regs
.
gpr
[
5
]
==
a
)
show_result
(
"ld"
,
"PASS"
);
else
show_result
(
"ld"
,
"FAIL"
);
}
static
void
__init
test_lwz
(
void
)
{
struct
pt_regs
regs
;
unsigned
int
a
=
0x4545
;
int
stepped
=
-
1
;
init_pt_regs
(
&
regs
);
regs
.
gpr
[
3
]
=
(
unsigned
long
)
&
a
;
/* lwz r5, 0(r3) */
stepped
=
emulate_step
(
&
regs
,
TEST_LWZ
(
5
,
3
,
0
));
if
(
stepped
==
1
&&
regs
.
gpr
[
5
]
==
a
)
show_result
(
"lwz"
,
"PASS"
);
else
show_result
(
"lwz"
,
"FAIL"
);
}
static
void
__init
test_lwzx
(
void
)
{
struct
pt_regs
regs
;
unsigned
int
a
[
3
]
=
{
0x0
,
0x0
,
0x1234
};
int
stepped
=
-
1
;
init_pt_regs
(
&
regs
);
regs
.
gpr
[
3
]
=
(
unsigned
long
)
a
;
regs
.
gpr
[
4
]
=
8
;
regs
.
gpr
[
5
]
=
0x8765
;
/* lwzx r5, r3, r4 */
stepped
=
emulate_step
(
&
regs
,
TEST_LWZX
(
5
,
3
,
4
));
if
(
stepped
==
1
&&
regs
.
gpr
[
5
]
==
a
[
2
])
show_result
(
"lwzx"
,
"PASS"
);
else
show_result
(
"lwzx"
,
"FAIL"
);
}
static
void
__init
test_std
(
void
)
{
struct
pt_regs
regs
;
unsigned
long
a
=
0x1234
;
int
stepped
=
-
1
;
init_pt_regs
(
&
regs
);
regs
.
gpr
[
3
]
=
(
unsigned
long
)
&
a
;
regs
.
gpr
[
5
]
=
0x5678
;
/* std r5, 0(r3) */
stepped
=
emulate_step
(
&
regs
,
TEST_STD
(
5
,
3
,
0
));
if
(
stepped
==
1
||
regs
.
gpr
[
5
]
==
a
)
show_result
(
"std"
,
"PASS"
);
else
show_result
(
"std"
,
"FAIL"
);
}
static
void
__init
test_ldarx_stdcx
(
void
)
{
struct
pt_regs
regs
;
unsigned
long
a
=
0x1234
;
int
stepped
=
-
1
;
unsigned
long
cr0_eq
=
0x1
<<
29
;
/* eq bit of CR0 */
init_pt_regs
(
&
regs
);
asm
volatile
(
"mfcr %0"
:
"=r"
(
regs
.
ccr
));
/*** ldarx ***/
regs
.
gpr
[
3
]
=
(
unsigned
long
)
&
a
;
regs
.
gpr
[
4
]
=
0
;
regs
.
gpr
[
5
]
=
0x5678
;
/* ldarx r5, r3, r4, 0 */
stepped
=
emulate_step
(
&
regs
,
TEST_LDARX
(
5
,
3
,
4
,
0
));
/*
* Don't touch 'a' here. Touching 'a' can do Load/store
* of 'a' which result in failure of subsequent stdcx.
* Instead, use hardcoded value for comparison.
*/
if
(
stepped
<=
0
||
regs
.
gpr
[
5
]
!=
0x1234
)
{
show_result
(
"ldarx / stdcx."
,
"FAIL (ldarx)"
);
return
;
}
/*** stdcx. ***/
regs
.
gpr
[
5
]
=
0x9ABC
;
/* stdcx. r5, r3, r4 */
stepped
=
emulate_step
(
&
regs
,
TEST_STDCX
(
5
,
3
,
4
));
/*
* Two possible scenarios that indicates successful emulation
* of stdcx. :
* 1. Reservation is active and store is performed. In this
* case cr0.eq bit will be set to 1.
* 2. Reservation is not active and store is not performed.
* In this case cr0.eq bit will be set to 0.
*/
if
(
stepped
==
1
&&
((
regs
.
gpr
[
5
]
==
a
&&
(
regs
.
ccr
&
cr0_eq
))
||
(
regs
.
gpr
[
5
]
!=
a
&&
!
(
regs
.
ccr
&
cr0_eq
))))
show_result
(
"ldarx / stdcx."
,
"PASS"
);
else
show_result
(
"ldarx / stdcx."
,
"FAIL (stdcx.)"
);
}
#ifdef CONFIG_PPC_FPU
static
void
__init
test_lfsx_stfsx
(
void
)
{
struct
pt_regs
regs
;
union
{
float
a
;
int
b
;
}
c
;
int
cached_b
;
int
stepped
=
-
1
;
init_pt_regs
(
&
regs
);
/*** lfsx ***/
c
.
a
=
123
.
45
;
cached_b
=
c
.
b
;
regs
.
gpr
[
3
]
=
(
unsigned
long
)
&
c
.
a
;
regs
.
gpr
[
4
]
=
0
;
/* lfsx frt10, r3, r4 */
stepped
=
emulate_step
(
&
regs
,
TEST_LFSX
(
10
,
3
,
4
));
if
(
stepped
==
1
)
show_result
(
"lfsx"
,
"PASS"
);
else
show_result
(
"lfsx"
,
"FAIL"
);
/*** stfsx ***/
c
.
a
=
678
.
91
;
/* stfsx frs10, r3, r4 */
stepped
=
emulate_step
(
&
regs
,
TEST_STFSX
(
10
,
3
,
4
));
if
(
stepped
==
1
&&
c
.
b
==
cached_b
)
show_result
(
"stfsx"
,
"PASS"
);
else
show_result
(
"stfsx"
,
"FAIL"
);
}
static
void
__init
test_lfdx_stfdx
(
void
)
{
struct
pt_regs
regs
;
union
{
double
a
;
long
b
;
}
c
;
long
cached_b
;
int
stepped
=
-
1
;
init_pt_regs
(
&
regs
);
/*** lfdx ***/
c
.
a
=
123456
.
78
;
cached_b
=
c
.
b
;
regs
.
gpr
[
3
]
=
(
unsigned
long
)
&
c
.
a
;
regs
.
gpr
[
4
]
=
0
;
/* lfdx frt10, r3, r4 */
stepped
=
emulate_step
(
&
regs
,
TEST_LFDX
(
10
,
3
,
4
));
if
(
stepped
==
1
)
show_result
(
"lfdx"
,
"PASS"
);
else
show_result
(
"lfdx"
,
"FAIL"
);
/*** stfdx ***/
c
.
a
=
987654
.
32
;
/* stfdx frs10, r3, r4 */
stepped
=
emulate_step
(
&
regs
,
TEST_STFDX
(
10
,
3
,
4
));
if
(
stepped
==
1
&&
c
.
b
==
cached_b
)
show_result
(
"stfdx"
,
"PASS"
);
else
show_result
(
"stfdx"
,
"FAIL"
);
}
#else
static
void
__init
test_lfsx_stfsx
(
void
)
{
show_result
(
"lfsx"
,
"SKIP (CONFIG_PPC_FPU is not set)"
);
show_result
(
"stfsx"
,
"SKIP (CONFIG_PPC_FPU is not set)"
);
}
static
void
__init
test_lfdx_stfdx
(
void
)
{
show_result
(
"lfdx"
,
"SKIP (CONFIG_PPC_FPU is not set)"
);
show_result
(
"stfdx"
,
"SKIP (CONFIG_PPC_FPU is not set)"
);
}
#endif
/* CONFIG_PPC_FPU */
#ifdef CONFIG_ALTIVEC
static
void
__init
test_lvx_stvx
(
void
)
{
struct
pt_regs
regs
;
union
{
vector128
a
;
u32
b
[
4
];
}
c
;
u32
cached_b
[
4
];
int
stepped
=
-
1
;
init_pt_regs
(
&
regs
);
/*** lvx ***/
cached_b
[
0
]
=
c
.
b
[
0
]
=
923745
;
cached_b
[
1
]
=
c
.
b
[
1
]
=
2139478
;
cached_b
[
2
]
=
c
.
b
[
2
]
=
9012
;
cached_b
[
3
]
=
c
.
b
[
3
]
=
982134
;
regs
.
gpr
[
3
]
=
(
unsigned
long
)
&
c
.
a
;
regs
.
gpr
[
4
]
=
0
;
/* lvx vrt10, r3, r4 */
stepped
=
emulate_step
(
&
regs
,
TEST_LVX
(
10
,
3
,
4
));
if
(
stepped
==
1
)
show_result
(
"lvx"
,
"PASS"
);
else
show_result
(
"lvx"
,
"FAIL"
);
/*** stvx ***/
c
.
b
[
0
]
=
4987513
;
c
.
b
[
1
]
=
84313948
;
c
.
b
[
2
]
=
71
;
c
.
b
[
3
]
=
498532
;
/* stvx vrs10, r3, r4 */
stepped
=
emulate_step
(
&
regs
,
TEST_STVX
(
10
,
3
,
4
));
if
(
stepped
==
1
&&
cached_b
[
0
]
==
c
.
b
[
0
]
&&
cached_b
[
1
]
==
c
.
b
[
1
]
&&
cached_b
[
2
]
==
c
.
b
[
2
]
&&
cached_b
[
3
]
==
c
.
b
[
3
])
show_result
(
"stvx"
,
"PASS"
);
else
show_result
(
"stvx"
,
"FAIL"
);
}
#else
static
void
__init
test_lvx_stvx
(
void
)
{
show_result
(
"lvx"
,
"SKIP (CONFIG_ALTIVEC is not set)"
);
show_result
(
"stvx"
,
"SKIP (CONFIG_ALTIVEC is not set)"
);
}
#endif
/* CONFIG_ALTIVEC */
#ifdef CONFIG_VSX
static
void
__init
test_lxvd2x_stxvd2x
(
void
)
{
struct
pt_regs
regs
;
union
{
vector128
a
;
u32
b
[
4
];
}
c
;
u32
cached_b
[
4
];
int
stepped
=
-
1
;
init_pt_regs
(
&
regs
);
/*** lxvd2x ***/
cached_b
[
0
]
=
c
.
b
[
0
]
=
18233
;
cached_b
[
1
]
=
c
.
b
[
1
]
=
34863571
;
cached_b
[
2
]
=
c
.
b
[
2
]
=
834
;
cached_b
[
3
]
=
c
.
b
[
3
]
=
6138911
;
regs
.
gpr
[
3
]
=
(
unsigned
long
)
&
c
.
a
;
regs
.
gpr
[
4
]
=
0
;
/* lxvd2x vsr39, r3, r4 */
stepped
=
emulate_step
(
&
regs
,
TEST_LXVD2X
(
39
,
3
,
4
));
if
(
stepped
==
1
)
show_result
(
"lxvd2x"
,
"PASS"
);
else
show_result
(
"lxvd2x"
,
"FAIL"
);
/*** stxvd2x ***/
c
.
b
[
0
]
=
21379463
;
c
.
b
[
1
]
=
87
;
c
.
b
[
2
]
=
374234
;
c
.
b
[
3
]
=
4
;
/* stxvd2x vsr39, r3, r4 */
stepped
=
emulate_step
(
&
regs
,
TEST_STXVD2X
(
39
,
3
,
4
));
if
(
stepped
==
1
&&
cached_b
[
0
]
==
c
.
b
[
0
]
&&
cached_b
[
1
]
==
c
.
b
[
1
]
&&
cached_b
[
2
]
==
c
.
b
[
2
]
&&
cached_b
[
3
]
==
c
.
b
[
3
])
show_result
(
"stxvd2x"
,
"PASS"
);
else
show_result
(
"stxvd2x"
,
"FAIL"
);
}
#else
static
void
__init
test_lxvd2x_stxvd2x
(
void
)
{
show_result
(
"lxvd2x"
,
"SKIP (CONFIG_VSX is not set)"
);
show_result
(
"stxvd2x"
,
"SKIP (CONFIG_VSX is not set)"
);
}
#endif
/* CONFIG_VSX */
static
int
__init
test_emulate_step
(
void
)
{
test_ld
();
test_lwz
();
test_lwzx
();
test_std
();
test_ldarx_stdcx
();
test_lfsx_stfsx
();
test_lfdx_stfdx
();
test_lvx_stvx
();
test_lxvd2x_stxvd2x
();
return
0
;
}
late_initcall
(
test_emulate_step
);
arch/powerpc/mm/init_64.c
View file @
f2ed8beb
...
...
@@ -356,18 +356,42 @@ static void early_check_vec5(void)
unsigned
long
root
,
chosen
;
int
size
;
const
u8
*
vec5
;
u8
mmu_supported
;
root
=
of_get_flat_dt_root
();
chosen
=
of_get_flat_dt_subnode_by_name
(
root
,
"chosen"
);
if
(
chosen
==
-
FDT_ERR_NOTFOUND
)
if
(
chosen
==
-
FDT_ERR_NOTFOUND
)
{
cur_cpu_spec
->
mmu_features
&=
~
MMU_FTR_TYPE_RADIX
;
return
;
}
vec5
=
of_get_flat_dt_prop
(
chosen
,
"ibm,architecture-vec-5"
,
&
size
);
if
(
!
vec5
)
if
(
!
vec5
)
{
cur_cpu_spec
->
mmu_features
&=
~
MMU_FTR_TYPE_RADIX
;
return
;
if
(
size
<=
OV5_INDX
(
OV5_MMU_RADIX_300
)
||
!
(
vec5
[
OV5_INDX
(
OV5_MMU_RADIX_300
)]
&
OV5_FEAT
(
OV5_MMU_RADIX_300
)))
/* Hypervisor doesn't support radix */
}
if
(
size
<=
OV5_INDX
(
OV5_MMU_SUPPORT
))
{
cur_cpu_spec
->
mmu_features
&=
~
MMU_FTR_TYPE_RADIX
;
return
;
}
/* Check for supported configuration */
mmu_supported
=
vec5
[
OV5_INDX
(
OV5_MMU_SUPPORT
)]
&
OV5_FEAT
(
OV5_MMU_SUPPORT
);
if
(
mmu_supported
==
OV5_FEAT
(
OV5_MMU_RADIX
))
{
/* Hypervisor only supports radix - check enabled && GTSE */
if
(
!
early_radix_enabled
())
{
pr_warn
(
"WARNING: Ignoring cmdline option disable_radix
\n
"
);
}
if
(
!
(
vec5
[
OV5_INDX
(
OV5_RADIX_GTSE
)]
&
OV5_FEAT
(
OV5_RADIX_GTSE
)))
{
pr_warn
(
"WARNING: Hypervisor doesn't support RADIX with GTSE
\n
"
);
}
/* Do radix anyway - the hypervisor said we had to */
cur_cpu_spec
->
mmu_features
|=
MMU_FTR_TYPE_RADIX
;
}
else
if
(
mmu_supported
==
OV5_FEAT
(
OV5_MMU_HASH
))
{
/* Hypervisor only supports hash - disable radix */
cur_cpu_spec
->
mmu_features
&=
~
MMU_FTR_TYPE_RADIX
;
}
}
void
__init
mmu_early_init_devtree
(
void
)
...
...
@@ -383,7 +407,7 @@ void __init mmu_early_init_devtree(void)
* even though the ibm,architecture-vec-5 property created by
* skiboot doesn't have the necessary bits set.
*/
if
(
early_radix_enabled
()
&&
!
(
mfmsr
()
&
MSR_HV
))
if
(
!
(
mfmsr
()
&
MSR_HV
))
early_check_vec5
();
if
(
early_radix_enabled
())
...
...
arch/powerpc/mm/pgtable-radix.c
View file @
f2ed8beb
...
...
@@ -186,6 +186,10 @@ static void __init radix_init_pgtable(void)
*/
register_process_table
(
__pa
(
process_tb
),
0
,
PRTB_SIZE_SHIFT
-
12
);
pr_info
(
"Process table %p and radix root for kernel: %p
\n
"
,
process_tb
,
init_mm
.
pgd
);
asm
volatile
(
"ptesync"
:
:
:
"memory"
);
asm
volatile
(
PPC_TLBIE_5
(
%
0
,
%
1
,
2
,
1
,
1
)
:
:
"r"
(
TLBIEL_INVAL_SET_LPID
),
"r"
(
0
));
asm
volatile
(
"eieio; tlbsync; ptesync"
:
:
:
"memory"
);
}
static
void
__init
radix_init_partition_table
(
void
)
...
...
arch/powerpc/platforms/powernv/opal-wrappers.S
View file @
f2ed8beb
...
...
@@ -39,8 +39,8 @@ opal_tracepoint_refcount:
BEGIN_FTR_SECTION
; \
b
1
f
; \
END_FTR_SECTION
(
0
,
1)
; \
ld
r1
2
,
opal_tracepoint_refcount
@
toc
(
r2
)
; \
cmpdi
r1
2
,
0
; \
ld
r1
1
,
opal_tracepoint_refcount
@
toc
(
r2
)
; \
cmpdi
r1
1
,
0
; \
bne
-
LABEL
; \
1
:
...
...
arch/powerpc/sysdev/xics/icp-opal.c
View file @
f2ed8beb
...
...
@@ -91,6 +91,16 @@ static unsigned int icp_opal_get_irq(void)
static
void
icp_opal_set_cpu_priority
(
unsigned
char
cppr
)
{
/*
* Here be dragons. The caller has asked to allow only IPI's and not
* external interrupts. But OPAL XIVE doesn't support that. So instead
* of allowing no interrupts allow all. That's still not right, but
* currently the only caller who does this is xics_migrate_irqs_away()
* and it works in that case.
*/
if
(
cppr
>=
DEFAULT_PRIORITY
)
cppr
=
LOWEST_PRIORITY
;
xics_set_base_cppr
(
cppr
);
opal_int_set_cppr
(
cppr
);
iosync
();
...
...
arch/powerpc/sysdev/xics/xics-common.c
View file @
f2ed8beb
...
...
@@ -20,6 +20,7 @@
#include <linux/of.h>
#include <linux/slab.h>
#include <linux/spinlock.h>
#include <linux/delay.h>
#include <asm/prom.h>
#include <asm/io.h>
...
...
@@ -198,9 +199,6 @@ void xics_migrate_irqs_away(void)
/* Remove ourselves from the global interrupt queue */
xics_set_cpu_giq
(
xics_default_distrib_server
,
0
);
/* Allow IPIs again... */
icp_ops
->
set_priority
(
DEFAULT_PRIORITY
);
for_each_irq_desc
(
virq
,
desc
)
{
struct
irq_chip
*
chip
;
long
server
;
...
...
@@ -255,6 +253,19 @@ void xics_migrate_irqs_away(void)
unlock:
raw_spin_unlock_irqrestore
(
&
desc
->
lock
,
flags
);
}
/* Allow "sufficient" time to drop any inflight IRQ's */
mdelay
(
5
);
/*
* Allow IPIs again. This is done at the very end, after migrating all
* interrupts, the expectation is that we'll only get woken up by an IPI
* interrupt beyond this point, but leave externals masked just to be
* safe. If we're using icp-opal this may actually allow all
* interrupts anyway, but that should be OK.
*/
icp_ops
->
set_priority
(
DEFAULT_PRIORITY
);
}
#endif
/* CONFIG_HOTPLUG_CPU */
...
...
tools/testing/selftests/powerpc/harness.c
View file @
f2ed8beb
...
...
@@ -114,9 +114,11 @@ int test_harness(int (test_function)(void), char *name)
rc
=
run_test
(
test_function
,
name
);
if
(
rc
==
MAGIC_SKIP_RETURN_VALUE
)
if
(
rc
==
MAGIC_SKIP_RETURN_VALUE
)
{
test_skip
(
name
);
else
/* so that skipped test is not marked as failed */
rc
=
0
;
}
else
test_finish
(
name
,
rc
);
return
rc
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment