diff options
Diffstat (limited to 'arch/microblaze/kernel')
-rw-r--r-- | arch/microblaze/kernel/cpu/cpuinfo.c | 1 | ||||
-rw-r--r-- | arch/microblaze/kernel/entry.S | 46 | ||||
-rw-r--r-- | arch/microblaze/kernel/exceptions.c | 3 | ||||
-rw-r--r-- | arch/microblaze/kernel/hw_exception_handler.S | 9 | ||||
-rw-r--r-- | arch/microblaze/kernel/prom.c | 4 | ||||
-rw-r--r-- | arch/microblaze/kernel/vmlinux.lds.S | 16 |
6 files changed, 56 insertions, 23 deletions
diff --git a/arch/microblaze/kernel/cpu/cpuinfo.c b/arch/microblaze/kernel/cpu/cpuinfo.c index 87c79fa275c3..2c309fccf230 100644 --- a/arch/microblaze/kernel/cpu/cpuinfo.c +++ b/arch/microblaze/kernel/cpu/cpuinfo.c | |||
@@ -32,6 +32,7 @@ const struct cpu_ver_key cpu_ver_lookup[] = { | |||
32 | {"7.30.a", 0x10}, | 32 | {"7.30.a", 0x10}, |
33 | {"7.30.b", 0x11}, | 33 | {"7.30.b", 0x11}, |
34 | {"8.00.a", 0x12}, | 34 | {"8.00.a", 0x12}, |
35 | {"8.00.b", 0x13}, | ||
35 | {NULL, 0}, | 36 | {NULL, 0}, |
36 | }; | 37 | }; |
37 | 38 | ||
diff --git a/arch/microblaze/kernel/entry.S b/arch/microblaze/kernel/entry.S index 819238b8a429..41c30cdb2704 100644 --- a/arch/microblaze/kernel/entry.S +++ b/arch/microblaze/kernel/entry.S | |||
@@ -287,25 +287,44 @@ | |||
287 | * are masked. This is nice, means we don't have to CLI before state save | 287 | * are masked. This is nice, means we don't have to CLI before state save |
288 | */ | 288 | */ |
289 | C_ENTRY(_user_exception): | 289 | C_ENTRY(_user_exception): |
290 | addi r14, r14, 4 /* return address is 4 byte after call */ | ||
291 | swi r1, r0, TOPHYS(PER_CPU(ENTRY_SP)) /* save stack */ | 290 | swi r1, r0, TOPHYS(PER_CPU(ENTRY_SP)) /* save stack */ |
291 | addi r14, r14, 4 /* return address is 4 byte after call */ | ||
292 | |||
293 | mfs r1, rmsr | ||
294 | nop | ||
295 | andi r1, r1, MSR_UMS | ||
296 | bnei r1, 1f | ||
297 | |||
298 | /* Kernel-mode state save - kernel execve */ | ||
299 | lwi r1, r0, TOPHYS(PER_CPU(ENTRY_SP)); /* Reload kernel stack-ptr*/ | ||
300 | tophys(r1,r1); | ||
301 | |||
302 | addik r1, r1, -STATE_SAVE_SIZE; /* Make room on the stack. */ | ||
303 | SAVE_REGS | ||
292 | 304 | ||
305 | swi r1, r1, PTO + PT_MODE; /* pt_regs -> kernel mode */ | ||
306 | brid 2f; | ||
307 | nop; /* Fill delay slot */ | ||
308 | |||
309 | /* User-mode state save. */ | ||
310 | 1: | ||
293 | lwi r1, r0, TOPHYS(PER_CPU(CURRENT_SAVE)); /* get saved current */ | 311 | lwi r1, r0, TOPHYS(PER_CPU(CURRENT_SAVE)); /* get saved current */ |
294 | tophys(r1,r1); | 312 | tophys(r1,r1); |
295 | lwi r1, r1, TS_THREAD_INFO; /* get stack from task_struct */ | 313 | lwi r1, r1, TS_THREAD_INFO; /* get stack from task_struct */ |
296 | /* MS these three instructions can be added to one */ | 314 | /* calculate kernel stack pointer from task struct 8k */ |
297 | /* addik r1, r1, THREAD_SIZE; */ | 315 | addik r1, r1, THREAD_SIZE; |
298 | /* tophys(r1,r1); */ | 316 | tophys(r1,r1); |
299 | /* addik r1, r1, -STATE_SAVE_SIZE; */ | 317 | |
300 | addik r1, r1, THREAD_SIZE + CONFIG_KERNEL_BASE_ADDR - CONFIG_KERNEL_START - STATE_SAVE_SIZE; | 318 | addik r1, r1, -STATE_SAVE_SIZE; /* Make room on the stack. */ |
301 | SAVE_REGS | 319 | SAVE_REGS |
302 | swi r0, r1, PTO + PT_R3 | 320 | swi r0, r1, PTO + PT_R3 |
303 | swi r0, r1, PTO + PT_R4 | 321 | swi r0, r1, PTO + PT_R4 |
304 | 322 | ||
323 | swi r0, r1, PTO + PT_MODE; /* Was in user-mode. */ | ||
305 | lwi r11, r0, TOPHYS(PER_CPU(ENTRY_SP)); | 324 | lwi r11, r0, TOPHYS(PER_CPU(ENTRY_SP)); |
306 | swi r11, r1, PTO+PT_R1; /* Store user SP. */ | 325 | swi r11, r1, PTO+PT_R1; /* Store user SP. */ |
307 | clear_ums; | 326 | clear_ums; |
308 | lwi CURRENT_TASK, r0, TOPHYS(PER_CPU(CURRENT_SAVE)); | 327 | 2: lwi CURRENT_TASK, r0, TOPHYS(PER_CPU(CURRENT_SAVE)); |
309 | /* Save away the syscall number. */ | 328 | /* Save away the syscall number. */ |
310 | swi r12, r1, PTO+PT_R0; | 329 | swi r12, r1, PTO+PT_R0; |
311 | tovirt(r1,r1) | 330 | tovirt(r1,r1) |
@@ -375,6 +394,9 @@ C_ENTRY(ret_from_trap): | |||
375 | swi r3, r1, PTO + PT_R3 | 394 | swi r3, r1, PTO + PT_R3 |
376 | swi r4, r1, PTO + PT_R4 | 395 | swi r4, r1, PTO + PT_R4 |
377 | 396 | ||
397 | lwi r11, r1, PTO + PT_MODE; | ||
398 | /* See if returning to kernel mode, if so, skip resched &c. */ | ||
399 | bnei r11, 2f; | ||
378 | /* We're returning to user mode, so check for various conditions that | 400 | /* We're returning to user mode, so check for various conditions that |
379 | * trigger rescheduling. */ | 401 | * trigger rescheduling. */ |
380 | /* FIXME: Restructure all these flag checks. */ | 402 | /* FIXME: Restructure all these flag checks. */ |
@@ -417,6 +439,16 @@ C_ENTRY(ret_from_trap): | |||
417 | RESTORE_REGS; | 439 | RESTORE_REGS; |
418 | addik r1, r1, STATE_SAVE_SIZE /* Clean up stack space. */ | 440 | addik r1, r1, STATE_SAVE_SIZE /* Clean up stack space. */ |
419 | lwi r1, r1, PT_R1 - PT_SIZE;/* Restore user stack pointer. */ | 441 | lwi r1, r1, PT_R1 - PT_SIZE;/* Restore user stack pointer. */ |
442 | bri 6f; | ||
443 | |||
444 | /* Return to kernel state. */ | ||
445 | 2: set_bip; /* Ints masked for state restore */ | ||
446 | VM_OFF; | ||
447 | tophys(r1,r1); | ||
448 | RESTORE_REGS; | ||
449 | addik r1, r1, STATE_SAVE_SIZE /* Clean up stack space. */ | ||
450 | tovirt(r1,r1); | ||
451 | 6: | ||
420 | TRAP_return: /* Make global symbol for debugging */ | 452 | TRAP_return: /* Make global symbol for debugging */ |
421 | rtbd r14, 0; /* Instructions to return from an IRQ */ | 453 | rtbd r14, 0; /* Instructions to return from an IRQ */ |
422 | nop; | 454 | nop; |
diff --git a/arch/microblaze/kernel/exceptions.c b/arch/microblaze/kernel/exceptions.c index 478f2943ede7..a7fa6ae76d89 100644 --- a/arch/microblaze/kernel/exceptions.c +++ b/arch/microblaze/kernel/exceptions.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <linux/errno.h> | 25 | #include <linux/errno.h> |
26 | #include <linux/ptrace.h> | 26 | #include <linux/ptrace.h> |
27 | #include <asm/current.h> | 27 | #include <asm/current.h> |
28 | #include <asm/cacheflush.h> | ||
28 | 29 | ||
29 | #define MICROBLAZE_ILL_OPCODE_EXCEPTION 0x02 | 30 | #define MICROBLAZE_ILL_OPCODE_EXCEPTION 0x02 |
30 | #define MICROBLAZE_IBUS_EXCEPTION 0x03 | 31 | #define MICROBLAZE_IBUS_EXCEPTION 0x03 |
@@ -52,6 +53,8 @@ void die(const char *str, struct pt_regs *fp, long err) | |||
52 | void sw_exception(struct pt_regs *regs) | 53 | void sw_exception(struct pt_regs *regs) |
53 | { | 54 | { |
54 | _exception(SIGTRAP, regs, TRAP_BRKPT, regs->r16); | 55 | _exception(SIGTRAP, regs, TRAP_BRKPT, regs->r16); |
56 | flush_dcache_range(regs->r16, regs->r16 + 0x4); | ||
57 | flush_icache_range(regs->r16, regs->r16 + 0x4); | ||
55 | } | 58 | } |
56 | 59 | ||
57 | void _exception(int signr, struct pt_regs *regs, int code, unsigned long addr) | 60 | void _exception(int signr, struct pt_regs *regs, int code, unsigned long addr) |
diff --git a/arch/microblaze/kernel/hw_exception_handler.S b/arch/microblaze/kernel/hw_exception_handler.S index 781195438ee6..25f6e07d8de8 100644 --- a/arch/microblaze/kernel/hw_exception_handler.S +++ b/arch/microblaze/kernel/hw_exception_handler.S | |||
@@ -945,11 +945,20 @@ store3: sbi r3, r4, 2; | |||
945 | store4: sbi r3, r4, 3; /* Delay slot */ | 945 | store4: sbi r3, r4, 3; /* Delay slot */ |
946 | ex_shw_vm: | 946 | ex_shw_vm: |
947 | /* Store the lower half-word, byte-by-byte into destination address */ | 947 | /* Store the lower half-word, byte-by-byte into destination address */ |
948 | #ifdef __MICROBLAZEEL__ | ||
949 | lbui r3, r5, 0; | ||
950 | store5: sbi r3, r4, 0; | ||
951 | lbui r3, r5, 1; | ||
952 | brid ret_from_exc; | ||
953 | store6: sbi r3, r4, 1; /* Delay slot */ | ||
954 | #else | ||
948 | lbui r3, r5, 2; | 955 | lbui r3, r5, 2; |
949 | store5: sbi r3, r4, 0; | 956 | store5: sbi r3, r4, 0; |
950 | lbui r3, r5, 3; | 957 | lbui r3, r5, 3; |
951 | brid ret_from_exc; | 958 | brid ret_from_exc; |
952 | store6: sbi r3, r4, 1; /* Delay slot */ | 959 | store6: sbi r3, r4, 1; /* Delay slot */ |
960 | #endif | ||
961 | |||
953 | ex_sw_end_vm: /* Exception handling of store word, ends. */ | 962 | ex_sw_end_vm: /* Exception handling of store word, ends. */ |
954 | 963 | ||
955 | /* We have to prevent cases that get/put_user macros get unaligned pointer | 964 | /* We have to prevent cases that get/put_user macros get unaligned pointer |
diff --git a/arch/microblaze/kernel/prom.c b/arch/microblaze/kernel/prom.c index a105301e2b7f..c881393f07fd 100644 --- a/arch/microblaze/kernel/prom.c +++ b/arch/microblaze/kernel/prom.c | |||
@@ -61,14 +61,12 @@ static int __init early_init_dt_scan_serial(unsigned long node, | |||
61 | char *p; | 61 | char *p; |
62 | int *addr; | 62 | int *addr; |
63 | 63 | ||
64 | pr_debug("search \"chosen\", depth: %d, uname: %s\n", depth, uname); | 64 | pr_debug("search \"serial\", depth: %d, uname: %s\n", depth, uname); |
65 | 65 | ||
66 | /* find all serial nodes */ | 66 | /* find all serial nodes */ |
67 | if (strncmp(uname, "serial", 6) != 0) | 67 | if (strncmp(uname, "serial", 6) != 0) |
68 | return 0; | 68 | return 0; |
69 | 69 | ||
70 | early_init_dt_check_for_initrd(node); | ||
71 | |||
72 | /* find compatible node with uartlite */ | 70 | /* find compatible node with uartlite */ |
73 | p = of_get_flat_dt_prop(node, "compatible", &l); | 71 | p = of_get_flat_dt_prop(node, "compatible", &l); |
74 | if ((strncmp(p, "xlnx,xps-uartlite", 17) != 0) && | 72 | if ((strncmp(p, "xlnx,xps-uartlite", 17) != 0) && |
diff --git a/arch/microblaze/kernel/vmlinux.lds.S b/arch/microblaze/kernel/vmlinux.lds.S index 96a88c31fe48..3451bdec9f05 100644 --- a/arch/microblaze/kernel/vmlinux.lds.S +++ b/arch/microblaze/kernel/vmlinux.lds.S | |||
@@ -123,20 +123,10 @@ SECTIONS { | |||
123 | 123 | ||
124 | __init_end_before_initramfs = .; | 124 | __init_end_before_initramfs = .; |
125 | 125 | ||
126 | .init.ramfs ALIGN(PAGE_SIZE) : AT(ADDR(.init.ramfs) - LOAD_OFFSET) { | 126 | .init.ramfs : AT(ADDR(.init.ramfs) - LOAD_OFFSET) { |
127 | __initramfs_start = .; | 127 | INIT_RAM_FS |
128 | *(.init.ramfs) | ||
129 | __initramfs_end = .; | ||
130 | . = ALIGN(4); | ||
131 | LONG(0); | ||
132 | /* | ||
133 | * FIXME this can break initramfs for MMU. | ||
134 | * Pad init.ramfs up to page boundary, | ||
135 | * so that __init_end == __bss_start. This will make image.elf | ||
136 | * consistent with the image.bin | ||
137 | */ | ||
138 | /* . = ALIGN(PAGE_SIZE); */ | ||
139 | } | 128 | } |
129 | |||
140 | __init_end = .; | 130 | __init_end = .; |
141 | 131 | ||
142 | .bss ALIGN (PAGE_SIZE) : AT(ADDR(.bss) - LOAD_OFFSET) { | 132 | .bss ALIGN (PAGE_SIZE) : AT(ADDR(.bss) - LOAD_OFFSET) { |