Skip to content

Commit 62c3330

Browse files
author
Alex Shi
committed
Merge branch v4.4/topic/hibernate into linux-linaro-lsk-v4.4
2 parents 17d454c + d3ee568 commit 62c3330

71 files changed

Lines changed: 3119 additions & 2086 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

arch/arm/Kconfig

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ config ARM
3838
select HAVE_ARCH_HARDENED_USERCOPY
3939
select HAVE_ARCH_SECCOMP_FILTER if (AEABI && !OABI_COMPAT)
4040
select HAVE_ARCH_TRACEHOOK
41+
select HAVE_ARM_SMCCC if CPU_V7
4142
select HAVE_BPF_JIT
4243
select HAVE_CC_STACKPROTECTOR
4344
select HAVE_CONTEXT_TRACKING
@@ -1423,8 +1424,7 @@ config BIG_LITTLE
14231424

14241425
config BL_SWITCHER
14251426
bool "big.LITTLE switcher support"
1426-
depends on BIG_LITTLE && MCPM && HOTPLUG_CPU
1427-
select ARM_CPU_SUSPEND
1427+
depends on BIG_LITTLE && MCPM && HOTPLUG_CPU && ARM_GIC
14281428
select CPU_PM
14291429
help
14301430
The big.LITTLE "switcher" provides the core functionality to
@@ -1482,7 +1482,7 @@ config HOTPLUG_CPU
14821482

14831483
config ARM_PSCI
14841484
bool "Support for the ARM Power State Coordination Interface (PSCI)"
1485-
depends on CPU_V7
1485+
depends on HAVE_ARM_SMCCC
14861486
select ARM_PSCI_FW
14871487
help
14881488
Say Y here if you want Linux to communicate with system firmware
@@ -2141,7 +2141,8 @@ config ARCH_SUSPEND_POSSIBLE
21412141
def_bool y
21422142

21432143
config ARM_CPU_SUSPEND
2144-
def_bool PM_SLEEP
2144+
def_bool PM_SLEEP || BL_SWITCHER || ARM_PSCI_FW
2145+
depends on ARCH_SUSPEND_POSSIBLE
21452146

21462147
config ARCH_HIBERNATION_POSSIBLE
21472148
bool

arch/arm/include/asm/kvm_arm.h

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#ifndef __ARM_KVM_ARM_H__
2020
#define __ARM_KVM_ARM_H__
2121

22+
#include <linux/const.h>
2223
#include <linux/types.h>
2324

2425
/* Hyp Configuration Register (HCR) bits */
@@ -132,10 +133,9 @@
132133
* space.
133134
*/
134135
#define KVM_PHYS_SHIFT (40)
135-
#define KVM_PHYS_SIZE (1ULL << KVM_PHYS_SHIFT)
136-
#define KVM_PHYS_MASK (KVM_PHYS_SIZE - 1ULL)
137-
#define PTRS_PER_S2_PGD (1ULL << (KVM_PHYS_SHIFT - 30))
138-
#define S2_PGD_ORDER get_order(PTRS_PER_S2_PGD * sizeof(pgd_t))
136+
#define KVM_PHYS_SIZE (_AC(1, ULL) << KVM_PHYS_SHIFT)
137+
#define KVM_PHYS_MASK (KVM_PHYS_SIZE - _AC(1, ULL))
138+
#define PTRS_PER_S2_PGD (_AC(1, ULL) << (KVM_PHYS_SHIFT - 30))
139139

140140
/* Virtualization Translation Control Register (VTCR) bits */
141141
#define VTCR_SH0 (3 << 12)
@@ -162,27 +162,27 @@
162162
#define VTTBR_X (5 - KVM_T0SZ)
163163
#endif
164164
#define VTTBR_BADDR_SHIFT (VTTBR_X - 1)
165-
#define VTTBR_BADDR_MASK (((1LLU << (40 - VTTBR_X)) - 1) << VTTBR_BADDR_SHIFT)
166-
#define VTTBR_VMID_SHIFT (48LLU)
167-
#define VTTBR_VMID_MASK (0xffLLU << VTTBR_VMID_SHIFT)
165+
#define VTTBR_BADDR_MASK (((_AC(1, ULL) << (40 - VTTBR_X)) - 1) << VTTBR_BADDR_SHIFT)
166+
#define VTTBR_VMID_SHIFT _AC(48, ULL)
167+
#define VTTBR_VMID_MASK(size) (_AT(u64, (1 << size) - 1) << VTTBR_VMID_SHIFT)
168168

169169
/* Hyp Syndrome Register (HSR) bits */
170170
#define HSR_EC_SHIFT (26)
171-
#define HSR_EC (0x3fU << HSR_EC_SHIFT)
172-
#define HSR_IL (1U << 25)
171+
#define HSR_EC (_AC(0x3f, UL) << HSR_EC_SHIFT)
172+
#define HSR_IL (_AC(1, UL) << 25)
173173
#define HSR_ISS (HSR_IL - 1)
174174
#define HSR_ISV_SHIFT (24)
175-
#define HSR_ISV (1U << HSR_ISV_SHIFT)
175+
#define HSR_ISV (_AC(1, UL) << HSR_ISV_SHIFT)
176176
#define HSR_SRT_SHIFT (16)
177177
#define HSR_SRT_MASK (0xf << HSR_SRT_SHIFT)
178178
#define HSR_FSC (0x3f)
179179
#define HSR_FSC_TYPE (0x3c)
180180
#define HSR_SSE (1 << 21)
181181
#define HSR_WNR (1 << 6)
182182
#define HSR_CV_SHIFT (24)
183-
#define HSR_CV (1U << HSR_CV_SHIFT)
183+
#define HSR_CV (_AC(1, UL) << HSR_CV_SHIFT)
184184
#define HSR_COND_SHIFT (20)
185-
#define HSR_COND (0xfU << HSR_COND_SHIFT)
185+
#define HSR_COND (_AC(0xf, UL) << HSR_COND_SHIFT)
186186

187187
#define FSC_FAULT (0x04)
188188
#define FSC_ACCESS (0x08)
@@ -210,13 +210,13 @@
210210
#define HSR_EC_DABT (0x24)
211211
#define HSR_EC_DABT_HYP (0x25)
212212

213-
#define HSR_WFI_IS_WFE (1U << 0)
213+
#define HSR_WFI_IS_WFE (_AC(1, UL) << 0)
214214

215-
#define HSR_HVC_IMM_MASK ((1UL << 16) - 1)
215+
#define HSR_HVC_IMM_MASK ((_AC(1, UL) << 16) - 1)
216216

217-
#define HSR_DABT_S1PTW (1U << 7)
218-
#define HSR_DABT_CM (1U << 8)
219-
#define HSR_DABT_EA (1U << 9)
217+
#define HSR_DABT_S1PTW (_AC(1, UL) << 7)
218+
#define HSR_DABT_CM (_AC(1, UL) << 8)
219+
#define HSR_DABT_EA (_AC(1, UL) << 9)
220220

221221
#define kvm_arm_exception_type \
222222
{0, "RESET" }, \

arch/arm/include/asm/kvm_host.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,10 @@ static inline void __cpu_init_hyp_mode(phys_addr_t boot_pgd_ptr,
214214
kvm_call_hyp((void*)hyp_stack_ptr, vector_ptr, pgd_ptr);
215215
}
216216

217+
static inline void __cpu_init_stage2(void)
218+
{
219+
}
220+
217221
static inline int kvm_arch_dev_ioctl_check_extension(long ext)
218222
{
219223
return 0;

arch/arm/include/asm/kvm_mmu.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,11 @@ static inline void __kvm_extend_hypmap(pgd_t *boot_hyp_pgd,
279279
pgd_t *merged_hyp_pgd,
280280
unsigned long hyp_idmap_start) { }
281281

282+
static inline unsigned int kvm_get_vmid_bits(void)
283+
{
284+
return 8;
285+
}
286+
282287
#endif /* !__ASSEMBLY__ */
283288

284289
#endif /* __ARM_KVM_MMU_H__ */

arch/arm/include/asm/virt.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,15 @@ static inline bool is_hyp_mode_mismatched(void)
7474
{
7575
return !!(__boot_cpu_mode & BOOT_CPU_MODE_MISMATCH);
7676
}
77+
78+
static inline bool is_kernel_in_hyp_mode(void)
79+
{
80+
return false;
81+
}
82+
83+
/* The section containing the hypervisor text */
84+
extern char __hyp_text_start[];
85+
extern char __hyp_text_end[];
7786
#endif
7887

7988
#endif /* __ASSEMBLY__ */

arch/arm/kernel/Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,9 @@ obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
8888

8989
obj-$(CONFIG_ARM_VIRT_EXT) += hyp-stub.o
9090
ifeq ($(CONFIG_ARM_PSCI),y)
91-
obj-y += psci-call.o
9291
obj-$(CONFIG_SMP) += psci_smp.o
9392
endif
9493

94+
obj-$(CONFIG_HAVE_ARM_SMCCC) += smccc-call.o
95+
9596
extra-y := $(head-y) vmlinux.lds

arch/arm/kernel/armksyms.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include <linux/syscalls.h>
1717
#include <linux/uaccess.h>
1818
#include <linux/io.h>
19+
#include <linux/arm-smccc.h>
1920

2021
#include <asm/checksum.h>
2122
#include <asm/ftrace.h>
@@ -175,3 +176,8 @@ EXPORT_SYMBOL(__gnu_mcount_nc);
175176
EXPORT_SYMBOL(__pv_phys_pfn_offset);
176177
EXPORT_SYMBOL(__pv_offset);
177178
#endif
179+
180+
#ifdef CONFIG_HAVE_ARM_SMCCC
181+
EXPORT_SYMBOL(arm_smccc_smc);
182+
EXPORT_SYMBOL(arm_smccc_hvc);
183+
#endif

arch/arm/kernel/psci-call.S

Lines changed: 0 additions & 31 deletions
This file was deleted.

arch/arm/kernel/smccc-call.S

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
/*
2+
* Copyright (c) 2015, Linaro Limited
3+
*
4+
* This software is licensed under the terms of the GNU General Public
5+
* License version 2, as published by the Free Software Foundation, and
6+
* may be copied, distributed, and modified under those terms.
7+
*
8+
* This program is distributed in the hope that it will be useful,
9+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
10+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+
* GNU General Public License for more details.
12+
*
13+
*/
14+
#include <linux/linkage.h>
15+
16+
#include <asm/opcodes-sec.h>
17+
#include <asm/opcodes-virt.h>
18+
#include <asm/unwind.h>
19+
20+
/*
21+
* Wrap c macros in asm macros to delay expansion until after the
22+
* SMCCC asm macro is expanded.
23+
*/
24+
.macro SMCCC_SMC
25+
__SMC(0)
26+
.endm
27+
28+
.macro SMCCC_HVC
29+
__HVC(0)
30+
.endm
31+
32+
.macro SMCCC instr
33+
UNWIND( .fnstart)
34+
mov r12, sp
35+
push {r4-r7}
36+
UNWIND( .save {r4-r7})
37+
ldm r12, {r4-r7}
38+
\instr
39+
pop {r4-r7}
40+
ldr r12, [sp, #(4 * 4)]
41+
stm r12, {r0-r3}
42+
bx lr
43+
UNWIND( .fnend)
44+
.endm
45+
46+
/*
47+
* void smccc_smc(unsigned long a0, unsigned long a1, unsigned long a2,
48+
* unsigned long a3, unsigned long a4, unsigned long a5,
49+
* unsigned long a6, unsigned long a7, struct arm_smccc_res *res)
50+
*/
51+
ENTRY(arm_smccc_smc)
52+
SMCCC SMCCC_SMC
53+
ENDPROC(arm_smccc_smc)
54+
55+
/*
56+
* void smccc_hvc(unsigned long a0, unsigned long a1, unsigned long a2,
57+
* unsigned long a3, unsigned long a4, unsigned long a5,
58+
* unsigned long a6, unsigned long a7, struct arm_smccc_res *res)
59+
*/
60+
ENTRY(arm_smccc_hvc)
61+
SMCCC SMCCC_HVC
62+
ENDPROC(arm_smccc_hvc)

arch/arm/kvm/arm.c

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
#include <asm/kvm_emulate.h>
4545
#include <asm/kvm_coproc.h>
4646
#include <asm/kvm_psci.h>
47+
#include <asm/sections.h>
4748

4849
#ifdef REQUIRES_VIRT
4950
__asm__(".arch_extension virt");
@@ -58,9 +59,12 @@ static DEFINE_PER_CPU(struct kvm_vcpu *, kvm_arm_running_vcpu);
5859

5960
/* The VMID used in the VTTBR */
6061
static atomic64_t kvm_vmid_gen = ATOMIC64_INIT(1);
61-
static u8 kvm_next_vmid;
62+
static u32 kvm_next_vmid;
63+
static unsigned int kvm_vmid_bits __read_mostly;
6264
static DEFINE_SPINLOCK(kvm_vmid_lock);
6365

66+
static bool vgic_present;
67+
6468
static void kvm_arm_set_running_vcpu(struct kvm_vcpu *vcpu)
6569
{
6670
BUG_ON(preemptible());
@@ -132,7 +136,8 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
132136
kvm->arch.vmid_gen = 0;
133137

134138
/* The maximum number of VCPUs is limited by the host's GIC model */
135-
kvm->arch.max_vcpus = kvm_vgic_get_max_vcpus();
139+
kvm->arch.max_vcpus = vgic_present ?
140+
kvm_vgic_get_max_vcpus() : KVM_MAX_VCPUS;
136141

137142
return ret;
138143
out_free_stage2_pgd:
@@ -170,6 +175,8 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
170175
int r;
171176
switch (ext) {
172177
case KVM_CAP_IRQCHIP:
178+
r = vgic_present;
179+
break;
173180
case KVM_CAP_IOEVENTFD:
174181
case KVM_CAP_DEVICE_CTRL:
175182
case KVM_CAP_USER_MEMORY:
@@ -431,11 +438,12 @@ static void update_vttbr(struct kvm *kvm)
431438
kvm->arch.vmid_gen = atomic64_read(&kvm_vmid_gen);
432439
kvm->arch.vmid = kvm_next_vmid;
433440
kvm_next_vmid++;
441+
kvm_next_vmid &= (1 << kvm_vmid_bits) - 1;
434442

435443
/* update vttbr to be used with the new vmid */
436444
pgd_phys = virt_to_phys(kvm_get_hwpgd(kvm));
437445
BUG_ON(pgd_phys & ~VTTBR_BADDR_MASK);
438-
vmid = ((u64)(kvm->arch.vmid) << VTTBR_VMID_SHIFT) & VTTBR_VMID_MASK;
446+
vmid = ((u64)(kvm->arch.vmid) << VTTBR_VMID_SHIFT) & VTTBR_VMID_MASK(kvm_vmid_bits);
439447
kvm->arch.vttbr = pgd_phys | vmid;
440448

441449
spin_unlock(&kvm_vmid_lock);
@@ -911,6 +919,8 @@ static int kvm_vm_ioctl_set_device_addr(struct kvm *kvm,
911919

912920
switch (dev_id) {
913921
case KVM_ARM_DEVICE_VGIC_V2:
922+
if (!vgic_present)
923+
return -ENXIO;
914924
return kvm_vgic_addr(kvm, type, &dev_addr->addr, true);
915925
default:
916926
return -ENODEV;
@@ -925,6 +935,8 @@ long kvm_arch_vm_ioctl(struct file *filp,
925935

926936
switch (ioctl) {
927937
case KVM_CREATE_IRQCHIP: {
938+
if (!vgic_present)
939+
return -ENXIO;
928940
return kvm_vgic_create(kvm, KVM_DEV_TYPE_ARM_VGIC_V2);
929941
}
930942
case KVM_ARM_SET_DEVICE_ADDR: {
@@ -970,6 +982,7 @@ static void cpu_init_hyp_mode(void *dummy)
970982
vector_ptr = (unsigned long)kvm_ksym_ref(__kvm_hyp_vector);
971983

972984
__cpu_init_hyp_mode(boot_pgd_ptr, pgd_ptr, hyp_stack_ptr, vector_ptr);
985+
__cpu_init_stage2();
973986

974987
kvm_arm_init_debug();
975988
}
@@ -1066,6 +1079,12 @@ static int init_hyp_mode(void)
10661079
goto out_free_mappings;
10671080
}
10681081

1082+
err = create_hyp_mappings(__start_rodata, __end_rodata);
1083+
if (err) {
1084+
kvm_err("Cannot map rodata section\n");
1085+
goto out_free_mappings;
1086+
}
1087+
10691088
/*
10701089
* Map the Hyp stack pages
10711090
*/
@@ -1110,8 +1129,17 @@ static int init_hyp_mode(void)
11101129
* Init HYP view of VGIC
11111130
*/
11121131
err = kvm_vgic_hyp_init();
1113-
if (err)
1132+
switch (err) {
1133+
case 0:
1134+
vgic_present = true;
1135+
break;
1136+
case -ENODEV:
1137+
case -ENXIO:
1138+
vgic_present = false;
1139+
break;
1140+
default:
11141141
goto out_free_context;
1142+
}
11151143

11161144
/*
11171145
* Init HYP architected timer support
@@ -1126,6 +1154,10 @@ static int init_hyp_mode(void)
11261154

11271155
kvm_perf_init();
11281156

1157+
/* set size of VMID supported by CPU */
1158+
kvm_vmid_bits = kvm_get_vmid_bits();
1159+
kvm_info("%d-bit VMID\n", kvm_vmid_bits);
1160+
11291161
kvm_info("Hyp mode initialized successfully\n");
11301162

11311163
return 0;

0 commit comments

Comments
 (0)