diff options
Diffstat (limited to 'arch/s390/include')
-rw-r--r-- | arch/s390/include/asm/atomic.h | 7 | ||||
-rw-r--r-- | arch/s390/include/asm/bitops.h | 5 | ||||
-rw-r--r-- | arch/s390/include/asm/elf.h | 3 | ||||
-rw-r--r-- | arch/s390/include/asm/ipl.h | 1 | ||||
-rw-r--r-- | arch/s390/include/asm/irqflags.h | 16 | ||||
-rw-r--r-- | arch/s390/include/asm/kvm_host.h | 14 | ||||
-rw-r--r-- | arch/s390/include/asm/linkage.h | 5 | ||||
-rw-r--r-- | arch/s390/include/asm/lowcore.h | 13 | ||||
-rw-r--r-- | arch/s390/include/asm/mmu.h | 4 | ||||
-rw-r--r-- | arch/s390/include/asm/pgalloc.h | 7 | ||||
-rw-r--r-- | arch/s390/include/asm/pgtable.h | 44 | ||||
-rw-r--r-- | arch/s390/include/asm/processor.h | 3 | ||||
-rw-r--r-- | arch/s390/include/asm/ptrace.h | 1 | ||||
-rw-r--r-- | arch/s390/include/asm/system.h | 1 | ||||
-rw-r--r-- | arch/s390/include/asm/thread_info.h | 2 | ||||
-rw-r--r-- | arch/s390/include/asm/tlbflush.h | 2 |
16 files changed, 94 insertions, 34 deletions
diff --git a/arch/s390/include/asm/atomic.h b/arch/s390/include/asm/atomic.h index d9db13810d1..8517d2ae3b5 100644 --- a/arch/s390/include/asm/atomic.h +++ b/arch/s390/include/asm/atomic.h | |||
@@ -93,7 +93,7 @@ static inline int atomic_cmpxchg(atomic_t *v, int old, int new) | |||
93 | return old; | 93 | return old; |
94 | } | 94 | } |
95 | 95 | ||
96 | static inline int atomic_add_unless(atomic_t *v, int a, int u) | 96 | static inline int __atomic_add_unless(atomic_t *v, int a, int u) |
97 | { | 97 | { |
98 | int c, old; | 98 | int c, old; |
99 | c = atomic_read(v); | 99 | c = atomic_read(v); |
@@ -105,10 +105,9 @@ static inline int atomic_add_unless(atomic_t *v, int a, int u) | |||
105 | break; | 105 | break; |
106 | c = old; | 106 | c = old; |
107 | } | 107 | } |
108 | return c != u; | 108 | return c; |
109 | } | 109 | } |
110 | 110 | ||
111 | #define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0) | ||
112 | 111 | ||
113 | #undef __CS_LOOP | 112 | #undef __CS_LOOP |
114 | 113 | ||
@@ -332,6 +331,4 @@ static inline long long atomic64_dec_if_positive(atomic64_t *v) | |||
332 | #define smp_mb__before_atomic_inc() smp_mb() | 331 | #define smp_mb__before_atomic_inc() smp_mb() |
333 | #define smp_mb__after_atomic_inc() smp_mb() | 332 | #define smp_mb__after_atomic_inc() smp_mb() |
334 | 333 | ||
335 | #include <asm-generic/atomic-long.h> | ||
336 | |||
337 | #endif /* __ARCH_S390_ATOMIC__ */ | 334 | #endif /* __ARCH_S390_ATOMIC__ */ |
diff --git a/arch/s390/include/asm/bitops.h b/arch/s390/include/asm/bitops.h index 667c6e9f6a3..e5beb490959 100644 --- a/arch/s390/include/asm/bitops.h +++ b/arch/s390/include/asm/bitops.h | |||
@@ -832,10 +832,7 @@ static inline int find_next_bit_le(void *vaddr, unsigned long size, | |||
832 | 832 | ||
833 | #include <asm-generic/bitops/le.h> | 833 | #include <asm-generic/bitops/le.h> |
834 | 834 | ||
835 | #define ext2_set_bit_atomic(lock, nr, addr) \ | 835 | #include <asm-generic/bitops/ext2-atomic-setbit.h> |
836 | test_and_set_bit_le(nr, addr) | ||
837 | #define ext2_clear_bit_atomic(lock, nr, addr) \ | ||
838 | test_and_clear_bit_le(nr, addr) | ||
839 | 836 | ||
840 | 837 | ||
841 | #endif /* __KERNEL__ */ | 838 | #endif /* __KERNEL__ */ |
diff --git a/arch/s390/include/asm/elf.h b/arch/s390/include/asm/elf.h index 64b61bf72e9..547f1a6a35d 100644 --- a/arch/s390/include/asm/elf.h +++ b/arch/s390/include/asm/elf.h | |||
@@ -188,7 +188,8 @@ extern char elf_platform[]; | |||
188 | #define SET_PERSONALITY(ex) \ | 188 | #define SET_PERSONALITY(ex) \ |
189 | do { \ | 189 | do { \ |
190 | if (personality(current->personality) != PER_LINUX32) \ | 190 | if (personality(current->personality) != PER_LINUX32) \ |
191 | set_personality(PER_LINUX); \ | 191 | set_personality(PER_LINUX | \ |
192 | (current->personality & ~PER_MASK)); \ | ||
192 | if ((ex).e_ident[EI_CLASS] == ELFCLASS32) \ | 193 | if ((ex).e_ident[EI_CLASS] == ELFCLASS32) \ |
193 | set_thread_flag(TIF_31BIT); \ | 194 | set_thread_flag(TIF_31BIT); \ |
194 | else \ | 195 | else \ |
diff --git a/arch/s390/include/asm/ipl.h b/arch/s390/include/asm/ipl.h index 5e95d95450b..97cc4403fab 100644 --- a/arch/s390/include/asm/ipl.h +++ b/arch/s390/include/asm/ipl.h | |||
@@ -167,5 +167,6 @@ enum diag308_rc { | |||
167 | }; | 167 | }; |
168 | 168 | ||
169 | extern int diag308(unsigned long subcode, void *addr); | 169 | extern int diag308(unsigned long subcode, void *addr); |
170 | extern void diag308_reset(void); | ||
170 | 171 | ||
171 | #endif /* _ASM_S390_IPL_H */ | 172 | #endif /* _ASM_S390_IPL_H */ |
diff --git a/arch/s390/include/asm/irqflags.h b/arch/s390/include/asm/irqflags.h index 865d6d891ac..38fdf451feb 100644 --- a/arch/s390/include/asm/irqflags.h +++ b/arch/s390/include/asm/irqflags.h | |||
@@ -29,42 +29,42 @@ | |||
29 | }) | 29 | }) |
30 | 30 | ||
31 | /* set system mask. */ | 31 | /* set system mask. */ |
32 | static inline void __arch_local_irq_ssm(unsigned long flags) | 32 | static inline notrace void __arch_local_irq_ssm(unsigned long flags) |
33 | { | 33 | { |
34 | asm volatile("ssm %0" : : "Q" (flags) : "memory"); | 34 | asm volatile("ssm %0" : : "Q" (flags) : "memory"); |
35 | } | 35 | } |
36 | 36 | ||
37 | static inline unsigned long arch_local_save_flags(void) | 37 | static inline notrace unsigned long arch_local_save_flags(void) |
38 | { | 38 | { |
39 | return __arch_local_irq_stosm(0x00); | 39 | return __arch_local_irq_stosm(0x00); |
40 | } | 40 | } |
41 | 41 | ||
42 | static inline unsigned long arch_local_irq_save(void) | 42 | static inline notrace unsigned long arch_local_irq_save(void) |
43 | { | 43 | { |
44 | return __arch_local_irq_stnsm(0xfc); | 44 | return __arch_local_irq_stnsm(0xfc); |
45 | } | 45 | } |
46 | 46 | ||
47 | static inline void arch_local_irq_disable(void) | 47 | static inline notrace void arch_local_irq_disable(void) |
48 | { | 48 | { |
49 | arch_local_irq_save(); | 49 | arch_local_irq_save(); |
50 | } | 50 | } |
51 | 51 | ||
52 | static inline void arch_local_irq_enable(void) | 52 | static inline notrace void arch_local_irq_enable(void) |
53 | { | 53 | { |
54 | __arch_local_irq_stosm(0x03); | 54 | __arch_local_irq_stosm(0x03); |
55 | } | 55 | } |
56 | 56 | ||
57 | static inline void arch_local_irq_restore(unsigned long flags) | 57 | static inline notrace void arch_local_irq_restore(unsigned long flags) |
58 | { | 58 | { |
59 | __arch_local_irq_ssm(flags); | 59 | __arch_local_irq_ssm(flags); |
60 | } | 60 | } |
61 | 61 | ||
62 | static inline bool arch_irqs_disabled_flags(unsigned long flags) | 62 | static inline notrace bool arch_irqs_disabled_flags(unsigned long flags) |
63 | { | 63 | { |
64 | return !(flags & (3UL << (BITS_PER_LONG - 8))); | 64 | return !(flags & (3UL << (BITS_PER_LONG - 8))); |
65 | } | 65 | } |
66 | 66 | ||
67 | static inline bool arch_irqs_disabled(void) | 67 | static inline notrace bool arch_irqs_disabled(void) |
68 | { | 68 | { |
69 | return arch_irqs_disabled_flags(arch_local_save_flags()); | 69 | return arch_irqs_disabled_flags(arch_local_save_flags()); |
70 | } | 70 | } |
diff --git a/arch/s390/include/asm/kvm_host.h b/arch/s390/include/asm/kvm_host.h index cef7dbf69df..123d72a15c0 100644 --- a/arch/s390/include/asm/kvm_host.h +++ b/arch/s390/include/asm/kvm_host.h | |||
@@ -47,7 +47,7 @@ struct sca_block { | |||
47 | #define KVM_HPAGE_MASK(x) (~(KVM_HPAGE_SIZE(x) - 1)) | 47 | #define KVM_HPAGE_MASK(x) (~(KVM_HPAGE_SIZE(x) - 1)) |
48 | #define KVM_PAGES_PER_HPAGE(x) (KVM_HPAGE_SIZE(x) / PAGE_SIZE) | 48 | #define KVM_PAGES_PER_HPAGE(x) (KVM_HPAGE_SIZE(x) / PAGE_SIZE) |
49 | 49 | ||
50 | #define CPUSTAT_HOST 0x80000000 | 50 | #define CPUSTAT_STOPPED 0x80000000 |
51 | #define CPUSTAT_WAIT 0x10000000 | 51 | #define CPUSTAT_WAIT 0x10000000 |
52 | #define CPUSTAT_ECALL_PEND 0x08000000 | 52 | #define CPUSTAT_ECALL_PEND 0x08000000 |
53 | #define CPUSTAT_STOP_INT 0x04000000 | 53 | #define CPUSTAT_STOP_INT 0x04000000 |
@@ -93,9 +93,7 @@ struct kvm_s390_sie_block { | |||
93 | __u32 scaol; /* 0x0064 */ | 93 | __u32 scaol; /* 0x0064 */ |
94 | __u8 reserved68[4]; /* 0x0068 */ | 94 | __u8 reserved68[4]; /* 0x0068 */ |
95 | __u32 todpr; /* 0x006c */ | 95 | __u32 todpr; /* 0x006c */ |
96 | __u8 reserved70[16]; /* 0x0070 */ | 96 | __u8 reserved70[32]; /* 0x0070 */ |
97 | __u64 gmsor; /* 0x0080 */ | ||
98 | __u64 gmslm; /* 0x0088 */ | ||
99 | psw_t gpsw; /* 0x0090 */ | 97 | psw_t gpsw; /* 0x0090 */ |
100 | __u64 gg14; /* 0x00a0 */ | 98 | __u64 gg14; /* 0x00a0 */ |
101 | __u64 gg15; /* 0x00a8 */ | 99 | __u64 gg15; /* 0x00a8 */ |
@@ -138,6 +136,7 @@ struct kvm_vcpu_stat { | |||
138 | u32 instruction_chsc; | 136 | u32 instruction_chsc; |
139 | u32 instruction_stsi; | 137 | u32 instruction_stsi; |
140 | u32 instruction_stfl; | 138 | u32 instruction_stfl; |
139 | u32 instruction_tprot; | ||
141 | u32 instruction_sigp_sense; | 140 | u32 instruction_sigp_sense; |
142 | u32 instruction_sigp_emergency; | 141 | u32 instruction_sigp_emergency; |
143 | u32 instruction_sigp_stop; | 142 | u32 instruction_sigp_stop; |
@@ -175,6 +174,10 @@ struct kvm_s390_prefix_info { | |||
175 | __u32 address; | 174 | __u32 address; |
176 | }; | 175 | }; |
177 | 176 | ||
177 | struct kvm_s390_emerg_info { | ||
178 | __u16 code; | ||
179 | }; | ||
180 | |||
178 | struct kvm_s390_interrupt_info { | 181 | struct kvm_s390_interrupt_info { |
179 | struct list_head list; | 182 | struct list_head list; |
180 | u64 type; | 183 | u64 type; |
@@ -182,6 +185,7 @@ struct kvm_s390_interrupt_info { | |||
182 | struct kvm_s390_io_info io; | 185 | struct kvm_s390_io_info io; |
183 | struct kvm_s390_ext_info ext; | 186 | struct kvm_s390_ext_info ext; |
184 | struct kvm_s390_pgm_info pgm; | 187 | struct kvm_s390_pgm_info pgm; |
188 | struct kvm_s390_emerg_info emerg; | ||
185 | struct kvm_s390_prefix_info prefix; | 189 | struct kvm_s390_prefix_info prefix; |
186 | }; | 190 | }; |
187 | }; | 191 | }; |
@@ -226,6 +230,7 @@ struct kvm_vcpu_arch { | |||
226 | struct cpuid cpu_id; | 230 | struct cpuid cpu_id; |
227 | u64 stidp_data; | 231 | u64 stidp_data; |
228 | }; | 232 | }; |
233 | struct gmap *gmap; | ||
229 | }; | 234 | }; |
230 | 235 | ||
231 | struct kvm_vm_stat { | 236 | struct kvm_vm_stat { |
@@ -236,6 +241,7 @@ struct kvm_arch{ | |||
236 | struct sca_block *sca; | 241 | struct sca_block *sca; |
237 | debug_info_t *dbf; | 242 | debug_info_t *dbf; |
238 | struct kvm_s390_float_interrupt float_int; | 243 | struct kvm_s390_float_interrupt float_int; |
244 | struct gmap *gmap; | ||
239 | }; | 245 | }; |
240 | 246 | ||
241 | extern int sie64a(struct kvm_s390_sie_block *, unsigned long *); | 247 | extern int sie64a(struct kvm_s390_sie_block *, unsigned long *); |
diff --git a/arch/s390/include/asm/linkage.h b/arch/s390/include/asm/linkage.h index 291c2d01c44..fc8a8284778 100644 --- a/arch/s390/include/asm/linkage.h +++ b/arch/s390/include/asm/linkage.h | |||
@@ -1,6 +1,9 @@ | |||
1 | #ifndef __ASM_LINKAGE_H | 1 | #ifndef __ASM_LINKAGE_H |
2 | #define __ASM_LINKAGE_H | 2 | #define __ASM_LINKAGE_H |
3 | 3 | ||
4 | /* Nothing to see here... */ | 4 | #include <linux/stringify.h> |
5 | |||
6 | #define __ALIGN .align 4, 0x07 | ||
7 | #define __ALIGN_STR __stringify(__ALIGN) | ||
5 | 8 | ||
6 | #endif | 9 | #endif |
diff --git a/arch/s390/include/asm/lowcore.h b/arch/s390/include/asm/lowcore.h index 228cf0b295d..e85c911aabf 100644 --- a/arch/s390/include/asm/lowcore.h +++ b/arch/s390/include/asm/lowcore.h | |||
@@ -18,6 +18,7 @@ void system_call(void); | |||
18 | void pgm_check_handler(void); | 18 | void pgm_check_handler(void); |
19 | void mcck_int_handler(void); | 19 | void mcck_int_handler(void); |
20 | void io_int_handler(void); | 20 | void io_int_handler(void); |
21 | void psw_restart_int_handler(void); | ||
21 | 22 | ||
22 | #ifdef CONFIG_32BIT | 23 | #ifdef CONFIG_32BIT |
23 | 24 | ||
@@ -150,7 +151,10 @@ struct _lowcore { | |||
150 | */ | 151 | */ |
151 | __u32 ipib; /* 0x0e00 */ | 152 | __u32 ipib; /* 0x0e00 */ |
152 | __u32 ipib_checksum; /* 0x0e04 */ | 153 | __u32 ipib_checksum; /* 0x0e04 */ |
153 | __u8 pad_0x0e08[0x0f00-0x0e08]; /* 0x0e08 */ | 154 | |
155 | /* 64 bit save area */ | ||
156 | __u64 save_area_64; /* 0x0e08 */ | ||
157 | __u8 pad_0x0e10[0x0f00-0x0e10]; /* 0x0e10 */ | ||
154 | 158 | ||
155 | /* Extended facility list */ | 159 | /* Extended facility list */ |
156 | __u64 stfle_fac_list[32]; /* 0x0f00 */ | 160 | __u64 stfle_fac_list[32]; /* 0x0f00 */ |
@@ -268,7 +272,7 @@ struct _lowcore { | |||
268 | __u64 vdso_per_cpu_data; /* 0x0358 */ | 272 | __u64 vdso_per_cpu_data; /* 0x0358 */ |
269 | __u64 machine_flags; /* 0x0360 */ | 273 | __u64 machine_flags; /* 0x0360 */ |
270 | __u64 ftrace_func; /* 0x0368 */ | 274 | __u64 ftrace_func; /* 0x0368 */ |
271 | __u64 sie_hook; /* 0x0370 */ | 275 | __u64 gmap; /* 0x0370 */ |
272 | __u64 cmf_hpp; /* 0x0378 */ | 276 | __u64 cmf_hpp; /* 0x0378 */ |
273 | 277 | ||
274 | /* Interrupt response block. */ | 278 | /* Interrupt response block. */ |
@@ -286,7 +290,10 @@ struct _lowcore { | |||
286 | */ | 290 | */ |
287 | __u64 ipib; /* 0x0e00 */ | 291 | __u64 ipib; /* 0x0e00 */ |
288 | __u32 ipib_checksum; /* 0x0e08 */ | 292 | __u32 ipib_checksum; /* 0x0e08 */ |
289 | __u8 pad_0x0e0c[0x0f00-0x0e0c]; /* 0x0e0c */ | 293 | |
294 | /* 64 bit save area */ | ||
295 | __u64 save_area_64; /* 0x0e0c */ | ||
296 | __u8 pad_0x0e14[0x0f00-0x0e14]; /* 0x0e14 */ | ||
290 | 297 | ||
291 | /* Extended facility list */ | 298 | /* Extended facility list */ |
292 | __u64 stfle_fac_list[32]; /* 0x0f00 */ | 299 | __u64 stfle_fac_list[32]; /* 0x0f00 */ |
diff --git a/arch/s390/include/asm/mmu.h b/arch/s390/include/asm/mmu.h index 82d0847896a..4506791adcd 100644 --- a/arch/s390/include/asm/mmu.h +++ b/arch/s390/include/asm/mmu.h | |||
@@ -6,6 +6,7 @@ typedef struct { | |||
6 | unsigned int flush_mm; | 6 | unsigned int flush_mm; |
7 | spinlock_t list_lock; | 7 | spinlock_t list_lock; |
8 | struct list_head pgtable_list; | 8 | struct list_head pgtable_list; |
9 | struct list_head gmap_list; | ||
9 | unsigned long asce_bits; | 10 | unsigned long asce_bits; |
10 | unsigned long asce_limit; | 11 | unsigned long asce_limit; |
11 | unsigned long vdso_base; | 12 | unsigned long vdso_base; |
@@ -17,6 +18,7 @@ typedef struct { | |||
17 | 18 | ||
18 | #define INIT_MM_CONTEXT(name) \ | 19 | #define INIT_MM_CONTEXT(name) \ |
19 | .context.list_lock = __SPIN_LOCK_UNLOCKED(name.context.list_lock), \ | 20 | .context.list_lock = __SPIN_LOCK_UNLOCKED(name.context.list_lock), \ |
20 | .context.pgtable_list = LIST_HEAD_INIT(name.context.pgtable_list), | 21 | .context.pgtable_list = LIST_HEAD_INIT(name.context.pgtable_list), \ |
22 | .context.gmap_list = LIST_HEAD_INIT(name.context.gmap_list), | ||
21 | 23 | ||
22 | #endif | 24 | #endif |
diff --git a/arch/s390/include/asm/pgalloc.h b/arch/s390/include/asm/pgalloc.h index 38e71ebcd3c..8eef9b5b3cf 100644 --- a/arch/s390/include/asm/pgalloc.h +++ b/arch/s390/include/asm/pgalloc.h | |||
@@ -20,7 +20,7 @@ | |||
20 | unsigned long *crst_table_alloc(struct mm_struct *); | 20 | unsigned long *crst_table_alloc(struct mm_struct *); |
21 | void crst_table_free(struct mm_struct *, unsigned long *); | 21 | void crst_table_free(struct mm_struct *, unsigned long *); |
22 | 22 | ||
23 | unsigned long *page_table_alloc(struct mm_struct *); | 23 | unsigned long *page_table_alloc(struct mm_struct *, unsigned long); |
24 | void page_table_free(struct mm_struct *, unsigned long *); | 24 | void page_table_free(struct mm_struct *, unsigned long *); |
25 | #ifdef CONFIG_HAVE_RCU_TABLE_FREE | 25 | #ifdef CONFIG_HAVE_RCU_TABLE_FREE |
26 | void page_table_free_rcu(struct mmu_gather *, unsigned long *); | 26 | void page_table_free_rcu(struct mmu_gather *, unsigned long *); |
@@ -115,6 +115,7 @@ static inline pgd_t *pgd_alloc(struct mm_struct *mm) | |||
115 | { | 115 | { |
116 | spin_lock_init(&mm->context.list_lock); | 116 | spin_lock_init(&mm->context.list_lock); |
117 | INIT_LIST_HEAD(&mm->context.pgtable_list); | 117 | INIT_LIST_HEAD(&mm->context.pgtable_list); |
118 | INIT_LIST_HEAD(&mm->context.gmap_list); | ||
118 | return (pgd_t *) crst_table_alloc(mm); | 119 | return (pgd_t *) crst_table_alloc(mm); |
119 | } | 120 | } |
120 | #define pgd_free(mm, pgd) crst_table_free(mm, (unsigned long *) pgd) | 121 | #define pgd_free(mm, pgd) crst_table_free(mm, (unsigned long *) pgd) |
@@ -133,8 +134,8 @@ static inline void pmd_populate(struct mm_struct *mm, | |||
133 | /* | 134 | /* |
134 | * page table entry allocation/free routines. | 135 | * page table entry allocation/free routines. |
135 | */ | 136 | */ |
136 | #define pte_alloc_one_kernel(mm, vmaddr) ((pte_t *) page_table_alloc(mm)) | 137 | #define pte_alloc_one_kernel(mm, vmaddr) ((pte_t *) page_table_alloc(mm, vmaddr)) |
137 | #define pte_alloc_one(mm, vmaddr) ((pte_t *) page_table_alloc(mm)) | 138 | #define pte_alloc_one(mm, vmaddr) ((pte_t *) page_table_alloc(mm, vmaddr)) |
138 | 139 | ||
139 | #define pte_free_kernel(mm, pte) page_table_free(mm, (unsigned long *) pte) | 140 | #define pte_free_kernel(mm, pte) page_table_free(mm, (unsigned long *) pte) |
140 | #define pte_free(mm, pte) page_table_free(mm, (unsigned long *) pte) | 141 | #define pte_free(mm, pte) page_table_free(mm, (unsigned long *) pte) |
diff --git a/arch/s390/include/asm/pgtable.h b/arch/s390/include/asm/pgtable.h index 801fbe1d837..c0cb794bb36 100644 --- a/arch/s390/include/asm/pgtable.h +++ b/arch/s390/include/asm/pgtable.h | |||
@@ -654,6 +654,50 @@ static inline void pgste_set_pte(pte_t *ptep, pgste_t pgste) | |||
654 | #endif | 654 | #endif |
655 | } | 655 | } |
656 | 656 | ||
657 | /** | ||
658 | * struct gmap_struct - guest address space | ||
659 | * @mm: pointer to the parent mm_struct | ||
660 | * @table: pointer to the page directory | ||
661 | * @asce: address space control element for gmap page table | ||
662 | * @crst_list: list of all crst tables used in the guest address space | ||
663 | */ | ||
664 | struct gmap { | ||
665 | struct list_head list; | ||
666 | struct mm_struct *mm; | ||
667 | unsigned long *table; | ||
668 | unsigned long asce; | ||
669 | struct list_head crst_list; | ||
670 | }; | ||
671 | |||
672 | /** | ||
673 | * struct gmap_rmap - reverse mapping for segment table entries | ||
674 | * @next: pointer to the next gmap_rmap structure in the list | ||
675 | * @entry: pointer to a segment table entry | ||
676 | */ | ||
677 | struct gmap_rmap { | ||
678 | struct list_head list; | ||
679 | unsigned long *entry; | ||
680 | }; | ||
681 | |||
682 | /** | ||
683 | * struct gmap_pgtable - gmap information attached to a page table | ||
684 | * @vmaddr: address of the 1MB segment in the process virtual memory | ||
685 | * @mapper: list of segment table entries maping a page table | ||
686 | */ | ||
687 | struct gmap_pgtable { | ||
688 | unsigned long vmaddr; | ||
689 | struct list_head mapper; | ||
690 | }; | ||
691 | |||
692 | struct gmap *gmap_alloc(struct mm_struct *mm); | ||
693 | void gmap_free(struct gmap *gmap); | ||
694 | void gmap_enable(struct gmap *gmap); | ||
695 | void gmap_disable(struct gmap *gmap); | ||
696 | int gmap_map_segment(struct gmap *gmap, unsigned long from, | ||
697 | unsigned long to, unsigned long length); | ||
698 | int gmap_unmap_segment(struct gmap *gmap, unsigned long to, unsigned long len); | ||
699 | unsigned long gmap_fault(unsigned long address, struct gmap *); | ||
700 | |||
657 | /* | 701 | /* |
658 | * Certain architectures need to do special things when PTEs | 702 | * Certain architectures need to do special things when PTEs |
659 | * within a page table are directly modified. Thus, the following | 703 | * within a page table are directly modified. Thus, the following |
diff --git a/arch/s390/include/asm/processor.h b/arch/s390/include/asm/processor.h index 1300c302533..a4b6229e5d4 100644 --- a/arch/s390/include/asm/processor.h +++ b/arch/s390/include/asm/processor.h | |||
@@ -80,6 +80,7 @@ struct thread_struct { | |||
80 | mm_segment_t mm_segment; | 80 | mm_segment_t mm_segment; |
81 | unsigned long prot_addr; /* address of protection-excep. */ | 81 | unsigned long prot_addr; /* address of protection-excep. */ |
82 | unsigned int trap_no; | 82 | unsigned int trap_no; |
83 | unsigned long gmap_addr; /* address of last gmap fault. */ | ||
83 | struct per_regs per_user; /* User specified PER registers */ | 84 | struct per_regs per_user; /* User specified PER registers */ |
84 | struct per_event per_event; /* Cause of the last PER trap */ | 85 | struct per_event per_event; /* Cause of the last PER trap */ |
85 | /* pfault_wait is used to block the process on a pfault event */ | 86 | /* pfault_wait is used to block the process on a pfault event */ |
@@ -118,14 +119,12 @@ struct stack_frame { | |||
118 | * Do necessary setup to start up a new thread. | 119 | * Do necessary setup to start up a new thread. |
119 | */ | 120 | */ |
120 | #define start_thread(regs, new_psw, new_stackp) do { \ | 121 | #define start_thread(regs, new_psw, new_stackp) do { \ |
121 | set_fs(USER_DS); \ | ||
122 | regs->psw.mask = psw_user_bits; \ | 122 | regs->psw.mask = psw_user_bits; \ |
123 | regs->psw.addr = new_psw | PSW_ADDR_AMODE; \ | 123 | regs->psw.addr = new_psw | PSW_ADDR_AMODE; \ |
124 | regs->gprs[15] = new_stackp; \ | 124 | regs->gprs[15] = new_stackp; \ |
125 | } while (0) | 125 | } while (0) |
126 | 126 | ||
127 | #define start_thread31(regs, new_psw, new_stackp) do { \ | 127 | #define start_thread31(regs, new_psw, new_stackp) do { \ |
128 | set_fs(USER_DS); \ | ||
129 | regs->psw.mask = psw_user32_bits; \ | 128 | regs->psw.mask = psw_user32_bits; \ |
130 | regs->psw.addr = new_psw | PSW_ADDR_AMODE; \ | 129 | regs->psw.addr = new_psw | PSW_ADDR_AMODE; \ |
131 | regs->gprs[15] = new_stackp; \ | 130 | regs->gprs[15] = new_stackp; \ |
diff --git a/arch/s390/include/asm/ptrace.h b/arch/s390/include/asm/ptrace.h index 9ad628a8574..62fd80c9e98 100644 --- a/arch/s390/include/asm/ptrace.h +++ b/arch/s390/include/asm/ptrace.h | |||
@@ -539,7 +539,6 @@ struct user_regs_struct | |||
539 | * These are defined as per linux/ptrace.h, which see. | 539 | * These are defined as per linux/ptrace.h, which see. |
540 | */ | 540 | */ |
541 | #define arch_has_single_step() (1) | 541 | #define arch_has_single_step() (1) |
542 | extern void show_regs(struct pt_regs * regs); | ||
543 | 542 | ||
544 | #define user_mode(regs) (((regs)->psw.mask & PSW_MASK_PSTATE) != 0) | 543 | #define user_mode(regs) (((regs)->psw.mask & PSW_MASK_PSTATE) != 0) |
545 | #define instruction_pointer(regs) ((regs)->psw.addr & PSW_ADDR_INSN) | 544 | #define instruction_pointer(regs) ((regs)->psw.addr & PSW_ADDR_INSN) |
diff --git a/arch/s390/include/asm/system.h b/arch/s390/include/asm/system.h index d382629a017..6582f69f238 100644 --- a/arch/s390/include/asm/system.h +++ b/arch/s390/include/asm/system.h | |||
@@ -113,6 +113,7 @@ extern void pfault_fini(void); | |||
113 | 113 | ||
114 | extern void cmma_init(void); | 114 | extern void cmma_init(void); |
115 | extern int memcpy_real(void *, void *, size_t); | 115 | extern int memcpy_real(void *, void *, size_t); |
116 | extern void copy_to_absolute_zero(void *dest, void *src, size_t count); | ||
116 | 117 | ||
117 | #define finish_arch_switch(prev) do { \ | 118 | #define finish_arch_switch(prev) do { \ |
118 | set_fs(current->thread.mm_segment); \ | 119 | set_fs(current->thread.mm_segment); \ |
diff --git a/arch/s390/include/asm/thread_info.h b/arch/s390/include/asm/thread_info.h index ad1382f7932..1a5dbb6f149 100644 --- a/arch/s390/include/asm/thread_info.h +++ b/arch/s390/include/asm/thread_info.h | |||
@@ -94,6 +94,7 @@ static inline struct thread_info *current_thread_info(void) | |||
94 | #define TIF_SYSCALL_AUDIT 9 /* syscall auditing active */ | 94 | #define TIF_SYSCALL_AUDIT 9 /* syscall auditing active */ |
95 | #define TIF_SECCOMP 10 /* secure computing */ | 95 | #define TIF_SECCOMP 10 /* secure computing */ |
96 | #define TIF_SYSCALL_TRACEPOINT 11 /* syscall tracepoint instrumentation */ | 96 | #define TIF_SYSCALL_TRACEPOINT 11 /* syscall tracepoint instrumentation */ |
97 | #define TIF_SIE 12 /* guest execution active */ | ||
97 | #define TIF_POLLING_NRFLAG 16 /* true if poll_idle() is polling | 98 | #define TIF_POLLING_NRFLAG 16 /* true if poll_idle() is polling |
98 | TIF_NEED_RESCHED */ | 99 | TIF_NEED_RESCHED */ |
99 | #define TIF_31BIT 17 /* 32bit process */ | 100 | #define TIF_31BIT 17 /* 32bit process */ |
@@ -113,6 +114,7 @@ static inline struct thread_info *current_thread_info(void) | |||
113 | #define _TIF_SYSCALL_AUDIT (1<<TIF_SYSCALL_AUDIT) | 114 | #define _TIF_SYSCALL_AUDIT (1<<TIF_SYSCALL_AUDIT) |
114 | #define _TIF_SECCOMP (1<<TIF_SECCOMP) | 115 | #define _TIF_SECCOMP (1<<TIF_SECCOMP) |
115 | #define _TIF_SYSCALL_TRACEPOINT (1<<TIF_SYSCALL_TRACEPOINT) | 116 | #define _TIF_SYSCALL_TRACEPOINT (1<<TIF_SYSCALL_TRACEPOINT) |
117 | #define _TIF_SIE (1<<TIF_SIE) | ||
116 | #define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG) | 118 | #define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG) |
117 | #define _TIF_31BIT (1<<TIF_31BIT) | 119 | #define _TIF_31BIT (1<<TIF_31BIT) |
118 | #define _TIF_SINGLE_STEP (1<<TIF_FREEZE) | 120 | #define _TIF_SINGLE_STEP (1<<TIF_FREEZE) |
diff --git a/arch/s390/include/asm/tlbflush.h b/arch/s390/include/asm/tlbflush.h index b7a4f2eb005..30444538238 100644 --- a/arch/s390/include/asm/tlbflush.h +++ b/arch/s390/include/asm/tlbflush.h | |||
@@ -80,7 +80,7 @@ static inline void __tlb_flush_mm(struct mm_struct * mm) | |||
80 | * on all cpus instead of doing a local flush if the mm | 80 | * on all cpus instead of doing a local flush if the mm |
81 | * only ran on the local cpu. | 81 | * only ran on the local cpu. |
82 | */ | 82 | */ |
83 | if (MACHINE_HAS_IDTE) | 83 | if (MACHINE_HAS_IDTE && list_empty(&mm->context.gmap_list)) |
84 | __tlb_flush_idte((unsigned long) mm->pgd | | 84 | __tlb_flush_idte((unsigned long) mm->pgd | |
85 | mm->context.asce_bits); | 85 | mm->context.asce_bits); |
86 | else | 86 | else |