diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-06-04 11:47:12 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-06-04 11:47:12 -0400 |
commit | b05d59dfceaea72565b1648af929b037b0f96d7f (patch) | |
tree | bbe92714be468ed8783bce6ac2c305c0aedf8eb5 /drivers/s390 | |
parent | daf342af2f7856fd2f5c66b9fb39a8f24986ca53 (diff) | |
parent | 820b3fcdeb80d30410f4427d2cbf9161c35fdeef (diff) |
Merge tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm into next
Pull KVM updates from Paolo Bonzini:
"At over 200 commits, covering almost all supported architectures, this
was a pretty active cycle for KVM. Changes include:
- a lot of s390 changes: optimizations, support for migration, GDB
support and more
- ARM changes are pretty small: support for the PSCI 0.2 hypercall
interface on both the guest and the host (the latter acked by
Catalin)
- initial POWER8 and little-endian host support
- support for running u-boot on embedded POWER targets
- pretty large changes to MIPS too, completing the userspace
interface and improving the handling of virtualized timer hardware
- for x86, a larger set of changes is scheduled for 3.17. Still, we
have a few emulator bugfixes and support for running nested
fully-virtualized Xen guests (para-virtualized Xen guests have
always worked). And some optimizations too.
The only missing architecture here is ia64. It's not a coincidence
that support for KVM on ia64 is scheduled for removal in 3.17"
* tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm: (203 commits)
KVM: add missing cleanup_srcu_struct
KVM: PPC: Book3S PR: Rework SLB switching code
KVM: PPC: Book3S PR: Use SLB entry 0
KVM: PPC: Book3S HV: Fix machine check delivery to guest
KVM: PPC: Book3S HV: Work around POWER8 performance monitor bugs
KVM: PPC: Book3S HV: Make sure we don't miss dirty pages
KVM: PPC: Book3S HV: Fix dirty map for hugepages
KVM: PPC: Book3S HV: Put huge-page HPTEs in rmap chain for base address
KVM: PPC: Book3S HV: Fix check for running inside guest in global_invalidates()
KVM: PPC: Book3S: Move KVM_REG_PPC_WORT to an unused register number
KVM: PPC: Book3S: Add ONE_REG register names that were missed
KVM: PPC: Add CAP to indicate hcall fixes
KVM: PPC: MPIC: Reset IRQ source private members
KVM: PPC: Graciously fail broken LE hypercalls
PPC: ePAPR: Fix hypercall on LE guest
KVM: PPC: BOOK3S: Remove open coded make_dsisr in alignment handler
KVM: PPC: BOOK3S: Always use the saved DAR value
PPC: KVM: Make NX bit available with magic page
KVM: PPC: Disable NX for old magic page using guests
KVM: PPC: BOOK3S: HV: Add mixed page-size support for guest
...
Diffstat (limited to 'drivers/s390')
-rw-r--r-- | drivers/s390/char/sclp_early.c | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/drivers/s390/char/sclp_early.c b/drivers/s390/char/sclp_early.c index 14196ea0fdf3..1918d9dff45d 100644 --- a/drivers/s390/char/sclp_early.c +++ b/drivers/s390/char/sclp_early.c | |||
@@ -22,11 +22,14 @@ struct read_info_sccb { | |||
22 | u8 rnsize; /* 10 */ | 22 | u8 rnsize; /* 10 */ |
23 | u8 _reserved0[16 - 11]; /* 11-15 */ | 23 | u8 _reserved0[16 - 11]; /* 11-15 */ |
24 | u16 ncpurl; /* 16-17 */ | 24 | u16 ncpurl; /* 16-17 */ |
25 | u8 _reserved7[24 - 18]; /* 18-23 */ | 25 | u16 cpuoff; /* 18-19 */ |
26 | u8 _reserved7[24 - 20]; /* 20-23 */ | ||
26 | u8 loadparm[8]; /* 24-31 */ | 27 | u8 loadparm[8]; /* 24-31 */ |
27 | u8 _reserved1[48 - 32]; /* 32-47 */ | 28 | u8 _reserved1[48 - 32]; /* 32-47 */ |
28 | u64 facilities; /* 48-55 */ | 29 | u64 facilities; /* 48-55 */ |
29 | u8 _reserved2[84 - 56]; /* 56-83 */ | 30 | u8 _reserved2a[76 - 56]; /* 56-75 */ |
31 | u32 ibc; /* 76-79 */ | ||
32 | u8 _reserved2b[84 - 80]; /* 80-83 */ | ||
30 | u8 fac84; /* 84 */ | 33 | u8 fac84; /* 84 */ |
31 | u8 fac85; /* 85 */ | 34 | u8 fac85; /* 85 */ |
32 | u8 _reserved3[91 - 86]; /* 86-90 */ | 35 | u8 _reserved3[91 - 86]; /* 86-90 */ |
@@ -45,6 +48,8 @@ static unsigned int sclp_con_has_linemode __initdata; | |||
45 | static unsigned long sclp_hsa_size; | 48 | static unsigned long sclp_hsa_size; |
46 | static unsigned int sclp_max_cpu; | 49 | static unsigned int sclp_max_cpu; |
47 | static struct sclp_ipl_info sclp_ipl_info; | 50 | static struct sclp_ipl_info sclp_ipl_info; |
51 | static unsigned char sclp_siif; | ||
52 | static u32 sclp_ibc; | ||
48 | 53 | ||
49 | u64 sclp_facilities; | 54 | u64 sclp_facilities; |
50 | u8 sclp_fac84; | 55 | u8 sclp_fac84; |
@@ -96,6 +101,9 @@ static int __init sclp_read_info_early(struct read_info_sccb *sccb) | |||
96 | 101 | ||
97 | static void __init sclp_facilities_detect(struct read_info_sccb *sccb) | 102 | static void __init sclp_facilities_detect(struct read_info_sccb *sccb) |
98 | { | 103 | { |
104 | struct sclp_cpu_entry *cpue; | ||
105 | u16 boot_cpu_address, cpu; | ||
106 | |||
99 | if (sclp_read_info_early(sccb)) | 107 | if (sclp_read_info_early(sccb)) |
100 | return; | 108 | return; |
101 | 109 | ||
@@ -106,6 +114,7 @@ static void __init sclp_facilities_detect(struct read_info_sccb *sccb) | |||
106 | sclp_rnmax = sccb->rnmax ? sccb->rnmax : sccb->rnmax2; | 114 | sclp_rnmax = sccb->rnmax ? sccb->rnmax : sccb->rnmax2; |
107 | sclp_rzm = sccb->rnsize ? sccb->rnsize : sccb->rnsize2; | 115 | sclp_rzm = sccb->rnsize ? sccb->rnsize : sccb->rnsize2; |
108 | sclp_rzm <<= 20; | 116 | sclp_rzm <<= 20; |
117 | sclp_ibc = sccb->ibc; | ||
109 | 118 | ||
110 | if (!sccb->hcpua) { | 119 | if (!sccb->hcpua) { |
111 | if (MACHINE_IS_VM) | 120 | if (MACHINE_IS_VM) |
@@ -116,6 +125,15 @@ static void __init sclp_facilities_detect(struct read_info_sccb *sccb) | |||
116 | sclp_max_cpu = sccb->hcpua + 1; | 125 | sclp_max_cpu = sccb->hcpua + 1; |
117 | } | 126 | } |
118 | 127 | ||
128 | boot_cpu_address = stap(); | ||
129 | cpue = (void *)sccb + sccb->cpuoff; | ||
130 | for (cpu = 0; cpu < sccb->ncpurl; cpue++, cpu++) { | ||
131 | if (boot_cpu_address != cpue->address) | ||
132 | continue; | ||
133 | sclp_siif = cpue->siif; | ||
134 | break; | ||
135 | } | ||
136 | |||
119 | /* Save IPL information */ | 137 | /* Save IPL information */ |
120 | sclp_ipl_info.is_valid = 1; | 138 | sclp_ipl_info.is_valid = 1; |
121 | if (sccb->flags & 0x2) | 139 | if (sccb->flags & 0x2) |
@@ -148,6 +166,18 @@ unsigned int sclp_get_max_cpu(void) | |||
148 | return sclp_max_cpu; | 166 | return sclp_max_cpu; |
149 | } | 167 | } |
150 | 168 | ||
169 | int sclp_has_siif(void) | ||
170 | { | ||
171 | return sclp_siif; | ||
172 | } | ||
173 | EXPORT_SYMBOL(sclp_has_siif); | ||
174 | |||
175 | unsigned int sclp_get_ibc(void) | ||
176 | { | ||
177 | return sclp_ibc; | ||
178 | } | ||
179 | EXPORT_SYMBOL(sclp_get_ibc); | ||
180 | |||
151 | /* | 181 | /* |
152 | * This function will be called after sclp_facilities_detect(), which gets | 182 | * This function will be called after sclp_facilities_detect(), which gets |
153 | * called from early.c code. The sclp_facilities_detect() function retrieves | 183 | * called from early.c code. The sclp_facilities_detect() function retrieves |