diff options
| -rw-r--r-- | arch/s390/include/asm/debug.h | 3 | ||||
| -rw-r--r-- | arch/s390/include/asm/dis.h | 2 | ||||
| -rw-r--r-- | arch/s390/include/asm/kprobes.h | 20 | ||||
| -rw-r--r-- | arch/s390/include/asm/sysinfo.h | 2 | ||||
| -rw-r--r-- | arch/s390/kernel/debug.c | 8 | ||||
| -rw-r--r-- | arch/s390/kernel/entry.S | 21 | ||||
| -rw-r--r-- | arch/s390/kernel/ftrace.c | 4 | ||||
| -rw-r--r-- | arch/s390/kernel/vmlinux.lds.S | 8 | ||||
| -rw-r--r-- | arch/s390/lib/probes.c | 1 | ||||
| -rw-r--r-- | arch/s390/lib/uaccess.c | 4 | ||||
| -rw-r--r-- | drivers/s390/cio/ccwgroup.c | 4 | ||||
| -rw-r--r-- | drivers/s390/cio/qdio_debug.h | 2 | ||||
| -rw-r--r-- | drivers/s390/virtio/virtio_ccw.c | 2 |
13 files changed, 55 insertions, 26 deletions
diff --git a/arch/s390/include/asm/debug.h b/arch/s390/include/asm/debug.h index 0206c8052328..df7b54ea956d 100644 --- a/arch/s390/include/asm/debug.h +++ b/arch/s390/include/asm/debug.h | |||
| @@ -10,6 +10,7 @@ | |||
| 10 | #include <linux/spinlock.h> | 10 | #include <linux/spinlock.h> |
| 11 | #include <linux/kernel.h> | 11 | #include <linux/kernel.h> |
| 12 | #include <linux/time.h> | 12 | #include <linux/time.h> |
| 13 | #include <linux/refcount.h> | ||
| 13 | #include <uapi/asm/debug.h> | 14 | #include <uapi/asm/debug.h> |
| 14 | 15 | ||
| 15 | #define DEBUG_MAX_LEVEL 6 /* debug levels range from 0 to 6 */ | 16 | #define DEBUG_MAX_LEVEL 6 /* debug levels range from 0 to 6 */ |
| @@ -31,7 +32,7 @@ struct debug_view; | |||
| 31 | typedef struct debug_info { | 32 | typedef struct debug_info { |
| 32 | struct debug_info* next; | 33 | struct debug_info* next; |
| 33 | struct debug_info* prev; | 34 | struct debug_info* prev; |
| 34 | atomic_t ref_count; | 35 | refcount_t ref_count; |
| 35 | spinlock_t lock; | 36 | spinlock_t lock; |
| 36 | int level; | 37 | int level; |
| 37 | int nr_areas; | 38 | int nr_areas; |
diff --git a/arch/s390/include/asm/dis.h b/arch/s390/include/asm/dis.h index 60323c21938b..37f617dfbede 100644 --- a/arch/s390/include/asm/dis.h +++ b/arch/s390/include/asm/dis.h | |||
| @@ -40,6 +40,8 @@ static inline int insn_length(unsigned char code) | |||
| 40 | return ((((int) code + 64) >> 7) + 1) << 1; | 40 | return ((((int) code + 64) >> 7) + 1) << 1; |
| 41 | } | 41 | } |
| 42 | 42 | ||
| 43 | struct pt_regs; | ||
| 44 | |||
| 43 | void show_code(struct pt_regs *regs); | 45 | void show_code(struct pt_regs *regs); |
| 44 | void print_fn_code(unsigned char *code, unsigned long len); | 46 | void print_fn_code(unsigned char *code, unsigned long len); |
| 45 | int insn_to_mnemonic(unsigned char *instruction, char *buf, unsigned int len); | 47 | int insn_to_mnemonic(unsigned char *instruction, char *buf, unsigned int len); |
diff --git a/arch/s390/include/asm/kprobes.h b/arch/s390/include/asm/kprobes.h index 1293c4066cfc..28792ef82c83 100644 --- a/arch/s390/include/asm/kprobes.h +++ b/arch/s390/include/asm/kprobes.h | |||
| @@ -27,12 +27,21 @@ | |||
| 27 | * 2005-Dec Used as a template for s390 by Mike Grundy | 27 | * 2005-Dec Used as a template for s390 by Mike Grundy |
| 28 | * <grundym@us.ibm.com> | 28 | * <grundym@us.ibm.com> |
| 29 | */ | 29 | */ |
| 30 | #include <linux/types.h> | ||
| 30 | #include <asm-generic/kprobes.h> | 31 | #include <asm-generic/kprobes.h> |
| 31 | 32 | ||
| 32 | #define BREAKPOINT_INSTRUCTION 0x0002 | 33 | #define BREAKPOINT_INSTRUCTION 0x0002 |
| 33 | 34 | ||
| 35 | #define FIXUP_PSW_NORMAL 0x08 | ||
| 36 | #define FIXUP_BRANCH_NOT_TAKEN 0x04 | ||
| 37 | #define FIXUP_RETURN_REGISTER 0x02 | ||
| 38 | #define FIXUP_NOT_REQUIRED 0x01 | ||
| 39 | |||
| 40 | int probe_is_prohibited_opcode(u16 *insn); | ||
| 41 | int probe_get_fixup_type(u16 *insn); | ||
| 42 | int probe_is_insn_relative_long(u16 *insn); | ||
| 43 | |||
| 34 | #ifdef CONFIG_KPROBES | 44 | #ifdef CONFIG_KPROBES |
| 35 | #include <linux/types.h> | ||
| 36 | #include <linux/ptrace.h> | 45 | #include <linux/ptrace.h> |
| 37 | #include <linux/percpu.h> | 46 | #include <linux/percpu.h> |
| 38 | #include <linux/sched/task_stack.h> | 47 | #include <linux/sched/task_stack.h> |
| @@ -56,11 +65,6 @@ typedef u16 kprobe_opcode_t; | |||
| 56 | 65 | ||
| 57 | #define KPROBE_SWAP_INST 0x10 | 66 | #define KPROBE_SWAP_INST 0x10 |
| 58 | 67 | ||
| 59 | #define FIXUP_PSW_NORMAL 0x08 | ||
| 60 | #define FIXUP_BRANCH_NOT_TAKEN 0x04 | ||
| 61 | #define FIXUP_RETURN_REGISTER 0x02 | ||
| 62 | #define FIXUP_NOT_REQUIRED 0x01 | ||
| 63 | |||
| 64 | /* Architecture specific copy of original instruction */ | 68 | /* Architecture specific copy of original instruction */ |
| 65 | struct arch_specific_insn { | 69 | struct arch_specific_insn { |
| 66 | /* copy of original instruction */ | 70 | /* copy of original instruction */ |
| @@ -90,10 +94,6 @@ int kprobe_fault_handler(struct pt_regs *regs, int trapnr); | |||
| 90 | int kprobe_exceptions_notify(struct notifier_block *self, | 94 | int kprobe_exceptions_notify(struct notifier_block *self, |
| 91 | unsigned long val, void *data); | 95 | unsigned long val, void *data); |
| 92 | 96 | ||
| 93 | int probe_is_prohibited_opcode(u16 *insn); | ||
| 94 | int probe_get_fixup_type(u16 *insn); | ||
| 95 | int probe_is_insn_relative_long(u16 *insn); | ||
| 96 | |||
| 97 | #define flush_insn_slot(p) do { } while (0) | 97 | #define flush_insn_slot(p) do { } while (0) |
| 98 | 98 | ||
| 99 | #endif /* CONFIG_KPROBES */ | 99 | #endif /* CONFIG_KPROBES */ |
diff --git a/arch/s390/include/asm/sysinfo.h b/arch/s390/include/asm/sysinfo.h index 73bff45ced55..e784bed6ed7f 100644 --- a/arch/s390/include/asm/sysinfo.h +++ b/arch/s390/include/asm/sysinfo.h | |||
| @@ -146,7 +146,7 @@ extern int topology_max_mnest; | |||
| 146 | * Returns the maximum nesting level supported by the cpu topology code. | 146 | * Returns the maximum nesting level supported by the cpu topology code. |
| 147 | * The current maximum level is 4 which is the drawer level. | 147 | * The current maximum level is 4 which is the drawer level. |
| 148 | */ | 148 | */ |
| 149 | static inline int topology_mnest_limit(void) | 149 | static inline unsigned char topology_mnest_limit(void) |
| 150 | { | 150 | { |
| 151 | return min(topology_max_mnest, 4); | 151 | return min(topology_max_mnest, 4); |
| 152 | } | 152 | } |
diff --git a/arch/s390/kernel/debug.c b/arch/s390/kernel/debug.c index 530226b6cb19..86b3e74f569e 100644 --- a/arch/s390/kernel/debug.c +++ b/arch/s390/kernel/debug.c | |||
| @@ -277,7 +277,7 @@ debug_info_alloc(const char *name, int pages_per_area, int nr_areas, | |||
| 277 | memset(rc->views, 0, DEBUG_MAX_VIEWS * sizeof(struct debug_view *)); | 277 | memset(rc->views, 0, DEBUG_MAX_VIEWS * sizeof(struct debug_view *)); |
| 278 | memset(rc->debugfs_entries, 0 ,DEBUG_MAX_VIEWS * | 278 | memset(rc->debugfs_entries, 0 ,DEBUG_MAX_VIEWS * |
| 279 | sizeof(struct dentry*)); | 279 | sizeof(struct dentry*)); |
| 280 | atomic_set(&(rc->ref_count), 0); | 280 | refcount_set(&(rc->ref_count), 0); |
| 281 | 281 | ||
| 282 | return rc; | 282 | return rc; |
| 283 | 283 | ||
| @@ -361,7 +361,7 @@ debug_info_create(const char *name, int pages_per_area, int nr_areas, | |||
| 361 | debug_area_last = rc; | 361 | debug_area_last = rc; |
| 362 | rc->next = NULL; | 362 | rc->next = NULL; |
| 363 | 363 | ||
| 364 | debug_info_get(rc); | 364 | refcount_set(&rc->ref_count, 1); |
| 365 | out: | 365 | out: |
| 366 | return rc; | 366 | return rc; |
| 367 | } | 367 | } |
| @@ -416,7 +416,7 @@ static void | |||
| 416 | debug_info_get(debug_info_t * db_info) | 416 | debug_info_get(debug_info_t * db_info) |
| 417 | { | 417 | { |
| 418 | if (db_info) | 418 | if (db_info) |
| 419 | atomic_inc(&db_info->ref_count); | 419 | refcount_inc(&db_info->ref_count); |
| 420 | } | 420 | } |
| 421 | 421 | ||
| 422 | /* | 422 | /* |
| @@ -431,7 +431,7 @@ debug_info_put(debug_info_t *db_info) | |||
| 431 | 431 | ||
| 432 | if (!db_info) | 432 | if (!db_info) |
| 433 | return; | 433 | return; |
| 434 | if (atomic_dec_and_test(&db_info->ref_count)) { | 434 | if (refcount_dec_and_test(&db_info->ref_count)) { |
| 435 | for (i = 0; i < DEBUG_MAX_VIEWS; i++) { | 435 | for (i = 0; i < DEBUG_MAX_VIEWS; i++) { |
| 436 | if (!db_info->views[i]) | 436 | if (!db_info->views[i]) |
| 437 | continue; | 437 | continue; |
diff --git a/arch/s390/kernel/entry.S b/arch/s390/kernel/entry.S index a5f5d3bb3dbc..e408d9cc5b96 100644 --- a/arch/s390/kernel/entry.S +++ b/arch/s390/kernel/entry.S | |||
| @@ -312,6 +312,7 @@ ENTRY(system_call) | |||
| 312 | lg %r14,__LC_VDSO_PER_CPU | 312 | lg %r14,__LC_VDSO_PER_CPU |
| 313 | lmg %r0,%r10,__PT_R0(%r11) | 313 | lmg %r0,%r10,__PT_R0(%r11) |
| 314 | mvc __LC_RETURN_PSW(16),__PT_PSW(%r11) | 314 | mvc __LC_RETURN_PSW(16),__PT_PSW(%r11) |
| 315 | .Lsysc_exit_timer: | ||
| 315 | stpt __LC_EXIT_TIMER | 316 | stpt __LC_EXIT_TIMER |
| 316 | mvc __VDSO_ECTG_BASE(16,%r14),__LC_EXIT_TIMER | 317 | mvc __VDSO_ECTG_BASE(16,%r14),__LC_EXIT_TIMER |
| 317 | lmg %r11,%r15,__PT_R11(%r11) | 318 | lmg %r11,%r15,__PT_R11(%r11) |
| @@ -623,6 +624,7 @@ ENTRY(io_int_handler) | |||
| 623 | lg %r14,__LC_VDSO_PER_CPU | 624 | lg %r14,__LC_VDSO_PER_CPU |
| 624 | lmg %r0,%r10,__PT_R0(%r11) | 625 | lmg %r0,%r10,__PT_R0(%r11) |
| 625 | mvc __LC_RETURN_PSW(16),__PT_PSW(%r11) | 626 | mvc __LC_RETURN_PSW(16),__PT_PSW(%r11) |
| 627 | .Lio_exit_timer: | ||
| 626 | stpt __LC_EXIT_TIMER | 628 | stpt __LC_EXIT_TIMER |
| 627 | mvc __VDSO_ECTG_BASE(16,%r14),__LC_EXIT_TIMER | 629 | mvc __VDSO_ECTG_BASE(16,%r14),__LC_EXIT_TIMER |
| 628 | lmg %r11,%r15,__PT_R11(%r11) | 630 | lmg %r11,%r15,__PT_R11(%r11) |
| @@ -1174,15 +1176,23 @@ cleanup_critical: | |||
| 1174 | br %r14 | 1176 | br %r14 |
| 1175 | 1177 | ||
| 1176 | .Lcleanup_sysc_restore: | 1178 | .Lcleanup_sysc_restore: |
| 1179 | # check if stpt has been executed | ||
| 1177 | clg %r9,BASED(.Lcleanup_sysc_restore_insn) | 1180 | clg %r9,BASED(.Lcleanup_sysc_restore_insn) |
| 1181 | jh 0f | ||
| 1182 | mvc __LC_EXIT_TIMER(8),__LC_ASYNC_ENTER_TIMER | ||
| 1183 | cghi %r11,__LC_SAVE_AREA_ASYNC | ||
| 1178 | je 0f | 1184 | je 0f |
| 1185 | mvc __LC_EXIT_TIMER(8),__LC_MCCK_ENTER_TIMER | ||
| 1186 | 0: clg %r9,BASED(.Lcleanup_sysc_restore_insn+8) | ||
| 1187 | je 1f | ||
| 1179 | lg %r9,24(%r11) # get saved pointer to pt_regs | 1188 | lg %r9,24(%r11) # get saved pointer to pt_regs |
| 1180 | mvc __LC_RETURN_PSW(16),__PT_PSW(%r9) | 1189 | mvc __LC_RETURN_PSW(16),__PT_PSW(%r9) |
| 1181 | mvc 0(64,%r11),__PT_R8(%r9) | 1190 | mvc 0(64,%r11),__PT_R8(%r9) |
| 1182 | lmg %r0,%r7,__PT_R0(%r9) | 1191 | lmg %r0,%r7,__PT_R0(%r9) |
| 1183 | 0: lmg %r8,%r9,__LC_RETURN_PSW | 1192 | 1: lmg %r8,%r9,__LC_RETURN_PSW |
| 1184 | br %r14 | 1193 | br %r14 |
| 1185 | .Lcleanup_sysc_restore_insn: | 1194 | .Lcleanup_sysc_restore_insn: |
| 1195 | .quad .Lsysc_exit_timer | ||
| 1186 | .quad .Lsysc_done - 4 | 1196 | .quad .Lsysc_done - 4 |
| 1187 | 1197 | ||
| 1188 | .Lcleanup_io_tif: | 1198 | .Lcleanup_io_tif: |
| @@ -1190,15 +1200,20 @@ cleanup_critical: | |||
| 1190 | br %r14 | 1200 | br %r14 |
| 1191 | 1201 | ||
| 1192 | .Lcleanup_io_restore: | 1202 | .Lcleanup_io_restore: |
| 1203 | # check if stpt has been executed | ||
| 1193 | clg %r9,BASED(.Lcleanup_io_restore_insn) | 1204 | clg %r9,BASED(.Lcleanup_io_restore_insn) |
| 1194 | je 0f | 1205 | jh 0f |
| 1206 | mvc __LC_EXIT_TIMER(8),__LC_MCCK_ENTER_TIMER | ||
| 1207 | 0: clg %r9,BASED(.Lcleanup_io_restore_insn+8) | ||
| 1208 | je 1f | ||
| 1195 | lg %r9,24(%r11) # get saved r11 pointer to pt_regs | 1209 | lg %r9,24(%r11) # get saved r11 pointer to pt_regs |
| 1196 | mvc __LC_RETURN_PSW(16),__PT_PSW(%r9) | 1210 | mvc __LC_RETURN_PSW(16),__PT_PSW(%r9) |
| 1197 | mvc 0(64,%r11),__PT_R8(%r9) | 1211 | mvc 0(64,%r11),__PT_R8(%r9) |
| 1198 | lmg %r0,%r7,__PT_R0(%r9) | 1212 | lmg %r0,%r7,__PT_R0(%r9) |
| 1199 | 0: lmg %r8,%r9,__LC_RETURN_PSW | 1213 | 1: lmg %r8,%r9,__LC_RETURN_PSW |
| 1200 | br %r14 | 1214 | br %r14 |
| 1201 | .Lcleanup_io_restore_insn: | 1215 | .Lcleanup_io_restore_insn: |
| 1216 | .quad .Lio_exit_timer | ||
| 1202 | .quad .Lio_done - 4 | 1217 | .quad .Lio_done - 4 |
| 1203 | 1218 | ||
| 1204 | .Lcleanup_idle: | 1219 | .Lcleanup_idle: |
diff --git a/arch/s390/kernel/ftrace.c b/arch/s390/kernel/ftrace.c index 27477f34cc0a..d03a6d12c4bd 100644 --- a/arch/s390/kernel/ftrace.c +++ b/arch/s390/kernel/ftrace.c | |||
| @@ -173,6 +173,8 @@ int __init ftrace_dyn_arch_init(void) | |||
| 173 | return 0; | 173 | return 0; |
| 174 | } | 174 | } |
| 175 | 175 | ||
| 176 | #ifdef CONFIG_MODULES | ||
| 177 | |||
| 176 | static int __init ftrace_plt_init(void) | 178 | static int __init ftrace_plt_init(void) |
| 177 | { | 179 | { |
| 178 | unsigned int *ip; | 180 | unsigned int *ip; |
| @@ -191,6 +193,8 @@ static int __init ftrace_plt_init(void) | |||
| 191 | } | 193 | } |
| 192 | device_initcall(ftrace_plt_init); | 194 | device_initcall(ftrace_plt_init); |
| 193 | 195 | ||
| 196 | #endif /* CONFIG_MODULES */ | ||
| 197 | |||
| 194 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER | 198 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER |
| 195 | /* | 199 | /* |
| 196 | * Hook the return address and push it in the stack of return addresses | 200 | * Hook the return address and push it in the stack of return addresses |
diff --git a/arch/s390/kernel/vmlinux.lds.S b/arch/s390/kernel/vmlinux.lds.S index 72307f108c40..6e2c42bd1c3b 100644 --- a/arch/s390/kernel/vmlinux.lds.S +++ b/arch/s390/kernel/vmlinux.lds.S | |||
| @@ -31,8 +31,14 @@ SECTIONS | |||
| 31 | { | 31 | { |
| 32 | . = 0x00000000; | 32 | . = 0x00000000; |
| 33 | .text : { | 33 | .text : { |
| 34 | _text = .; /* Text and read-only data */ | 34 | /* Text and read-only data */ |
| 35 | HEAD_TEXT | 35 | HEAD_TEXT |
| 36 | /* | ||
| 37 | * E.g. perf doesn't like symbols starting at address zero, | ||
| 38 | * therefore skip the initial PSW and channel program located | ||
| 39 | * at address zero and let _text start at 0x200. | ||
| 40 | */ | ||
| 41 | _text = 0x200; | ||
| 36 | TEXT_TEXT | 42 | TEXT_TEXT |
| 37 | SCHED_TEXT | 43 | SCHED_TEXT |
| 38 | CPUIDLE_TEXT | 44 | CPUIDLE_TEXT |
diff --git a/arch/s390/lib/probes.c b/arch/s390/lib/probes.c index ae90e1ae3607..1963ddbf4ab3 100644 --- a/arch/s390/lib/probes.c +++ b/arch/s390/lib/probes.c | |||
| @@ -4,6 +4,7 @@ | |||
| 4 | * Copyright IBM Corp. 2014 | 4 | * Copyright IBM Corp. 2014 |
| 5 | */ | 5 | */ |
| 6 | 6 | ||
| 7 | #include <linux/errno.h> | ||
| 7 | #include <asm/kprobes.h> | 8 | #include <asm/kprobes.h> |
| 8 | #include <asm/dis.h> | 9 | #include <asm/dis.h> |
| 9 | 10 | ||
diff --git a/arch/s390/lib/uaccess.c b/arch/s390/lib/uaccess.c index 1e5bb2b86c42..b3bd3f23b8e8 100644 --- a/arch/s390/lib/uaccess.c +++ b/arch/s390/lib/uaccess.c | |||
| @@ -337,8 +337,8 @@ long __strncpy_from_user(char *dst, const char __user *src, long size) | |||
| 337 | return 0; | 337 | return 0; |
| 338 | done = 0; | 338 | done = 0; |
| 339 | do { | 339 | do { |
| 340 | offset = (size_t)src & ~PAGE_MASK; | 340 | offset = (size_t)src & (L1_CACHE_BYTES - 1); |
| 341 | len = min(size - done, PAGE_SIZE - offset); | 341 | len = min(size - done, L1_CACHE_BYTES - offset); |
| 342 | if (copy_from_user(dst, src, len)) | 342 | if (copy_from_user(dst, src, len)) |
| 343 | return -EFAULT; | 343 | return -EFAULT; |
| 344 | len_str = strnlen(dst, len); | 344 | len_str = strnlen(dst, len); |
diff --git a/drivers/s390/cio/ccwgroup.c b/drivers/s390/cio/ccwgroup.c index e443b0d0b236..34b9ad6b3143 100644 --- a/drivers/s390/cio/ccwgroup.c +++ b/drivers/s390/cio/ccwgroup.c | |||
| @@ -35,7 +35,7 @@ static struct bus_type ccwgroup_bus_type; | |||
| 35 | static void __ccwgroup_remove_symlinks(struct ccwgroup_device *gdev) | 35 | static void __ccwgroup_remove_symlinks(struct ccwgroup_device *gdev) |
| 36 | { | 36 | { |
| 37 | int i; | 37 | int i; |
| 38 | char str[8]; | 38 | char str[16]; |
| 39 | 39 | ||
| 40 | for (i = 0; i < gdev->count; i++) { | 40 | for (i = 0; i < gdev->count; i++) { |
| 41 | sprintf(str, "cdev%d", i); | 41 | sprintf(str, "cdev%d", i); |
| @@ -238,7 +238,7 @@ static void ccwgroup_release(struct device *dev) | |||
| 238 | 238 | ||
| 239 | static int __ccwgroup_create_symlinks(struct ccwgroup_device *gdev) | 239 | static int __ccwgroup_create_symlinks(struct ccwgroup_device *gdev) |
| 240 | { | 240 | { |
| 241 | char str[8]; | 241 | char str[16]; |
| 242 | int i, rc; | 242 | int i, rc; |
| 243 | 243 | ||
| 244 | for (i = 0; i < gdev->count; i++) { | 244 | for (i = 0; i < gdev->count; i++) { |
diff --git a/drivers/s390/cio/qdio_debug.h b/drivers/s390/cio/qdio_debug.h index f33ce8577619..1d595d17bf11 100644 --- a/drivers/s390/cio/qdio_debug.h +++ b/drivers/s390/cio/qdio_debug.h | |||
| @@ -11,7 +11,7 @@ | |||
| 11 | #include "qdio.h" | 11 | #include "qdio.h" |
| 12 | 12 | ||
| 13 | /* that gives us 15 characters in the text event views */ | 13 | /* that gives us 15 characters in the text event views */ |
| 14 | #define QDIO_DBF_LEN 16 | 14 | #define QDIO_DBF_LEN 32 |
| 15 | 15 | ||
| 16 | extern debug_info_t *qdio_dbf_setup; | 16 | extern debug_info_t *qdio_dbf_setup; |
| 17 | extern debug_info_t *qdio_dbf_error; | 17 | extern debug_info_t *qdio_dbf_error; |
diff --git a/drivers/s390/virtio/virtio_ccw.c b/drivers/s390/virtio/virtio_ccw.c index 2a76ea78a0bf..b18fe2014cf2 100644 --- a/drivers/s390/virtio/virtio_ccw.c +++ b/drivers/s390/virtio/virtio_ccw.c | |||
| @@ -87,7 +87,7 @@ struct vq_info_block { | |||
| 87 | } __packed; | 87 | } __packed; |
| 88 | 88 | ||
| 89 | struct virtio_feature_desc { | 89 | struct virtio_feature_desc { |
| 90 | __u32 features; | 90 | __le32 features; |
| 91 | __u8 index; | 91 | __u8 index; |
| 92 | } __packed; | 92 | } __packed; |
| 93 | 93 | ||
