microblaze: Completely remove working with R11 register

We don't need to save R11 register. There is easy way
to use only R1 which is saved and restore later.

Signed-off-by: Michal Simek <monstr@monstr.eu>
This commit is contained in:
Michal Simek
2010-06-22 14:51:45 +02:00
parent 0388107dd5
commit 653e447e11

View File

@@ -273,18 +273,15 @@
C_ENTRY(_user_exception): C_ENTRY(_user_exception):
swi r1, r0, TOPHYS(PER_CPU(ENTRY_SP)) /* save stack */ swi r1, r0, TOPHYS(PER_CPU(ENTRY_SP)) /* save stack */
addi r14, r14, 4 /* return address is 4 byte after call */ addi r14, r14, 4 /* return address is 4 byte after call */
swi r11, r0, TOPHYS(r0_ram + PTO + PT_R11); /* Save r11 */
mfs r11, rmsr mfs r1, rmsr
nop nop
andi r11, r11, MSR_UMS andi r1, r1, MSR_UMS
bnei r11, 1f bnei r1, 1f
/* Kernel-mode state save - kernel execve */ /* Kernel-mode state save - kernel execve */
lwi r11, r0, TOPHYS(PER_CPU(ENTRY_SP)); /* Reload kernel stack-ptr*/ lwi r1, r0, TOPHYS(PER_CPU(ENTRY_SP)); /* Reload kernel stack-ptr*/
tophys(r1,r11); tophys(r1,r1);
swi r11, r1, (PT_R1-PT_SIZE); /* Save original SP. */
lwi r11, r0, TOPHYS(r0_ram + PTO + PT_R11); /* restore r11 */
addik r1, r1, -STATE_SAVE_SIZE; /* Make room on the stack. */ addik r1, r1, -STATE_SAVE_SIZE; /* Make room on the stack. */
SAVE_REGS SAVE_REGS
@@ -296,7 +293,6 @@ C_ENTRY(_user_exception):
/* User-mode state save. */ /* User-mode state save. */
1: 1:
lwi r11, r0, TOPHYS(r0_ram + PTO + PT_R11); /* restore r11 */
lwi r1, r0, TOPHYS(PER_CPU(CURRENT_SAVE)); /* get saved current */ lwi r1, r0, TOPHYS(PER_CPU(CURRENT_SAVE)); /* get saved current */
tophys(r1,r1); tophys(r1,r1);
lwi r1, r1, TS_THREAD_INFO; /* get stack from task_struct */ lwi r1, r1, TS_THREAD_INFO; /* get stack from task_struct */
@@ -506,18 +502,15 @@ C_ENTRY(sys_rt_sigreturn_wrapper):
#define SAVE_STATE \ #define SAVE_STATE \
swi r1, r0, TOPHYS(PER_CPU(ENTRY_SP)); /* save stack */ \ swi r1, r0, TOPHYS(PER_CPU(ENTRY_SP)); /* save stack */ \
swi r11, r0, TOPHYS(r0_ram + PTO + PT_R11); /* Save r11 */ \
/* See if already in kernel mode.*/ \ /* See if already in kernel mode.*/ \
mfs r11, rmsr; \ mfs r1, rmsr; \
nop; \ nop; \
andi r11, r11, MSR_UMS; \ andi r1, r1, MSR_UMS; \
bnei r11, 1f; \ bnei r1, 1f; \
/* Kernel-mode state save. */ \ /* Kernel-mode state save. */ \
/* Reload kernel stack-ptr. */ \ /* Reload kernel stack-ptr. */ \
lwi r11, r0, TOPHYS(PER_CPU(ENTRY_SP)); \ lwi r1, r0, TOPHYS(PER_CPU(ENTRY_SP)); \
tophys(r1,r11); \ tophys(r1,r1); \
swi r11, r1, (PT_R1-PT_SIZE); /* Save original SP. */ \
lwi r11, r0, TOPHYS(r0_ram + PTO + PT_R11); /* restore r11 */\
addik r1, r1, -STATE_SAVE_SIZE; /* Make room on the stack. */\ addik r1, r1, -STATE_SAVE_SIZE; /* Make room on the stack. */\
SAVE_REGS \ SAVE_REGS \
/* PC, before IRQ/trap - this is one instruction above */ \ /* PC, before IRQ/trap - this is one instruction above */ \
@@ -528,13 +521,11 @@ C_ENTRY(sys_rt_sigreturn_wrapper):
brid 2f; \ brid 2f; \
nop; /* Fill delay slot */ \ nop; /* Fill delay slot */ \
1: /* User-mode state save. */ \ 1: /* User-mode state save. */ \
lwi r11, r0, TOPHYS(r0_ram + PTO + PT_R11); /* restore r11 */\
lwi r1, r0, TOPHYS(PER_CPU(CURRENT_SAVE)); /* get saved current */\ lwi r1, r0, TOPHYS(PER_CPU(CURRENT_SAVE)); /* get saved current */\
tophys(r1,r1); \ tophys(r1,r1); \
lwi r1, r1, TS_THREAD_INFO; /* get the thread info */ \ lwi r1, r1, TS_THREAD_INFO; /* get the thread info */ \
addik r1, r1, THREAD_SIZE; /* calculate kernel stack pointer */\ addik r1, r1, THREAD_SIZE; /* calculate kernel stack pointer */\
tophys(r1,r1); \ tophys(r1,r1); \
\
addik r1, r1, -STATE_SAVE_SIZE; /* Make room on the stack. */\ addik r1, r1, -STATE_SAVE_SIZE; /* Make room on the stack. */\
SAVE_REGS \ SAVE_REGS \
/* PC, before IRQ/trap - this is one instruction above FIXME*/ \ /* PC, before IRQ/trap - this is one instruction above FIXME*/ \
@@ -726,20 +717,15 @@ C_ENTRY(_interrupt):
/* MS: we are in physical address */ /* MS: we are in physical address */
/* Save registers, switch to proper stack, convert SP to virtual.*/ /* Save registers, switch to proper stack, convert SP to virtual.*/
swi r1, r0, TOPHYS(PER_CPU(ENTRY_SP)) swi r1, r0, TOPHYS(PER_CPU(ENTRY_SP))
swi r11, r0, TOPHYS(PER_CPU(R11_SAVE));
/* MS: See if already in kernel mode. */ /* MS: See if already in kernel mode. */
mfs r11, rmsr mfs r1, rmsr
nop nop
andi r11, r11, MSR_UMS andi r1, r1, MSR_UMS
bnei r11, 1f bnei r1, 1f
/* Kernel-mode state save. */ /* Kernel-mode state save. */
or r11, r1, r0 lwi r1, r0, TOPHYS(PER_CPU(ENTRY_SP))
tophys(r1,r11); /* MS: I have in r1 physical address where stack is */ tophys(r1,r1); /* MS: I have in r1 physical address where stack is */
/* MS: Save original SP - position PT_R1 to next stack frame 4 *1 - 152*/
swi r11, r1, (PT_R1 - PT_SIZE);
/* MS: restore r11 because of saving in SAVE_REGS */
lwi r11, r0, TOPHYS(PER_CPU(R11_SAVE));
/* save registers */ /* save registers */
/* MS: Make room on the stack -> activation record */ /* MS: Make room on the stack -> activation record */
addik r1, r1, -STATE_SAVE_SIZE; addik r1, r1, -STATE_SAVE_SIZE;
@@ -752,8 +738,6 @@ C_ENTRY(_interrupt):
1: 1:
/* User-mode state save. */ /* User-mode state save. */
/* MS: restore r11 -> FIXME move before SAVE_REG */
lwi r11, r0, TOPHYS(PER_CPU(R11_SAVE));
/* MS: get the saved current */ /* MS: get the saved current */
lwi r1, r0, TOPHYS(PER_CPU(CURRENT_SAVE)); lwi r1, r0, TOPHYS(PER_CPU(CURRENT_SAVE));
tophys(r1,r1); tophys(r1,r1);
@@ -855,16 +839,13 @@ C_ENTRY(_debug_exception):
/* BIP bit is set on entry, no interrupts can occur */ /* BIP bit is set on entry, no interrupts can occur */
swi r1, r0, TOPHYS(PER_CPU(ENTRY_SP)) swi r1, r0, TOPHYS(PER_CPU(ENTRY_SP))
swi r11, r0, TOPHYS(r0_ram + PTO + PT_R11); /* Save r11 */ mfs r1, rmsr
mfs r11, rmsr
nop nop
andi r11, r11, MSR_UMS andi r1, r1, MSR_UMS
bnei r11, 1f bnei r1, 1f
/* Kernel-mode state save. */ /* Kernel-mode state save. */
lwi r11, r0, TOPHYS(PER_CPU(ENTRY_SP)); /* Reload kernel stack-ptr*/ lwi r1, r0, TOPHYS(PER_CPU(ENTRY_SP)); /* Reload kernel stack-ptr*/
tophys(r1,r11); tophys(r1,r1);
swi r11, r1, (PT_R1-PT_SIZE); /* Save original SP. */
lwi r11, r0, TOPHYS(r0_ram + PTO + PT_R11); /* restore r11 */
addik r1, r1, -STATE_SAVE_SIZE; /* Make room on the stack. */ addik r1, r1, -STATE_SAVE_SIZE; /* Make room on the stack. */
SAVE_REGS; SAVE_REGS;
@@ -874,7 +855,6 @@ C_ENTRY(_debug_exception):
brid 2f; brid 2f;
nop; /* Fill delay slot */ nop; /* Fill delay slot */
1: /* User-mode state save. */ 1: /* User-mode state save. */
lwi r11, r0, TOPHYS(r0_ram + PTO + PT_R11); /* restore r11 */
lwi r1, r0, TOPHYS(PER_CPU(CURRENT_SAVE)); /* get saved current */ lwi r1, r0, TOPHYS(PER_CPU(CURRENT_SAVE)); /* get saved current */
tophys(r1,r1); tophys(r1,r1);
lwi r1, r1, TS_THREAD_INFO; /* get the thread info */ lwi r1, r1, TS_THREAD_INFO; /* get the thread info */
@@ -887,7 +867,7 @@ C_ENTRY(_debug_exception):
swi r0, r1, PTO+PT_MODE; /* Was in user-mode. */ swi r0, r1, PTO+PT_MODE; /* Was in user-mode. */
lwi r11, r0, TOPHYS(PER_CPU(ENTRY_SP)); lwi r11, r0, TOPHYS(PER_CPU(ENTRY_SP));
swi r11, r1, PTO+PT_R1; /* Store user SP. */ swi r11, r1, PTO+PT_R1; /* Store user SP. */
2: lwi CURRENT_TASK, r0, TOPHYS(PER_CPU(CURRENT_SAVE)); 2:
/* Save away the syscall number. */ /* Save away the syscall number. */
swi r0, r1, PTO+PT_R0; swi r0, r1, PTO+PT_R0;
tovirt(r1,r1) tovirt(r1,r1)