提交 464662b9 编写于 作者: L Linus Torvalds

Merge branch 'next' of git://git.monstr.eu/linux-2.6-microblaze

Pull arch/microblaze fixes from Michal Simek.

* 'next' of git://git.monstr.eu/linux-2.6-microblaze:
  microblaze: Fix ret_from_fork declaration
  microblaze: Do not use tlb_skip in early_printk
  microblaze: Add missing headers caused by disintegration asm/system.h
  microblaze: Fix stack usage in PAGE_SIZE copy_tofrom_user
  microblaze: Fix tlb_skip variable on noMMU system
  microblaze: Fix __futex_atomic_op macro register usage
#ifndef _ASM_MICROBLAZE_CMPXCHG_H
#define _ASM_MICROBLAZE_CMPXCHG_H
#include <linux/irqflags.h>
void __bad_xchg(volatile void *ptr, int size);
static inline unsigned long __xchg(unsigned long x, volatile void *ptr,
......
......@@ -24,7 +24,7 @@
.word 1b,4b,2b,4b; \
.previous;" \
: "=&r" (oldval), "=&r" (ret) \
: "b" (uaddr), "i" (-EFAULT), "r" (oparg) \
: "r" (uaddr), "i" (-EFAULT), "r" (oparg) \
); \
})
......
......@@ -31,6 +31,8 @@ extern const struct seq_operations cpuinfo_op;
/* Do necessary setup to start up a newly executed thread. */
void start_thread(struct pt_regs *regs, unsigned long pc, unsigned long usp);
extern void ret_from_fork(void);
# endif /* __ASSEMBLY__ */
# ifndef CONFIG_MMU
......@@ -143,8 +145,6 @@ static inline void exit_thread(void)
unsigned long get_wchan(struct task_struct *p);
extern void ret_from_fork(void);
/* The size allocated for kernel stacks. This _must_ be a power of two! */
# define KERNEL_STACK_SIZE 0x2000
......
......@@ -176,6 +176,7 @@ void __init remap_early_printk(void)
base_addr = (u32) ioremap(base_addr, PAGE_SIZE);
printk(KERN_CONT "0x%x\n", base_addr);
#ifdef CONFIG_MMU
/*
* Early console is on the top of skipped TLB entries
* decrease tlb_skip size ensure that hardcoded TLB entry will be
......@@ -189,6 +190,7 @@ void __init remap_early_printk(void)
* cmp rX, orig_base_addr
*/
tlb_skip -= 1;
#endif
}
void __init disable_early_printk(void)
......
......@@ -206,6 +206,7 @@ static int microblaze_debugfs_init(void)
}
arch_initcall(microblaze_debugfs_init);
# ifdef CONFIG_MMU
static int __init debugfs_tlb(void)
{
struct dentry *d;
......@@ -218,6 +219,7 @@ static int __init debugfs_tlb(void)
return -ENOMEM;
}
device_initcall(debugfs_tlb);
# endif
#endif
static int dflt_bus_notify(struct notifier_block *nb,
......
......@@ -24,6 +24,7 @@
#include <asm/sections.h>
#include <asm/exceptions.h>
#include <asm/unwind.h>
#include <asm/switch_to.h>
struct stack_trace;
......
......@@ -122,22 +122,22 @@ __strnlen_user:
15: swi r24, r5, 0x0018 + offset; \
16: swi r25, r5, 0x001C + offset; \
.section __ex_table,"a"; \
.word 1b, 0f; \
.word 2b, 0f; \
.word 3b, 0f; \
.word 4b, 0f; \
.word 5b, 0f; \
.word 6b, 0f; \
.word 7b, 0f; \
.word 8b, 0f; \
.word 9b, 0f; \
.word 10b, 0f; \
.word 11b, 0f; \
.word 12b, 0f; \
.word 13b, 0f; \
.word 14b, 0f; \
.word 15b, 0f; \
.word 16b, 0f; \
.word 1b, 33f; \
.word 2b, 33f; \
.word 3b, 33f; \
.word 4b, 33f; \
.word 5b, 33f; \
.word 6b, 33f; \
.word 7b, 33f; \
.word 8b, 33f; \
.word 9b, 33f; \
.word 10b, 33f; \
.word 11b, 33f; \
.word 12b, 33f; \
.word 13b, 33f; \
.word 14b, 33f; \
.word 15b, 33f; \
.word 16b, 33f; \
.text
#define COPY_80(offset) \
......@@ -190,14 +190,17 @@ w2: sw r4, r5, r3
.align 4 /* Alignment is important to keep icache happy */
page: /* Create room on stack and save registers for storign values */
addik r1, r1, -32
swi r19, r1, 4
swi r20, r1, 8
swi r21, r1, 12
swi r22, r1, 16
swi r23, r1, 20
swi r24, r1, 24
swi r25, r1, 28
addik r1, r1, -40
swi r5, r1, 0
swi r6, r1, 4
swi r7, r1, 8
swi r19, r1, 12
swi r20, r1, 16
swi r21, r1, 20
swi r22, r1, 24
swi r23, r1, 28
swi r24, r1, 32
swi r25, r1, 36
loop: /* r4, r19, r20, r21, r22, r23, r24, r25 are used for storing values */
/* Loop unrolling to get performance boost */
COPY_80(0x000);
......@@ -205,21 +208,44 @@ loop: /* r4, r19, r20, r21, r22, r23, r24, r25 are used for storing values */
COPY_80(0x100);
COPY_80(0x180);
/* copy loop */
addik r6, r6, 0x200
addik r7, r7, -0x200
bneid r7, loop
addik r5, r5, 0x200
addik r6, r6, 0x200
addik r7, r7, -0x200
bneid r7, loop
addik r5, r5, 0x200
/* Restore register content */
lwi r19, r1, 4
lwi r20, r1, 8
lwi r21, r1, 12
lwi r22, r1, 16
lwi r23, r1, 20
lwi r24, r1, 24
lwi r25, r1, 28
addik r1, r1, 32
lwi r5, r1, 0
lwi r6, r1, 4
lwi r7, r1, 8
lwi r19, r1, 12
lwi r20, r1, 16
lwi r21, r1, 20
lwi r22, r1, 24
lwi r23, r1, 28
lwi r24, r1, 32
lwi r25, r1, 36
addik r1, r1, 40
/* return back */
addik r3, r0, 0
rtsd r15, 8
nop
/* Fault case - return temp count */
33:
addik r3, r7, 0
/* Restore register content */
lwi r5, r1, 0
lwi r6, r1, 4
lwi r7, r1, 8
lwi r19, r1, 12
lwi r20, r1, 16
lwi r21, r1, 20
lwi r22, r1, 24
lwi r23, r1, 28
lwi r24, r1, 32
lwi r25, r1, 36
addik r1, r1, 40
/* return back */
rtsd r15, 8
nop
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册