mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-23 15:11:16 +00:00
powerpc updates for 4.8 # 1
Highlights: - PowerNV PCI hotplug support. - Lots more Power9 support. - eBPF JIT support on ppc64le. - Lots of cxl updates. - Boot code consolidation. Bug fixes: - Fix spin_unlock_wait() from Boqun Feng - Fix stack pointer corruption in __tm_recheckpoint() from Michael Neuling - Fix multiple bugs in memory_hotplug_max() from Bharata B Rao - mm: Ensure "special" zones are empty from Oliver O'Halloran - ftrace: Separate the heuristics for checking call sites from Michael Ellerman - modules: Never restore r2 for a mprofile-kernel style mcount() call from Michael Ellerman - Fix endianness when reading TCEs from Alexey Kardashevskiy - start rtasd before PCI probing from Greg Kurz - PCI: rpaphp: Fix slot registration for multiple slots under a PHB from Tyrel Datwyler - powerpc/mm: Add memory barrier in __hugepte_alloc() from Sukadev Bhattiprolu Cleanups & fixes: - Drop support for MPIC in pseries from Rashmica Gupta - Define and use PPC64_ELF_ABI_v2/v1 from Michael Ellerman - Remove unused symbols in asm-offsets.c from Rashmica Gupta - Fix SRIOV not building without EEH enabled from Russell Currey - Remove kretprobe_trampoline_holder. from Thiago Jung Bauermann - Reduce log level of PCI I/O space warning from Benjamin Herrenschmidt - Add array bounds checking to crash_shutdown_handlers from Suraj Jitindar Singh - Avoid -maltivec when using clang integrated assembler from Anton Blanchard - Fix array overrun in ppc_rtas() syscall from Andrew Donnellan - Fix error return value in cmm_mem_going_offline() from Rasmus Villemoes - export cpu_to_core_id() from Mauricio Faria de Oliveira - Remove old symbols from defconfigs from Andrew Donnellan - Update obsolete comments in setup_32.c about entry conditions from Benjamin Herrenschmidt - Add comment explaining the purpose of setup_kdump_trampoline() from Benjamin Herrenschmidt - Merge the RELOCATABLE config entries for ppc32 and ppc64 from Kevin Hao - Remove RELOCATABLE_PPC32 from Kevin Hao - Fix .long's in tlb-radix.c to more meaningful from Balbir Singh Minor cleanups & fixes: - Andrew Donnellan, Anna-Maria Gleixner, Anton Blanchard, Benjamin Herrenschmidt, Bharata B Rao, Christophe Leroy, Colin Ian King, Geliang Tang, Greg Kurz, Madhavan Srinivasan, Michael Ellerman, Michael Ellerman, Stephen Rothwell, Stewart Smith. Freescale updates from Scott: - "Highlights include more 8xx optimizations, device tree updates, and MVME7100 support." PowerNV PCI hotplug from Gavin Shan: - PCI: Add pcibios_setup_bridge() - Override pcibios_setup_bridge() - Remove PCI_RESET_DELAY_US - Move pnv_pci_ioda_setup_opal_tce_kill() around - Increase PE# capacity - Allocate PE# in reverse order - Create PEs in pcibios_setup_bridge() - Setup PE for root bus - Extend PCI bridge resources - Make pnv_ioda_deconfigure_pe() visible - Dynamically release PE - Update bridge windows on PCI plug - Delay populating pdn - Support PCI slot ID - Use PCI slot reset infrastructure - Introduce pnv_pci_get_slot_id() - Functions to get/set PCI slot state - PCI/hotplug: PowerPC PowerNV PCI hotplug driver - Print correct PHB type names Power9 idle support from Shreyas B. Prabhu: - set power_save func after the idle states are initialized - Use PNV_THREAD_WINKLE macro while requesting for winkle - make hypervisor state restore a function - Rename idle_power7.S to idle_book3s.S - Rename reusable idle functions to hardware agnostic names - Make pnv_powersave_common more generic - abstraction for saving SPRs before entering deep idle states - Add platform support for stop instruction - cpuidle/powernv: Use CPUIDLE_STATE_MAX instead of MAX_POWERNV_IDLE_STATES - cpuidle/powernv: cleanup cpuidle-powernv.c - cpuidle/powernv: Add support for POWER ISA v3 idle states - Use deepest stop state when cpu is offlined Power9 PMU from Madhavan Srinivasan: - factor out power8 pmu macros and defines - factor out power8 pmu functions - factor out power8 __init_pmu code - Add power9 event list macros for generic and cache events - Power9 PMU support - Export Power9 generic and cache events to sysfs Power9 preliminary interrupt & PCI support from Benjamin Herrenschmidt: - Add XICS emulation APIs - Move a few exception common handlers to make room - Add support for HV virtualization interrupts - Add mechanism to force a replay of interrupts - Add ICP OPAL backend - Discover IODA3 PHBs - pci: Remove obsolete SW invalidate - opal: Add real mode call wrappers - Rename TCE invalidation calls - Remove SWINV constants and obsolete TCE code - Rework accessing the TCE invalidate register - Fallback to OPAL for TCE invalidations - Use the device-tree to get available range of M64's - Check status of a PHB before using it - pci: Don't try to allocate resources that will be reassigned Other Power9: - Send SIGBUS on unaligned copy and paste from Chris Smart - Large Decrementer support from Oliver O'Halloran - Load Monitor Register Support from Jack Miller Performance improvements from Anton Blanchard: - Avoid load hit store in __giveup_fpu() and __giveup_altivec() - Avoid load hit store in setup_sigcontext() - Remove assembly versions of strcpy, strcat, strlen and strcmp - Align hot loops of some string functions eBPF JIT from Naveen N. Rao: - Fix/enhance 32-bit Load Immediate implementation - Optimize 64-bit Immediate loads - Introduce rotate immediate instructions - A few cleanups - Isolate classic BPF JIT specifics into a separate header - Implement JIT compiler for extended BPF Operator Panel driver from Suraj Jitindar Singh: - devicetree/bindings: Add binding for operator panel on FSP machines - Add inline function to get rc from an ASYNC_COMP opal_msg - Add driver for operator panel on FSP machines Sparse fixes from Daniel Axtens: - make some things static - Introduce asm-prototypes.h - Include headers containing prototypes - Use #ifdef __BIG_ENDIAN__ #else for REG_BYTE - kvm: Clarify __user annotations - Pass endianness to sparse - Make ppc_md.{halt, restart} __noreturn MM fixes & cleanups from Aneesh Kumar K.V: - radix: Update LPCR HR bit as per ISA - use _raw variant of page table accessors - Compile out radix related functions if RADIX_MMU is disabled - Clear top 16 bits of va only on older cpus - Print formation regarding the the MMU mode - hash: Update SDR1 size encoding as documented in ISA 3.0 - radix: Update PID switch sequence - radix: Update machine call back to support new HCALL. - radix: Add LPID based tlb flush helpers - radix: Add a kernel command line to disable radix - Cleanup LPCR defines Boot code consolidation from Benjamin Herrenschmidt: - Move epapr_paravirt_early_init() to early_init_devtree() - cell: Don't use flat device-tree after boot - ge_imp3a: Don't use the flat device-tree after boot - mpc85xx_ds: Don't use the flat device-tree after boot - mpc85xx_rdb: Don't use the flat device-tree after boot - Don't test for machine type in rtas_initialize() - Don't test for machine type in smp_setup_cpu_maps() - dt: Add of_device_compatible_match() - Factor do_feature_fixup calls - Move 64-bit feature fixup earlier - Move 64-bit memory reserves to setup_arch() - Use a cachable DART - Move FW feature probing out of pseries probe() - Put exception configuration in a common place - Remove early allocation of the SMU command buffer - Move MMU backend selection out of platform code - pasemi: Remove IOBMAP allocation from platform probe() - mm/hash: Don't use machine_is() early during boot - Don't test for machine type to detect HEA special case - pmac: Remove spurrious machine type test - Move hash table ops to a separate structure - Ensure that ppc_md is empty before probing for machine type - Move 64-bit probe_machine() to later in the boot process - Move 32-bit probe() machine to later in the boot process - Get rid of ppc_md.init_early() - Move the boot time info banner to a separate function - Move setting of {i,d}cache_bsize to initialize_cache_info() - Move the content of setup_system() to setup_arch() - Move cache info inits to a separate function - Re-order the call to smp_setup_cpu_maps() - Re-order setup_panic() - Make a few boot functions __init - Merge 32-bit and 64-bit setup_arch() Other new features: - tty/hvc: Use IRQF_SHARED for OPAL hvc consoles from Sam Mendoza-Jonas - tty/hvc: Use opal irqchip interface if available from Sam Mendoza-Jonas - powerpc: Add module autoloading based on CPU features from Alastair D'Silva - crypto: vmx - Convert to CPU feature based module autoloading from Alastair D'Silva - Wake up kopald polling thread before waiting for events from Benjamin Herrenschmidt - xmon: Dump ISA 2.06 SPRs from Michael Ellerman - xmon: Dump ISA 2.07 SPRs from Michael Ellerman - Add a parameter to disable 1TB segs from Oliver O'Halloran - powerpc/boot: Add OPAL console to epapr wrappers from Oliver O'Halloran - Assign fixed PHB number based on device-tree properties from Guilherme G. Piccoli - pseries: Add pseries hotplug workqueue from John Allen - pseries: Add support for hotplug interrupt source from John Allen - pseries: Use kernel hotplug queue for PowerVM hotplug events from John Allen - pseries: Move property cloning into its own routine from Nathan Fontenot - pseries: Dynamic add entires to associativity lookup array from Nathan Fontenot - pseries: Auto-online hotplugged memory from Nathan Fontenot - pseries: Remove call to memblock_add() from Nathan Fontenot cxl: - Add set and get private data to context struct from Michael Neuling - make base more explicitly non-modular from Paul Gortmaker - Use for_each_compatible_node() macro from Wei Yongjun - Frederic Barrat - Abstract the differences between the PSL and XSL - Make vPHB device node match adapter's - Philippe Bergheaud - Add mechanism for delivering AFU driver specific events - Ignore CAPI adapters misplaced in switched slots - Refine slice error debug messages - Andrew Donnellan - static-ify variables to fix sparse warnings - PCI/hotplug: pnv_php: export symbols and move struct types needed by cxl - PCI/hotplug: pnv_php: handle OPAL_PCI_SLOT_OFFLINE power state - Add cxl_check_and_switch_mode() API to switch bi-modal cards - remove dead Kconfig options - fix potential NULL dereference in free_adapter() - Ian Munsie - Update process element after allocating interrupts - Add support for CAPP DMA mode - Fix allowing bogus AFU descriptors with 0 maximum processes - Fix allocating a minimum of 2 pages for the SPA - Fix bug where AFU disable operation had no effect - Workaround XSL bug that does not clear the RA bit after a reset - Fix NULL pointer dereference on kernel contexts with no AFU interrupts - powerpc/powernv: Split cxl code out into a separate file - Add cxl_slot_is_supported API - Enable bus mastering for devices using CAPP DMA mode - Move cxl_afu_get / cxl_afu_put to base - Allow a default context to be associated with an external pci_dev - Do not create vPHB if there are no AFU configuration records - powerpc/powernv: Add support for the cxl kernel api on the real phb - Add support for using the kernel API with a real PHB - Add kernel APIs to get & set the max irqs per context - Add preliminary workaround for CX4 interrupt limitation - Add support for interrupts on the Mellanox CX4 - Workaround PE=0 hardware limitation in Mellanox CX4 - powerpc/powernv: Fix pci-cxl.c build when CONFIG_MODULES=n selftests: - Test unaligned copy and paste from Chris Smart - Load Monitor Register Tests from Jack Miller - Cyril Bur - exec() with suspended transaction - Use signed long to read perf_event_paranoid - Fix usage message in context_switch - Fix generation of vector instructions/types in context_switch - Michael Ellerman - Use "Delta" rather than "Error" in normal output - Import Anton's mmap & futex micro benchmarks - Add a test for PROT_SAO -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJXnWchAAoJEFHr6jzI4aWAe64P/36Vd9yJLptjkoyZp8/IQtu1 Cv8buQwGdKuSMzdkcUAOXcC3fe2u70ZWXMKKLfY3koIV1IAiqdWk5/XWRKMP2XmE dG0LhSf0uu7uh+mE0WvQnRu46ImeKtQ+mPp4Hbs/s9SxMSeYjruv3vdWWmgUq0cl Gac2qJSRtAMmgLuHWMjf7N5mxOTOnKejU4o2i9cJ+YHmWKOdCigv2Ge1UadOQFlC E7tRPiUR3asfDfj+e+LVTTdToH6p8pk+mOUzIoZ8jIkQ+IXzi62UDl5+Rw9mqiuX 1CtqEMUXxo2qwX+d4TcV/QUOp0YKPuIcUZ9NMMS+S3lOyJ4NFt+j2Izk7QJp5kNP gKVqB68TjDQsBuDr3P9ynlHbduxTIhZAqopbTrLe0FIg48nUe4n1yHJBVzqaVajX rFBJSsSUffBLAARNPSXJJhIgc2C1/qOC8dgMeDMcR2kPirDHaQZ/lY1yEpq1yiqR q6e3v5hvIAm4IjbYk0mF7TUxBrPGVE/ExyBINyASRoYxAJ1PyeD/iljZ9vI3asRA s+hhxT8H3f7lnqTrmJqMjHgAdGkmag07EdmvFNX4xK4aADSy7Y6g4dw25ffRopo9 p9Jf9HX+dZv65Y3UjbV/6HuXcaSEBJJLSVWvii65PebqSN0LuHEFvNeIJ6Iblx0B AWh/hd0Iin2gdkcG39Mr =Z5kM -----END PGP SIGNATURE----- Merge tag 'powerpc-4.8-1' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux Pull powerpc updates from Michael Ellerman: "Highlights: - PowerNV PCI hotplug support. - Lots more Power9 support. - eBPF JIT support on ppc64le. - Lots of cxl updates. - Boot code consolidation. Bug fixes: - Fix spin_unlock_wait() from Boqun Feng - Fix stack pointer corruption in __tm_recheckpoint() from Michael Neuling - Fix multiple bugs in memory_hotplug_max() from Bharata B Rao - mm: Ensure "special" zones are empty from Oliver O'Halloran - ftrace: Separate the heuristics for checking call sites from Michael Ellerman - modules: Never restore r2 for a mprofile-kernel style mcount() call from Michael Ellerman - Fix endianness when reading TCEs from Alexey Kardashevskiy - start rtasd before PCI probing from Greg Kurz - PCI: rpaphp: Fix slot registration for multiple slots under a PHB from Tyrel Datwyler - powerpc/mm: Add memory barrier in __hugepte_alloc() from Sukadev Bhattiprolu Cleanups & fixes: - Drop support for MPIC in pseries from Rashmica Gupta - Define and use PPC64_ELF_ABI_v2/v1 from Michael Ellerman - Remove unused symbols in asm-offsets.c from Rashmica Gupta - Fix SRIOV not building without EEH enabled from Russell Currey - Remove kretprobe_trampoline_holder from Thiago Jung Bauermann - Reduce log level of PCI I/O space warning from Benjamin Herrenschmidt - Add array bounds checking to crash_shutdown_handlers from Suraj Jitindar Singh - Avoid -maltivec when using clang integrated assembler from Anton Blanchard - Fix array overrun in ppc_rtas() syscall from Andrew Donnellan - Fix error return value in cmm_mem_going_offline() from Rasmus Villemoes - export cpu_to_core_id() from Mauricio Faria de Oliveira - Remove old symbols from defconfigs from Andrew Donnellan - Update obsolete comments in setup_32.c about entry conditions from Benjamin Herrenschmidt - Add comment explaining the purpose of setup_kdump_trampoline() from Benjamin Herrenschmidt - Merge the RELOCATABLE config entries for ppc32 and ppc64 from Kevin Hao - Remove RELOCATABLE_PPC32 from Kevin Hao - Fix .long's in tlb-radix.c to more meaningful from Balbir Singh Minor cleanups & fixes: - Andrew Donnellan, Anna-Maria Gleixner, Anton Blanchard, Benjamin Herrenschmidt, Bharata B Rao, Christophe Leroy, Colin Ian King, Geliang Tang, Greg Kurz, Madhavan Srinivasan, Michael Ellerman, Michael Ellerman, Stephen Rothwell, Stewart Smith. Freescale updates from Scott: - "Highlights include more 8xx optimizations, device tree updates, and MVME7100 support." PowerNV PCI hotplug from Gavin Shan: - PCI: Add pcibios_setup_bridge() - Override pcibios_setup_bridge() - Remove PCI_RESET_DELAY_US - Move pnv_pci_ioda_setup_opal_tce_kill() around - Increase PE# capacity - Allocate PE# in reverse order - Create PEs in pcibios_setup_bridge() - Setup PE for root bus - Extend PCI bridge resources - Make pnv_ioda_deconfigure_pe() visible - Dynamically release PE - Update bridge windows on PCI plug - Delay populating pdn - Support PCI slot ID - Use PCI slot reset infrastructure - Introduce pnv_pci_get_slot_id() - Functions to get/set PCI slot state - PCI/hotplug: PowerPC PowerNV PCI hotplug driver - Print correct PHB type names Power9 idle support from Shreyas B. Prabhu: - set power_save func after the idle states are initialized - Use PNV_THREAD_WINKLE macro while requesting for winkle - make hypervisor state restore a function - Rename idle_power7.S to idle_book3s.S - Rename reusable idle functions to hardware agnostic names - Make pnv_powersave_common more generic - abstraction for saving SPRs before entering deep idle states - Add platform support for stop instruction - cpuidle/powernv: Use CPUIDLE_STATE_MAX instead of MAX_POWERNV_IDLE_STATES - cpuidle/powernv: cleanup cpuidle-powernv.c - cpuidle/powernv: Add support for POWER ISA v3 idle states - Use deepest stop state when cpu is offlined Power9 PMU from Madhavan Srinivasan: - factor out power8 pmu macros and defines - factor out power8 pmu functions - factor out power8 __init_pmu code - Add power9 event list macros for generic and cache events - Power9 PMU support - Export Power9 generic and cache events to sysfs Power9 preliminary interrupt & PCI support from Benjamin Herrenschmidt: - Add XICS emulation APIs - Move a few exception common handlers to make room - Add support for HV virtualization interrupts - Add mechanism to force a replay of interrupts - Add ICP OPAL backend - Discover IODA3 PHBs - pci: Remove obsolete SW invalidate - opal: Add real mode call wrappers - Rename TCE invalidation calls - Remove SWINV constants and obsolete TCE code - Rework accessing the TCE invalidate register - Fallback to OPAL for TCE invalidations - Use the device-tree to get available range of M64's - Check status of a PHB before using it - pci: Don't try to allocate resources that will be reassigned Other Power9: - Send SIGBUS on unaligned copy and paste from Chris Smart - Large Decrementer support from Oliver O'Halloran - Load Monitor Register Support from Jack Miller Performance improvements from Anton Blanchard: - Avoid load hit store in __giveup_fpu() and __giveup_altivec() - Avoid load hit store in setup_sigcontext() - Remove assembly versions of strcpy, strcat, strlen and strcmp - Align hot loops of some string functions eBPF JIT from Naveen N. Rao: - Fix/enhance 32-bit Load Immediate implementation - Optimize 64-bit Immediate loads - Introduce rotate immediate instructions - A few cleanups - Isolate classic BPF JIT specifics into a separate header - Implement JIT compiler for extended BPF Operator Panel driver from Suraj Jitindar Singh: - devicetree/bindings: Add binding for operator panel on FSP machines - Add inline function to get rc from an ASYNC_COMP opal_msg - Add driver for operator panel on FSP machines Sparse fixes from Daniel Axtens: - make some things static - Introduce asm-prototypes.h - Include headers containing prototypes - Use #ifdef __BIG_ENDIAN__ #else for REG_BYTE - kvm: Clarify __user annotations - Pass endianness to sparse - Make ppc_md.{halt, restart} __noreturn MM fixes & cleanups from Aneesh Kumar K.V: - radix: Update LPCR HR bit as per ISA - use _raw variant of page table accessors - Compile out radix related functions if RADIX_MMU is disabled - Clear top 16 bits of va only on older cpus - Print formation regarding the the MMU mode - hash: Update SDR1 size encoding as documented in ISA 3.0 - radix: Update PID switch sequence - radix: Update machine call back to support new HCALL. - radix: Add LPID based tlb flush helpers - radix: Add a kernel command line to disable radix - Cleanup LPCR defines Boot code consolidation from Benjamin Herrenschmidt: - Move epapr_paravirt_early_init() to early_init_devtree() - cell: Don't use flat device-tree after boot - ge_imp3a: Don't use the flat device-tree after boot - mpc85xx_ds: Don't use the flat device-tree after boot - mpc85xx_rdb: Don't use the flat device-tree after boot - Don't test for machine type in rtas_initialize() - Don't test for machine type in smp_setup_cpu_maps() - dt: Add of_device_compatible_match() - Factor do_feature_fixup calls - Move 64-bit feature fixup earlier - Move 64-bit memory reserves to setup_arch() - Use a cachable DART - Move FW feature probing out of pseries probe() - Put exception configuration in a common place - Remove early allocation of the SMU command buffer - Move MMU backend selection out of platform code - pasemi: Remove IOBMAP allocation from platform probe() - mm/hash: Don't use machine_is() early during boot - Don't test for machine type to detect HEA special case - pmac: Remove spurrious machine type test - Move hash table ops to a separate structure - Ensure that ppc_md is empty before probing for machine type - Move 64-bit probe_machine() to later in the boot process - Move 32-bit probe() machine to later in the boot process - Get rid of ppc_md.init_early() - Move the boot time info banner to a separate function - Move setting of {i,d}cache_bsize to initialize_cache_info() - Move the content of setup_system() to setup_arch() - Move cache info inits to a separate function - Re-order the call to smp_setup_cpu_maps() - Re-order setup_panic() - Make a few boot functions __init - Merge 32-bit and 64-bit setup_arch() Other new features: - tty/hvc: Use IRQF_SHARED for OPAL hvc consoles from Sam Mendoza-Jonas - tty/hvc: Use opal irqchip interface if available from Sam Mendoza-Jonas - powerpc: Add module autoloading based on CPU features from Alastair D'Silva - crypto: vmx - Convert to CPU feature based module autoloading from Alastair D'Silva - Wake up kopald polling thread before waiting for events from Benjamin Herrenschmidt - xmon: Dump ISA 2.06 SPRs from Michael Ellerman - xmon: Dump ISA 2.07 SPRs from Michael Ellerman - Add a parameter to disable 1TB segs from Oliver O'Halloran - powerpc/boot: Add OPAL console to epapr wrappers from Oliver O'Halloran - Assign fixed PHB number based on device-tree properties from Guilherme G. Piccoli - pseries: Add pseries hotplug workqueue from John Allen - pseries: Add support for hotplug interrupt source from John Allen - pseries: Use kernel hotplug queue for PowerVM hotplug events from John Allen - pseries: Move property cloning into its own routine from Nathan Fontenot - pseries: Dynamic add entires to associativity lookup array from Nathan Fontenot - pseries: Auto-online hotplugged memory from Nathan Fontenot - pseries: Remove call to memblock_add() from Nathan Fontenot cxl: - Add set and get private data to context struct from Michael Neuling - make base more explicitly non-modular from Paul Gortmaker - Use for_each_compatible_node() macro from Wei Yongjun - Frederic Barrat - Abstract the differences between the PSL and XSL - Make vPHB device node match adapter's - Philippe Bergheaud - Add mechanism for delivering AFU driver specific events - Ignore CAPI adapters misplaced in switched slots - Refine slice error debug messages - Andrew Donnellan - static-ify variables to fix sparse warnings - PCI/hotplug: pnv_php: export symbols and move struct types needed by cxl - PCI/hotplug: pnv_php: handle OPAL_PCI_SLOT_OFFLINE power state - Add cxl_check_and_switch_mode() API to switch bi-modal cards - remove dead Kconfig options - fix potential NULL dereference in free_adapter() - Ian Munsie - Update process element after allocating interrupts - Add support for CAPP DMA mode - Fix allowing bogus AFU descriptors with 0 maximum processes - Fix allocating a minimum of 2 pages for the SPA - Fix bug where AFU disable operation had no effect - Workaround XSL bug that does not clear the RA bit after a reset - Fix NULL pointer dereference on kernel contexts with no AFU interrupts - powerpc/powernv: Split cxl code out into a separate file - Add cxl_slot_is_supported API - Enable bus mastering for devices using CAPP DMA mode - Move cxl_afu_get / cxl_afu_put to base - Allow a default context to be associated with an external pci_dev - Do not create vPHB if there are no AFU configuration records - powerpc/powernv: Add support for the cxl kernel api on the real phb - Add support for using the kernel API with a real PHB - Add kernel APIs to get & set the max irqs per context - Add preliminary workaround for CX4 interrupt limitation - Add support for interrupts on the Mellanox CX4 - Workaround PE=0 hardware limitation in Mellanox CX4 - powerpc/powernv: Fix pci-cxl.c build when CONFIG_MODULES=n selftests: - Test unaligned copy and paste from Chris Smart - Load Monitor Register Tests from Jack Miller - Cyril Bur - exec() with suspended transaction - Use signed long to read perf_event_paranoid - Fix usage message in context_switch - Fix generation of vector instructions/types in context_switch - Michael Ellerman - Use "Delta" rather than "Error" in normal output - Import Anton's mmap & futex micro benchmarks - Add a test for PROT_SAO" * tag 'powerpc-4.8-1' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux: (263 commits) powerpc/mm: Parenthesise IS_ENABLED() in if condition tty/hvc: Use opal irqchip interface if available tty/hvc: Use IRQF_SHARED for OPAL hvc consoles selftests/powerpc: exec() with suspended transaction powerpc: Improve comment explaining why we modify VRSAVE powerpc/mm: Drop unused externs for hpte_init_beat[_v3]() powerpc/mm: Rename hpte_init_lpar() and move the fallback to a header powerpc/mm: Fix build break when PPC_NATIVE=n crypto: vmx - Convert to CPU feature based module autoloading powerpc: Add module autoloading based on CPU features powerpc/powernv/ioda: Fix endianness when reading TCEs powerpc/mm: Add memory barrier in __hugepte_alloc() powerpc/modules: Never restore r2 for a mprofile-kernel style mcount() call powerpc/ftrace: Separate the heuristics for checking call sites powerpc: Merge 32-bit and 64-bit setup_arch() powerpc/64: Make a few boot functions __init powerpc: Re-order setup_panic() powerpc: Re-order the call to smp_setup_cpu_maps() powerpc/32: Move cache info inits to a separate function powerpc/64: Move the content of setup_system() to setup_arch() ...
This commit is contained in:
commit
bad60e6f25
532 changed files with 11384 additions and 4172 deletions
|
@ -12,7 +12,8 @@ CFLAGS := -Wall -O2 -Wall -Werror -DGIT_VERSION='"$(GIT_VERSION)"' -I$(CURDIR) $
|
|||
|
||||
export CFLAGS
|
||||
|
||||
SUB_DIRS = benchmarks \
|
||||
SUB_DIRS = alignment \
|
||||
benchmarks \
|
||||
copyloops \
|
||||
context_switch \
|
||||
dscr \
|
||||
|
|
5
tools/testing/selftests/powerpc/alignment/.gitignore
vendored
Normal file
5
tools/testing/selftests/powerpc/alignment/.gitignore
vendored
Normal file
|
@ -0,0 +1,5 @@
|
|||
copy_unaligned
|
||||
copy_first_unaligned
|
||||
paste_unaligned
|
||||
paste_last_unaligned
|
||||
copy_paste_unaligned_common
|
10
tools/testing/selftests/powerpc/alignment/Makefile
Normal file
10
tools/testing/selftests/powerpc/alignment/Makefile
Normal file
|
@ -0,0 +1,10 @@
|
|||
TEST_PROGS := copy_unaligned copy_first_unaligned paste_unaligned paste_last_unaligned
|
||||
|
||||
all: $(TEST_PROGS)
|
||||
|
||||
$(TEST_PROGS): ../harness.c ../utils.c copy_paste_unaligned_common.c
|
||||
|
||||
include ../../lib.mk
|
||||
|
||||
clean:
|
||||
rm -f $(TEST_PROGS)
|
|
@ -0,0 +1,41 @@
|
|||
/*
|
||||
* Copyright 2016, Chris Smart, IBM Corporation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* Calls to copy_first which are not 128-byte aligned should be
|
||||
* caught and sent a SIGBUS.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include "utils.h"
|
||||
#include "instructions.h"
|
||||
#include "copy_paste_unaligned_common.h"
|
||||
|
||||
unsigned int expected_instruction = PPC_INST_COPY_FIRST;
|
||||
unsigned int instruction_mask = 0xfc2007fe;
|
||||
|
||||
int test_copy_first_unaligned(void)
|
||||
{
|
||||
/* Only run this test on a P9 or later */
|
||||
SKIP_IF(!have_hwcap2(PPC_FEATURE2_ARCH_3_00));
|
||||
|
||||
/* Register our signal handler with SIGBUS */
|
||||
setup_signal_handler();
|
||||
|
||||
/* +1 makes buf unaligned */
|
||||
copy_first(cacheline_buf+1);
|
||||
|
||||
/* We should not get here */
|
||||
return 1;
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
return test_harness(test_copy_first_unaligned, "test_copy_first_unaligned");
|
||||
}
|
|
@ -0,0 +1,53 @@
|
|||
/*
|
||||
* Copyright 2016, Chris Smart, IBM Corporation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* Common code for copy, copy_first, paste and paste_last unaligned
|
||||
* tests.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <signal.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include "utils.h"
|
||||
#include "instructions.h"
|
||||
#include "copy_paste_unaligned_common.h"
|
||||
|
||||
unsigned int expected_instruction;
|
||||
unsigned int instruction_mask;
|
||||
|
||||
char cacheline_buf[128] __cacheline_aligned;
|
||||
|
||||
void signal_action_handler(int signal_num, siginfo_t *info, void *ptr)
|
||||
{
|
||||
ucontext_t *ctx = ptr;
|
||||
#if defined(__powerpc64__)
|
||||
unsigned int *pc = (unsigned int *)ctx->uc_mcontext.gp_regs[PT_NIP];
|
||||
#else
|
||||
unsigned int *pc = (unsigned int *)ctx->uc_mcontext.uc_regs->gregs[PT_NIP];
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Check that the signal was on the correct instruction, using a
|
||||
* mask because the compiler assigns the register at RB.
|
||||
*/
|
||||
if ((*pc & instruction_mask) == expected_instruction)
|
||||
_exit(0); /* We hit the right instruction */
|
||||
|
||||
_exit(1);
|
||||
}
|
||||
|
||||
void setup_signal_handler(void)
|
||||
{
|
||||
struct sigaction signal_action;
|
||||
|
||||
memset(&signal_action, 0, sizeof(signal_action));
|
||||
signal_action.sa_sigaction = signal_action_handler;
|
||||
signal_action.sa_flags = SA_SIGINFO;
|
||||
sigaction(SIGBUS, &signal_action, NULL);
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
/*
|
||||
* Copyright 2016, Chris Smart, IBM Corporation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* Declarations for common code for copy, copy_first, paste and
|
||||
* paste_last unaligned tests.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _SELFTESTS_POWERPC_COPY_PASTE_H
|
||||
#define _SELFTESTS_POWERPC_COPY_PASTE_H
|
||||
|
||||
#include <signal.h>
|
||||
|
||||
int main(int argc, char *argv[]);
|
||||
void signal_action_handler(int signal_num, siginfo_t *info, void *ptr);
|
||||
void setup_signal_handler(void);
|
||||
extern char cacheline_buf[128] __cacheline_aligned;
|
||||
extern unsigned int expected_instruction;
|
||||
extern unsigned int instruction_mask;
|
||||
|
||||
#endif /* _SELFTESTS_POWERPC_COPY_PASTE_H */
|
41
tools/testing/selftests/powerpc/alignment/copy_unaligned.c
Normal file
41
tools/testing/selftests/powerpc/alignment/copy_unaligned.c
Normal file
|
@ -0,0 +1,41 @@
|
|||
/*
|
||||
* Copyright 2016, Chris Smart, IBM Corporation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* Calls to copy which are not 128-byte aligned should be caught
|
||||
* and sent a SIGBUS.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include "utils.h"
|
||||
#include "instructions.h"
|
||||
#include "copy_paste_unaligned_common.h"
|
||||
|
||||
unsigned int expected_instruction = PPC_INST_COPY;
|
||||
unsigned int instruction_mask = 0xfc0007fe;
|
||||
|
||||
int test_copy_unaligned(void)
|
||||
{
|
||||
/* Only run this test on a P9 or later */
|
||||
SKIP_IF(!have_hwcap2(PPC_FEATURE2_ARCH_3_00));
|
||||
|
||||
/* Register our signal handler with SIGBUS */
|
||||
setup_signal_handler();
|
||||
|
||||
/* +1 makes buf unaligned */
|
||||
copy(cacheline_buf+1);
|
||||
|
||||
/* We should not get here */
|
||||
return 1;
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
return test_harness(test_copy_unaligned, "test_copy_unaligned");
|
||||
}
|
|
@ -0,0 +1,43 @@
|
|||
/*
|
||||
* Copyright 2016, Chris Smart, IBM Corporation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* Calls to paste_last which are not 128-byte aligned should be
|
||||
* caught and sent a SIGBUS.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include "utils.h"
|
||||
#include "instructions.h"
|
||||
#include "copy_paste_unaligned_common.h"
|
||||
|
||||
unsigned int expected_instruction = PPC_INST_PASTE_LAST;
|
||||
unsigned int instruction_mask = 0xfc2007ff;
|
||||
|
||||
int test_paste_last_unaligned(void)
|
||||
{
|
||||
/* Only run this test on a P9 or later */
|
||||
SKIP_IF(!have_hwcap2(PPC_FEATURE2_ARCH_3_00));
|
||||
|
||||
/* Register our signal handler with SIGBUS */
|
||||
setup_signal_handler();
|
||||
|
||||
copy(cacheline_buf);
|
||||
|
||||
/* +1 makes buf unaligned */
|
||||
paste_last(cacheline_buf+1);
|
||||
|
||||
/* We should not get here */
|
||||
return 1;
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
return test_harness(test_paste_last_unaligned, "test_paste_last_unaligned");
|
||||
}
|
43
tools/testing/selftests/powerpc/alignment/paste_unaligned.c
Normal file
43
tools/testing/selftests/powerpc/alignment/paste_unaligned.c
Normal file
|
@ -0,0 +1,43 @@
|
|||
/*
|
||||
* Copyright 2016, Chris Smart, IBM Corporation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* Calls to paste which are not 128-byte aligned should be caught
|
||||
* and sent a SIGBUS.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include "utils.h"
|
||||
#include "instructions.h"
|
||||
#include "copy_paste_unaligned_common.h"
|
||||
|
||||
unsigned int expected_instruction = PPC_INST_PASTE;
|
||||
unsigned int instruction_mask = 0xfc0007fe;
|
||||
|
||||
int test_paste_unaligned(void)
|
||||
{
|
||||
/* Only run this test on a P9 or later */
|
||||
SKIP_IF(!have_hwcap2(PPC_FEATURE2_ARCH_3_00));
|
||||
|
||||
/* Register our signal handler with SIGBUS */
|
||||
setup_signal_handler();
|
||||
|
||||
copy(cacheline_buf);
|
||||
|
||||
/* +1 makes buf unaligned */
|
||||
paste(cacheline_buf+1);
|
||||
|
||||
/* We should not get here */
|
||||
return 1;
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
return test_harness(test_paste_unaligned, "test_paste_unaligned");
|
||||
}
|
|
@ -1,2 +1,4 @@
|
|||
gettimeofday
|
||||
context_switch
|
||||
mmap_bench
|
||||
futex_bench
|
|
@ -1,4 +1,4 @@
|
|||
TEST_PROGS := gettimeofday context_switch
|
||||
TEST_PROGS := gettimeofday context_switch mmap_bench futex_bench
|
||||
|
||||
CFLAGS += -O2
|
||||
|
||||
|
@ -7,6 +7,7 @@ all: $(TEST_PROGS)
|
|||
$(TEST_PROGS): ../harness.c
|
||||
|
||||
context_switch: ../utils.c
|
||||
context_switch: CFLAGS += -maltivec -mvsx -mabi=altivec
|
||||
context_switch: LDLIBS += -lpthread
|
||||
|
||||
include ../../lib.mk
|
||||
|
|
|
@ -25,7 +25,9 @@
|
|||
#include <sys/types.h>
|
||||
#include <sys/shm.h>
|
||||
#include <linux/futex.h>
|
||||
|
||||
#ifdef __powerpc__
|
||||
#include <altivec.h>
|
||||
#endif
|
||||
#include "../utils.h"
|
||||
|
||||
static unsigned int timeout = 30;
|
||||
|
@ -37,12 +39,15 @@ static int touch_fp = 1;
|
|||
double fp;
|
||||
|
||||
static int touch_vector = 1;
|
||||
typedef int v4si __attribute__ ((vector_size (16)));
|
||||
v4si a, b, c;
|
||||
vector int a, b, c;
|
||||
|
||||
#ifdef __powerpc__
|
||||
static int touch_altivec = 1;
|
||||
|
||||
/*
|
||||
* Note: LTO (Link Time Optimisation) doesn't play well with this function
|
||||
* attribute. Be very careful enabling LTO for this test.
|
||||
*/
|
||||
static void __attribute__((__target__("no-vsx"))) altivec_touch_fn(void)
|
||||
{
|
||||
c = a + b;
|
||||
|
@ -369,11 +374,11 @@ static void usage(void)
|
|||
fprintf(stderr, "\t\t--process\tUse processes (default threads)\n");
|
||||
fprintf(stderr, "\t\t--timeout=X\tDuration in seconds to run (default 30)\n");
|
||||
fprintf(stderr, "\t\t--vdso\t\ttouch VDSO\n");
|
||||
fprintf(stderr, "\t\t--fp\t\ttouch FP\n");
|
||||
fprintf(stderr, "\t\t--no-fp\t\tDon't touch FP\n");
|
||||
#ifdef __powerpc__
|
||||
fprintf(stderr, "\t\t--altivec\ttouch altivec\n");
|
||||
fprintf(stderr, "\t\t--no-altivec\tDon't touch altivec\n");
|
||||
#endif
|
||||
fprintf(stderr, "\t\t--vector\ttouch vector\n");
|
||||
fprintf(stderr, "\t\t--no-vector\tDon't touch vector\n");
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
|
|
42
tools/testing/selftests/powerpc/benchmarks/futex_bench.c
Normal file
42
tools/testing/selftests/powerpc/benchmarks/futex_bench.c
Normal file
|
@ -0,0 +1,42 @@
|
|||
/*
|
||||
* Copyright 2016, Anton Blanchard, Michael Ellerman, IBM Corp.
|
||||
* Licensed under GPLv2.
|
||||
*/
|
||||
|
||||
#define _GNU_SOURCE
|
||||
|
||||
#include <stdio.h>
|
||||
#include <sys/syscall.h>
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
#include <linux/futex.h>
|
||||
|
||||
#include "utils.h"
|
||||
|
||||
#define ITERATIONS 100000000
|
||||
|
||||
#define futex(A, B, C, D, E, F) syscall(__NR_futex, A, B, C, D, E, F)
|
||||
|
||||
int test_futex(void)
|
||||
{
|
||||
struct timespec ts_start, ts_end;
|
||||
unsigned long i = ITERATIONS;
|
||||
|
||||
clock_gettime(CLOCK_MONOTONIC, &ts_start);
|
||||
|
||||
while (i--) {
|
||||
unsigned int addr = 0;
|
||||
futex(&addr, FUTEX_WAKE, 1, NULL, NULL, 0);
|
||||
}
|
||||
|
||||
clock_gettime(CLOCK_MONOTONIC, &ts_end);
|
||||
|
||||
printf("time = %.6f\n", ts_end.tv_sec - ts_start.tv_sec + (ts_end.tv_nsec - ts_start.tv_nsec) / 1e9);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
return test_harness(test_futex, "futex_bench");
|
||||
}
|
41
tools/testing/selftests/powerpc/benchmarks/mmap_bench.c
Normal file
41
tools/testing/selftests/powerpc/benchmarks/mmap_bench.c
Normal file
|
@ -0,0 +1,41 @@
|
|||
/*
|
||||
* Copyright 2016, Anton Blanchard, Michael Ellerman, IBM Corp.
|
||||
* Licensed under GPLv2.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/mman.h>
|
||||
#include <time.h>
|
||||
|
||||
#include "utils.h"
|
||||
|
||||
#define ITERATIONS 5000000
|
||||
|
||||
#define MEMSIZE (128 * 1024 * 1024)
|
||||
|
||||
int test_mmap(void)
|
||||
{
|
||||
struct timespec ts_start, ts_end;
|
||||
unsigned long i = ITERATIONS;
|
||||
|
||||
clock_gettime(CLOCK_MONOTONIC, &ts_start);
|
||||
|
||||
while (i--) {
|
||||
char *c = mmap(NULL, MEMSIZE, PROT_READ|PROT_WRITE,
|
||||
MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
|
||||
FAIL_IF(c == MAP_FAILED);
|
||||
munmap(c, MEMSIZE);
|
||||
}
|
||||
|
||||
clock_gettime(CLOCK_MONOTONIC, &ts_end);
|
||||
|
||||
printf("time = %.6f\n", ts_end.tv_sec - ts_start.tv_sec + (ts_end.tv_nsec - ts_start.tv_nsec) / 1e9);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
return test_harness(test_mmap, "mmap_bench");
|
||||
}
|
68
tools/testing/selftests/powerpc/instructions.h
Normal file
68
tools/testing/selftests/powerpc/instructions.h
Normal file
|
@ -0,0 +1,68 @@
|
|||
#ifndef _SELFTESTS_POWERPC_INSTRUCTIONS_H
|
||||
#define _SELFTESTS_POWERPC_INSTRUCTIONS_H
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
/* This defines the "copy" instruction from Power ISA 3.0 Book II, section 4.4. */
|
||||
#define __COPY(RA, RB, L) \
|
||||
(0x7c00060c | (RA) << (31-15) | (RB) << (31-20) | (L) << (31-10))
|
||||
#define COPY(RA, RB, L) \
|
||||
.long __COPY((RA), (RB), (L))
|
||||
|
||||
static inline void copy(void *i)
|
||||
{
|
||||
asm volatile(str(COPY(0, %0, 0))";"
|
||||
:
|
||||
: "b" (i)
|
||||
: "memory"
|
||||
);
|
||||
}
|
||||
|
||||
static inline void copy_first(void *i)
|
||||
{
|
||||
asm volatile(str(COPY(0, %0, 1))";"
|
||||
:
|
||||
: "b" (i)
|
||||
: "memory"
|
||||
);
|
||||
}
|
||||
|
||||
/* This defines the "paste" instruction from Power ISA 3.0 Book II, section 4.4. */
|
||||
#define __PASTE(RA, RB, L, RC) \
|
||||
(0x7c00070c | (RA) << (31-15) | (RB) << (31-20) | (L) << (31-10) | (RC) << (31-31))
|
||||
#define PASTE(RA, RB, L, RC) \
|
||||
.long __PASTE((RA), (RB), (L), (RC))
|
||||
|
||||
static inline int paste(void *i)
|
||||
{
|
||||
int cr;
|
||||
|
||||
asm volatile(str(PASTE(0, %1, 0, 0))";"
|
||||
"mfcr %0;"
|
||||
: "=r" (cr)
|
||||
: "b" (i)
|
||||
: "memory"
|
||||
);
|
||||
return cr;
|
||||
}
|
||||
|
||||
static inline int paste_last(void *i)
|
||||
{
|
||||
int cr;
|
||||
|
||||
asm volatile(str(PASTE(0, %1, 1, 1))";"
|
||||
"mfcr %0;"
|
||||
: "=r" (cr)
|
||||
: "b" (i)
|
||||
: "memory"
|
||||
);
|
||||
return cr;
|
||||
}
|
||||
|
||||
#define PPC_INST_COPY __COPY(0, 0, 0)
|
||||
#define PPC_INST_COPY_FIRST __COPY(0, 0, 1)
|
||||
#define PPC_INST_PASTE __PASTE(0, 0, 0, 0)
|
||||
#define PPC_INST_PASTE_LAST __PASTE(0, 0, 1, 1)
|
||||
|
||||
#endif /* _SELFTESTS_POWERPC_INSTRUCTIONS_H */
|
|
@ -1,3 +1,4 @@
|
|||
hugetlb_vs_thp_test
|
||||
subpage_prot
|
||||
tempfile
|
||||
prot_sao
|
|
@ -1,13 +1,15 @@
|
|||
noarg:
|
||||
$(MAKE) -C ../
|
||||
|
||||
TEST_PROGS := hugetlb_vs_thp_test subpage_prot
|
||||
TEST_PROGS := hugetlb_vs_thp_test subpage_prot prot_sao
|
||||
TEST_FILES := tempfile
|
||||
|
||||
all: $(TEST_PROGS) $(TEST_FILES)
|
||||
|
||||
$(TEST_PROGS): ../harness.c
|
||||
|
||||
prot_sao: ../utils.c
|
||||
|
||||
include ../../lib.mk
|
||||
|
||||
tempfile:
|
||||
|
|
42
tools/testing/selftests/powerpc/mm/prot_sao.c
Normal file
42
tools/testing/selftests/powerpc/mm/prot_sao.c
Normal file
|
@ -0,0 +1,42 @@
|
|||
/*
|
||||
* Copyright 2016, Michael Ellerman, IBM Corp.
|
||||
* Licensed under GPLv2.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/mman.h>
|
||||
|
||||
#include <asm/cputable.h>
|
||||
|
||||
#include "utils.h"
|
||||
|
||||
#define SIZE (64 * 1024)
|
||||
|
||||
int test_prot_sao(void)
|
||||
{
|
||||
char *p;
|
||||
|
||||
/* 2.06 or later should support SAO */
|
||||
SKIP_IF(!have_hwcap(PPC_FEATURE_ARCH_2_06));
|
||||
|
||||
/*
|
||||
* Ensure we can ask for PROT_SAO.
|
||||
* We can't really verify that it does the right thing, but at least we
|
||||
* confirm the kernel will accept it.
|
||||
*/
|
||||
p = mmap(NULL, SIZE, PROT_READ | PROT_WRITE | PROT_SAO,
|
||||
MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
|
||||
FAIL_IF(p == MAP_FAILED);
|
||||
|
||||
/* Write to the mapping, to at least cause a fault */
|
||||
memset(p, 0xaa, SIZE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
return test_harness(test_prot_sao, "prot-sao");
|
||||
}
|
|
@ -20,3 +20,5 @@ back_to_back_ebbs_test
|
|||
lost_exception_test
|
||||
no_handler_test
|
||||
cycles_with_mmcr2_test
|
||||
ebb_lmr
|
||||
ebb_lmr_regs
|
|
@ -14,7 +14,7 @@ TEST_PROGS := reg_access_test event_attributes_test cycles_test \
|
|||
fork_cleanup_test ebb_on_child_test \
|
||||
ebb_on_willing_child_test back_to_back_ebbs_test \
|
||||
lost_exception_test no_handler_test \
|
||||
cycles_with_mmcr2_test
|
||||
cycles_with_mmcr2_test ebb_lmr ebb_lmr_regs
|
||||
|
||||
all: $(TEST_PROGS)
|
||||
|
||||
|
|
143
tools/testing/selftests/powerpc/pmu/ebb/ebb_lmr.c
Normal file
143
tools/testing/selftests/powerpc/pmu/ebb/ebb_lmr.c
Normal file
|
@ -0,0 +1,143 @@
|
|||
/*
|
||||
* Copyright 2016, Jack Miller, IBM Corp.
|
||||
* Licensed under GPLv2.
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "ebb.h"
|
||||
#include "ebb_lmr.h"
|
||||
|
||||
#define SIZE (32 * 1024 * 1024) /* 32M */
|
||||
#define LM_SIZE 0 /* Smallest encoding, 32M */
|
||||
|
||||
#define SECTIONS 64 /* 1 per bit in LMSER */
|
||||
#define SECTION_SIZE (SIZE / SECTIONS)
|
||||
#define SECTION_LONGS (SECTION_SIZE / sizeof(long))
|
||||
|
||||
static unsigned long *test_mem;
|
||||
|
||||
static int lmr_count = 0;
|
||||
|
||||
void ebb_lmr_handler(void)
|
||||
{
|
||||
lmr_count++;
|
||||
}
|
||||
|
||||
void ldmx_full_section(unsigned long *mem, int section)
|
||||
{
|
||||
unsigned long *ptr;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < SECTION_LONGS; i++) {
|
||||
ptr = &mem[(SECTION_LONGS * section) + i];
|
||||
ldmx((unsigned long) &ptr);
|
||||
ebb_lmr_reset();
|
||||
}
|
||||
}
|
||||
|
||||
unsigned long section_masks[] = {
|
||||
0x8000000000000000,
|
||||
0xFF00000000000000,
|
||||
0x0000000F70000000,
|
||||
0x8000000000000001,
|
||||
0xF0F0F0F0F0F0F0F0,
|
||||
0x0F0F0F0F0F0F0F0F,
|
||||
0x0
|
||||
};
|
||||
|
||||
int ebb_lmr_section_test(unsigned long *mem)
|
||||
{
|
||||
unsigned long *mask = section_masks;
|
||||
int i;
|
||||
|
||||
for (; *mask; mask++) {
|
||||
mtspr(SPRN_LMSER, *mask);
|
||||
printf("Testing mask 0x%016lx\n", mfspr(SPRN_LMSER));
|
||||
|
||||
for (i = 0; i < 64; i++) {
|
||||
lmr_count = 0;
|
||||
ldmx_full_section(mem, i);
|
||||
if (*mask & (1UL << (63 - i)))
|
||||
FAIL_IF(lmr_count != SECTION_LONGS);
|
||||
else
|
||||
FAIL_IF(lmr_count);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ebb_lmr(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
SKIP_IF(!lmr_is_supported());
|
||||
|
||||
setup_ebb_handler(ebb_lmr_handler);
|
||||
|
||||
ebb_global_enable();
|
||||
|
||||
FAIL_IF(posix_memalign((void **)&test_mem, SIZE, SIZE) != 0);
|
||||
|
||||
mtspr(SPRN_LMSER, 0);
|
||||
|
||||
FAIL_IF(mfspr(SPRN_LMSER) != 0);
|
||||
|
||||
mtspr(SPRN_LMRR, ((unsigned long)test_mem | LM_SIZE));
|
||||
|
||||
FAIL_IF(mfspr(SPRN_LMRR) != ((unsigned long)test_mem | LM_SIZE));
|
||||
|
||||
/* Read every single byte to ensure we get no false positives */
|
||||
for (i = 0; i < SECTIONS; i++)
|
||||
ldmx_full_section(test_mem, i);
|
||||
|
||||
FAIL_IF(lmr_count != 0);
|
||||
|
||||
/* Turn on the first section */
|
||||
|
||||
mtspr(SPRN_LMSER, (1UL << 63));
|
||||
FAIL_IF(mfspr(SPRN_LMSER) != (1UL << 63));
|
||||
|
||||
/* Enable LM (BESCR) */
|
||||
|
||||
mtspr(SPRN_BESCR, mfspr(SPRN_BESCR) | BESCR_LME);
|
||||
FAIL_IF(!(mfspr(SPRN_BESCR) & BESCR_LME));
|
||||
|
||||
ldmx((unsigned long)&test_mem);
|
||||
|
||||
FAIL_IF(lmr_count != 1); // exactly one exception
|
||||
FAIL_IF(mfspr(SPRN_BESCR) & BESCR_LME); // LM now disabled
|
||||
FAIL_IF(!(mfspr(SPRN_BESCR) & BESCR_LMEO)); // occurred bit set
|
||||
|
||||
printf("Simple LMR EBB OK\n");
|
||||
|
||||
/* This shouldn't cause an EBB since it's been disabled */
|
||||
ldmx((unsigned long)&test_mem);
|
||||
FAIL_IF(lmr_count != 1);
|
||||
|
||||
printf("LMR disable on EBB OK\n");
|
||||
|
||||
ebb_lmr_reset();
|
||||
|
||||
/* This should cause an EBB or reset is broken */
|
||||
ldmx((unsigned long)&test_mem);
|
||||
FAIL_IF(lmr_count != 2);
|
||||
|
||||
printf("LMR reset EBB OK\n");
|
||||
|
||||
ebb_lmr_reset();
|
||||
|
||||
return ebb_lmr_section_test(test_mem);
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
int ret = test_harness(ebb_lmr, "ebb_lmr");
|
||||
|
||||
if (test_mem)
|
||||
free(test_mem);
|
||||
|
||||
return ret;
|
||||
}
|
39
tools/testing/selftests/powerpc/pmu/ebb/ebb_lmr.h
Normal file
39
tools/testing/selftests/powerpc/pmu/ebb/ebb_lmr.h
Normal file
|
@ -0,0 +1,39 @@
|
|||
#ifndef _SELFTESTS_POWERPC_PMU_EBB_LMR_H
|
||||
#define _SELFTESTS_POWERPC_PMU_EBB_LMR_H
|
||||
|
||||
#include "reg.h"
|
||||
|
||||
#ifndef PPC_FEATURE2_ARCH_3_00
|
||||
#define PPC_FEATURE2_ARCH_3_00 0x00800000
|
||||
#endif
|
||||
|
||||
#define lmr_is_supported() have_hwcap2(PPC_FEATURE2_ARCH_3_00)
|
||||
|
||||
static inline void ebb_lmr_reset(void)
|
||||
{
|
||||
unsigned long bescr = mfspr(SPRN_BESCR);
|
||||
bescr &= ~(BESCR_LMEO);
|
||||
bescr |= BESCR_LME;
|
||||
mtspr(SPRN_BESCR, bescr);
|
||||
}
|
||||
|
||||
#define LDMX(t, a, b)\
|
||||
(0x7c00026a | \
|
||||
(((t) & 0x1f) << 21) | \
|
||||
(((a) & 0x1f) << 16) | \
|
||||
(((b) & 0x1f) << 11))
|
||||
|
||||
static inline unsigned long ldmx(unsigned long address)
|
||||
{
|
||||
unsigned long ret;
|
||||
|
||||
asm volatile ("mr 9, %1\r\n"
|
||||
".long " __stringify(LDMX(9, 0, 9)) "\r\n"
|
||||
"mr %0, 9\r\n":"=r"(ret)
|
||||
:"r"(address)
|
||||
:"r9");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif
|
37
tools/testing/selftests/powerpc/pmu/ebb/ebb_lmr_regs.c
Normal file
37
tools/testing/selftests/powerpc/pmu/ebb/ebb_lmr_regs.c
Normal file
|
@ -0,0 +1,37 @@
|
|||
/*
|
||||
* Copyright 2016, Jack Miller, IBM Corp.
|
||||
* Licensed under GPLv2.
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "ebb.h"
|
||||
#include "ebb_lmr.h"
|
||||
|
||||
#define CHECKS 10000
|
||||
|
||||
int ebb_lmr_regs(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
SKIP_IF(!lmr_is_supported());
|
||||
|
||||
ebb_global_enable();
|
||||
|
||||
for (i = 0; i < CHECKS; i++) {
|
||||
mtspr(SPRN_LMRR, i << 25); // skip size and rsvd bits
|
||||
mtspr(SPRN_LMSER, i);
|
||||
|
||||
FAIL_IF(mfspr(SPRN_LMRR) != (i << 25));
|
||||
FAIL_IF(mfspr(SPRN_LMSER) != i);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
return test_harness(ebb_lmr_regs, "ebb_lmr_regs");
|
||||
}
|
|
@ -51,7 +51,7 @@ static int do_count_loop(struct event *event, uint64_t instructions,
|
|||
printf("Looped for %lu instructions, overhead %lu\n", instructions, overhead);
|
||||
printf("Expected %lu\n", expected);
|
||||
printf("Actual %llu\n", event->result.value);
|
||||
printf("Error %ld, %f%%\n", difference, percentage);
|
||||
printf("Delta %ld, %f%%\n", difference, percentage);
|
||||
printf("Took %d EBBs\n", ebb_state.stats.ebb_count);
|
||||
}
|
||||
|
||||
|
|
|
@ -190,7 +190,7 @@ int parse_proc_maps(void)
|
|||
|
||||
bool require_paranoia_below(int level)
|
||||
{
|
||||
unsigned long current;
|
||||
long current;
|
||||
char *end, buf[16];
|
||||
FILE *f;
|
||||
int rc;
|
||||
|
@ -208,7 +208,7 @@ bool require_paranoia_below(int level)
|
|||
goto out_close;
|
||||
}
|
||||
|
||||
current = strtoul(buf, &end, 10);
|
||||
current = strtol(buf, &end, 10);
|
||||
|
||||
if (end == buf) {
|
||||
printf("Couldn't parse " PARANOID_PATH "?\n");
|
||||
|
@ -216,7 +216,7 @@ bool require_paranoia_below(int level)
|
|||
}
|
||||
|
||||
if (current >= level)
|
||||
goto out;
|
||||
goto out_close;
|
||||
|
||||
rc = 0;
|
||||
out_close:
|
||||
|
|
|
@ -34,6 +34,11 @@
|
|||
|
||||
#define BESCR_PMEO 0x1 /* PMU Event-based exception Occurred */
|
||||
#define BESCR_PME (0x1ul << 32) /* PMU Event-based exception Enable */
|
||||
#define BESCR_LME (0x1ul << 34) /* Load Monitor Enable */
|
||||
#define BESCR_LMEO (0x1ul << 2) /* Load Monitor Exception Occurred */
|
||||
|
||||
#define SPRN_LMRR 813 /* Load Monitor Region Register */
|
||||
#define SPRN_LMSER 814 /* Load Monitor Section Enable Register */
|
||||
|
||||
#define SPRN_PMC1 771
|
||||
#define SPRN_PMC2 772
|
||||
|
|
|
@ -6,3 +6,4 @@ tm-vmxcopy
|
|||
tm-fork
|
||||
tm-tar
|
||||
tm-tmspr
|
||||
tm-exec
|
||||
|
|
|
@ -1,11 +1,14 @@
|
|||
TEST_PROGS := tm-resched-dscr tm-syscall tm-signal-msr-resv tm-signal-stack tm-vmxcopy tm-fork tm-tar tm-tmspr
|
||||
TEST_PROGS := tm-resched-dscr tm-syscall tm-signal-msr-resv tm-signal-stack \
|
||||
tm-vmxcopy tm-fork tm-tar tm-tmspr tm-exec tm-execed
|
||||
|
||||
all: $(TEST_PROGS)
|
||||
|
||||
$(TEST_PROGS): ../harness.c ../utils.c
|
||||
|
||||
CFLAGS += -mhtm
|
||||
|
||||
tm-syscall: tm-syscall-asm.S
|
||||
tm-syscall: CFLAGS += -mhtm -I../../../../../usr/include
|
||||
tm-syscall: CFLAGS += -I../../../../../usr/include
|
||||
tm-tmspr: CFLAGS += -pthread
|
||||
|
||||
include ../../lib.mk
|
||||
|
|
70
tools/testing/selftests/powerpc/tm/tm-exec.c
Normal file
70
tools/testing/selftests/powerpc/tm/tm-exec.c
Normal file
|
@ -0,0 +1,70 @@
|
|||
/*
|
||||
* Copyright 2016, Cyril Bur, IBM Corp.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* Syscalls can be performed provided the transactions are suspended.
|
||||
* The exec() class of syscall is unique as a new process is loaded.
|
||||
*
|
||||
* It makes little sense for after an exec() call for the previously
|
||||
* suspended transaction to still exist.
|
||||
*/
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <errno.h>
|
||||
#include <inttypes.h>
|
||||
#include <libgen.h>
|
||||
#include <pthread.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "utils.h"
|
||||
#include "tm.h"
|
||||
|
||||
static char *path;
|
||||
|
||||
static int test_exec(void)
|
||||
{
|
||||
SKIP_IF(!have_htm());
|
||||
|
||||
asm __volatile__(
|
||||
"tbegin.;"
|
||||
"blt 1f; "
|
||||
"tsuspend.;"
|
||||
"1: ;"
|
||||
: : : "memory");
|
||||
|
||||
execl(path, "tm-exec", "--child", NULL);
|
||||
|
||||
/* Shouldn't get here */
|
||||
perror("execl() failed");
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int after_exec(void)
|
||||
{
|
||||
asm __volatile__(
|
||||
"tbegin.;"
|
||||
"blt 1f;"
|
||||
"tsuspend.;"
|
||||
"1: ;"
|
||||
: : : "memory");
|
||||
|
||||
FAIL_IF(failure_is_nesting());
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
path = argv[0];
|
||||
|
||||
if (argc > 1 && strcmp(argv[1], "--child") == 0)
|
||||
return after_exec();
|
||||
|
||||
return test_harness(test_exec, "tm_exec");
|
||||
}
|
|
@ -27,21 +27,6 @@ unsigned retries = 0;
|
|||
#define TEST_DURATION 10 /* seconds */
|
||||
#define TM_RETRIES 100
|
||||
|
||||
long failure_code(void)
|
||||
{
|
||||
return __builtin_get_texasru() >> 24;
|
||||
}
|
||||
|
||||
bool failure_is_persistent(void)
|
||||
{
|
||||
return (failure_code() & TM_CAUSE_PERSISTENT) == TM_CAUSE_PERSISTENT;
|
||||
}
|
||||
|
||||
bool failure_is_syscall(void)
|
||||
{
|
||||
return (failure_code() & TM_CAUSE_SYSCALL) == TM_CAUSE_SYSCALL;
|
||||
}
|
||||
|
||||
pid_t getppid_tm(bool suspend)
|
||||
{
|
||||
int i;
|
||||
|
|
|
@ -6,8 +6,9 @@
|
|||
#ifndef _SELFTESTS_POWERPC_TM_TM_H
|
||||
#define _SELFTESTS_POWERPC_TM_TM_H
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <asm/tm.h>
|
||||
#include <asm/cputable.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "../utils.h"
|
||||
|
||||
|
@ -31,4 +32,24 @@ static inline bool have_htm_nosc(void)
|
|||
#endif
|
||||
}
|
||||
|
||||
static inline long failure_code(void)
|
||||
{
|
||||
return __builtin_get_texasru() >> 24;
|
||||
}
|
||||
|
||||
static inline bool failure_is_persistent(void)
|
||||
{
|
||||
return (failure_code() & TM_CAUSE_PERSISTENT) == TM_CAUSE_PERSISTENT;
|
||||
}
|
||||
|
||||
static inline bool failure_is_syscall(void)
|
||||
{
|
||||
return (failure_code() & TM_CAUSE_SYSCALL) == TM_CAUSE_SYSCALL;
|
||||
}
|
||||
|
||||
static inline bool failure_is_nesting(void)
|
||||
{
|
||||
return (__builtin_get_texasru() & 0x400000);
|
||||
}
|
||||
|
||||
#endif /* _SELFTESTS_POWERPC_TM_TM_H */
|
||||
|
|
|
@ -27,6 +27,11 @@ int test_harness(int (test_function)(void), char *name);
|
|||
extern void *get_auxv_entry(int type);
|
||||
int pick_online_cpu(void);
|
||||
|
||||
static inline bool have_hwcap(unsigned long ftr)
|
||||
{
|
||||
return ((unsigned long)get_auxv_entry(AT_HWCAP) & ftr) == ftr;
|
||||
}
|
||||
|
||||
static inline bool have_hwcap2(unsigned long ftr2)
|
||||
{
|
||||
return ((unsigned long)get_auxv_entry(AT_HWCAP2) & ftr2) == ftr2;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue