Commit 6e83557c authored by Michal Simek's avatar Michal Simek

microblaze: Remove r0_ram pointer and PTO alignment

r0_ram pool was used for saving/restoring register
content if hw exception happen. This poll was replaced by
pt_pool_space with PT_SIZE size.
Based on this change SAVE_STATE_ARG_SPACE was removed which
caused that PTO offset is zero that's why is also removed.

r0_ram space was used as scratchpad by v850. In early
Microblaze Linux developing phase was this part of code
blindly copied.
Signed-off-by: default avatarMichal Simek <monstr@monstr.eu>
parent d8748e73
...@@ -31,40 +31,4 @@ DECLARE_PER_CPU(unsigned int, R11_SAVE); /* Temp variable for entry */ ...@@ -31,40 +31,4 @@ DECLARE_PER_CPU(unsigned int, R11_SAVE); /* Temp variable for entry */
DECLARE_PER_CPU(unsigned int, CURRENT_SAVE); /* Saved current pointer */ DECLARE_PER_CPU(unsigned int, CURRENT_SAVE); /* Saved current pointer */
# endif /* __ASSEMBLY__ */ # endif /* __ASSEMBLY__ */
#ifndef CONFIG_MMU
/* noMMU hasn't any space for args */
# define STATE_SAVE_ARG_SPACE (0)
#else /* CONFIG_MMU */
/* If true, system calls save and restore all registers (except result
* registers, of course). If false, then `call clobbered' registers
* will not be preserved, on the theory that system calls are basically
* function calls anyway, and the caller should be able to deal with it.
* This is a security risk, of course, as `internal' values may leak out
* after a system call, but that certainly doesn't matter very much for
* a processor with no MMU protection! For a protected-mode kernel, it
* would be faster to just zero those registers before returning.
*
* I can not rely on the glibc implementation. If you turn it off make
* sure that r11/r12 is saved in user-space. --KAA
*
* These are special variables using by the kernel trap/interrupt code
* to save registers in, at a time when there are no spare registers we
* can use to do so, and we can't depend on the value of the stack
* pointer. This means that they must be within a signed 16-bit
* displacement of 0x00000000.
*/
/* A `state save frame' is a struct pt_regs preceded by some extra space
* suitable for a function call stack frame. */
/* Amount of room on the stack reserved for arguments and to satisfy the
* C calling conventions, in addition to the space used by the struct
* pt_regs that actually holds saved values. */
#define STATE_SAVE_ARG_SPACE (6*4) /* Up to six arguments */
#endif /* CONFIG_MMU */
#endif /* _ASM_MICROBLAZE_ENTRY_H */ #endif /* _ASM_MICROBLAZE_ENTRY_H */
...@@ -155,7 +155,7 @@ unsigned long get_wchan(struct task_struct *p); ...@@ -155,7 +155,7 @@ unsigned long get_wchan(struct task_struct *p);
# define task_regs(task) ((struct pt_regs *)task_tos(task) - 1) # define task_regs(task) ((struct pt_regs *)task_tos(task) - 1)
# define task_pt_regs_plus_args(tsk) \ # define task_pt_regs_plus_args(tsk) \
(((void *)task_pt_regs(tsk)) - STATE_SAVE_ARG_SPACE) ((void *)task_pt_regs(tsk))
# define task_sp(task) (task_regs(task)->r1) # define task_sp(task) (task_regs(task)->r1)
# define task_pc(task) (task_regs(task)->pc) # define task_pc(task) (task_regs(task)->pc)
......
This diff is collapsed.
...@@ -93,7 +93,7 @@ ...@@ -93,7 +93,7 @@
lwi r6, r1, PT_R6; \ lwi r6, r1, PT_R6; \
lwi r11, r1, PT_R11; \ lwi r11, r1, PT_R11; \
lwi r31, r1, PT_R31; \ lwi r31, r1, PT_R31; \
lwi r1, r0, TOPHYS(r0_ram + 0); lwi r1, r1, PT_R1;
#endif /* CONFIG_MMU */ #endif /* CONFIG_MMU */
#define LWREG_NOP \ #define LWREG_NOP \
...@@ -208,8 +208,8 @@ ...@@ -208,8 +208,8 @@
* | . | * | . |
* | . | * | . |
* *
* NO_MMU kernel use the same r0_ram pointed space - look to vmlinux.lds.S * MMU kernel uses the same 'pt_pool_space' pointed space
* which is used for storing register values - old style was, that value were * which is used for storing register values - noMMu style was, that values were
* stored in stack but in case of failure you lost information about register. * stored in stack but in case of failure you lost information about register.
* Currently you can see register value in memory in specific place. * Currently you can see register value in memory in specific place.
* In compare to with previous solution the speed should be the same. * In compare to with previous solution the speed should be the same.
...@@ -228,8 +228,12 @@ ...@@ -228,8 +228,12 @@
*/ */
/* wrappers to restore state before coming to entry.S */ /* wrappers to restore state before coming to entry.S */
#ifdef CONFIG_MMU #ifdef CONFIG_MMU
.section .data
.align 4
pt_pool_space:
.space PT_SIZE
#ifdef DEBUG #ifdef DEBUG
/* Create space for exception counting. */ /* Create space for exception counting. */
.section .data .section .data
...@@ -299,10 +303,10 @@ _hw_exception_handler: ...@@ -299,10 +303,10 @@ _hw_exception_handler:
#ifndef CONFIG_MMU #ifndef CONFIG_MMU
addik r1, r1, -(EX_HANDLER_STACK_SIZ); /* Create stack frame */ addik r1, r1, -(EX_HANDLER_STACK_SIZ); /* Create stack frame */
#else #else
swi r1, r0, TOPHYS(r0_ram + 0); /* GET_SP */ swi r1, r0, TOPHYS(pt_pool_space + PT_R1); /* GET_SP */
/* Save date to kernel memory. Here is the problem /* Save date to kernel memory. Here is the problem
* when you came from user space */ * when you came from user space */
ori r1, r0, TOPHYS(r0_ram + 28); ori r1, r0, TOPHYS(pt_pool_space);
#endif #endif
swi r3, r1, PT_R3 swi r3, r1, PT_R3
swi r4, r1, PT_R4 swi r4, r1, PT_R4
......
...@@ -159,7 +159,7 @@ int copy_thread(unsigned long clone_flags, unsigned long usp, ...@@ -159,7 +159,7 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,
} }
/* FIXME STATE_SAVE_PT_OFFSET; */ /* FIXME STATE_SAVE_PT_OFFSET; */
ti->cpu_context.r1 = (unsigned long)childregs - STATE_SAVE_ARG_SPACE; ti->cpu_context.r1 = (unsigned long)childregs;
/* we should consider the fact that childregs is a copy of the parent /* we should consider the fact that childregs is a copy of the parent
* regs which were saved immediately after entering the kernel state * regs which were saved immediately after entering the kernel state
* before enabling VM. This MSR will be restored in switch_to and * before enabling VM. This MSR will be restored in switch_to and
......
...@@ -93,7 +93,7 @@ static int restore_sigcontext(struct pt_regs *regs, ...@@ -93,7 +93,7 @@ static int restore_sigcontext(struct pt_regs *regs,
asmlinkage long sys_rt_sigreturn(struct pt_regs *regs) asmlinkage long sys_rt_sigreturn(struct pt_regs *regs)
{ {
struct rt_sigframe __user *frame = struct rt_sigframe __user *frame =
(struct rt_sigframe __user *)(regs->r1 + STATE_SAVE_ARG_SPACE); (struct rt_sigframe __user *)(regs->r1);
sigset_t set; sigset_t set;
int rval; int rval;
...@@ -247,7 +247,7 @@ static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, ...@@ -247,7 +247,7 @@ static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
goto give_sigsegv; goto give_sigsegv;
/* Set up registers for signal handler */ /* Set up registers for signal handler */
regs->r1 = (unsigned long) frame - STATE_SAVE_ARG_SPACE; regs->r1 = (unsigned long) frame;
/* Signal handler args: */ /* Signal handler args: */
regs->r5 = signal; /* arg 0: signum */ regs->r5 = signal; /* arg 0: signum */
......
...@@ -70,11 +70,6 @@ SECTIONS { ...@@ -70,11 +70,6 @@ SECTIONS {
RW_DATA_SECTION(32, PAGE_SIZE, THREAD_SIZE) RW_DATA_SECTION(32, PAGE_SIZE, THREAD_SIZE)
_edata = . ; _edata = . ;
/* Reserve some low RAM for r0 based memory references */
. = ALIGN(0x4) ;
r0_ram = . ;
. = . + PAGE_SIZE; /* a page should be enough */
/* Under the microblaze ABI, .sdata and .sbss must be contiguous */ /* Under the microblaze ABI, .sdata and .sbss must be contiguous */
. = ALIGN(8); . = ALIGN(8);
.sdata : AT(ADDR(.sdata) - LOAD_OFFSET) { .sdata : AT(ADDR(.sdata) - LOAD_OFFSET) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment