Re: [PATCH 09/36] m68k: set register a2 to current if MMU enabled on ColdFire

Greg Ungerer
2011-10-31T04:17:59Z

Hi Geert,

On 30/10/11 23:06, Geert Uytterhoeven wrote:
> On Tue, Oct 25, 2011 at 09:19,<gerg@snapgear.com> wrote:
>> From: Greg Ungerer<gerg@uclinux.org>
>>
>> Virtual memory m68k systems build with register a2 dedicated to being the
>> current proc pointer. Add code to the ColdFire interrupt and exception
>> processing to set this on entry, and also at context switch time.
>>
>> Signed-off-by: Greg Ungerer<gerg@uclinux.org>
>> ---
>> arch/m68k/kernel/entry_no.S 24 ++++++++++++++++++------
>> arch/m68k/platform/coldfire/entry.S | 18 +++++++++++++++++-
>> 2 files changed, 35 insertions(+), 7 deletions(-)
>>
>> diff --git a/arch/m68k/kernel/entry_no.S b/arch/m68k/kernel/entry_no.S
>> index 1b42890..050d7ea 100644
>> --- a/arch/m68k/kernel/entry_no.S
>> +++ b/arch/m68k/kernel/entry_no.S
>> @@ -44,8 +44,12 @@
>>
>> ENTRY(buserr)
>> SAVE_ALL_INT
>> - moveq #-1,%d0
>> - movel %d0,%sp@(PT_OFF_ORIG_D0)
>
> Don't you need the above anymore, at least on nommu?

Yes it is needed, but it is done in the SAVE_ALL_INT macro now.
That was done in commit 61619b12078dc8b85a3d4cbfa16f650daa341bd1
("m68k: merge mmu and non-mmu include/asm/entry.h files").

It sure has nothing to do with the a2 work that the patch description
says above :) I'll move this change into a separate patch with
appropriate comments.

Regards
Greg

>> +#ifdef CONFIG_MMU
>> + Ã¡ Ã¡ Ã¡ movel Ã¡ %sp,%d0 Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ /* get thread_info pointer */
>> + Ã¡ Ã¡ Ã¡ andl Ã¡ Ã¡#-THREAD_SIZE,%d0 Ã¡ Ã¡ Ã¡ /* at start of kernel stack */
>> + Ã¡ Ã¡ Ã¡ movel Ã¡ %d0,%a2
>> + Ã¡ Ã¡ Ã¡ movel Ã¡ %a2@,%a2 Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡/* current pointer into a2 */
>> +#endif
>> Ã¡ Ã¡ Ã¡ Ã¡movel Ã¡ %sp,%sp@- Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ /* stack frame pointer argument */
>> Ã¡ Ã¡ Ã¡ Ã¡jsr Ã¡ Ã¡ buserr_c
>> Ã¡ Ã¡ Ã¡ Ã¡addql Ã¡ #4,%sp
>> @@ -53,8 +57,12 @@ ENTRY(buserr)
>>
>> Ã¡ENTRY(trap)
>> Ã¡ Ã¡ Ã¡ Ã¡SAVE_ALL_INT
>> - Ã¡ Ã¡ Ã¡ moveq Ã¡ #-1,%d0
>> - Ã¡ Ã¡ Ã¡ movel Ã¡ %d0,%sp@(PT_OFF_ORIG_D0)
>
> Same here.
>
>> +#ifdef CONFIG_MMU
>> + Ã¡ Ã¡ Ã¡ movel Ã¡ %sp,%d0 Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ /* get thread_info pointer */
>> + Ã¡ Ã¡ Ã¡ andl Ã¡ Ã¡#-THREAD_SIZE,%d0 Ã¡ Ã¡ Ã¡ /* at start of kernel stack */
>> + Ã¡ Ã¡ Ã¡ movel Ã¡ %d0,%a2
>> + Ã¡ Ã¡ Ã¡ movel Ã¡ %a2@,%a2 Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡/* current pointer into a2 */
>> +#endif
>> Ã¡ Ã¡ Ã¡ Ã¡movel Ã¡ %sp,%sp@- Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ /* stack frame pointer argument */
>> Ã¡ Ã¡ Ã¡ Ã¡jsr Ã¡ Ã¡ trap_c
>> Ã¡ Ã¡ Ã¡ Ã¡addql Ã¡ #4,%sp
>> @@ -65,8 +73,12 @@ ENTRY(trap)
>> Ã¡.globl dbginterrupt
>> Ã¡ENTRY(dbginterrupt)
>> Ã¡ Ã¡ Ã¡ Ã¡SAVE_ALL_INT
>> - Ã¡ Ã¡ Ã¡ moveq Ã¡ #-1,%d0
>> - Ã¡ Ã¡ Ã¡ movel Ã¡ %d0,%sp@(PT_OFF_ORIG_D0)
>> +#ifdef CONFIG_MMU
>> + Ã¡ Ã¡ Ã¡ movel Ã¡ %sp,%d0 Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ /* get thread_info pointer */
>> + Ã¡ Ã¡ Ã¡ andl Ã¡ Ã¡#-THREAD_SIZE,%d0 Ã¡ Ã¡ Ã¡ /* at start of kernel stack */
>> + Ã¡ Ã¡ Ã¡ movel Ã¡ %d0,%a2
>> + Ã¡ Ã¡ Ã¡ movel Ã¡ %a2@,%a2 Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡/* current pointer into a2 */
>> +#endif
>> Ã¡ Ã¡ Ã¡ Ã¡movel Ã¡ %sp,%sp@- Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ /* stack frame pointer argument */
>> Ã¡ Ã¡ Ã¡ Ã¡jsr Ã¡ Ã¡ dbginterrupt_c
>> Ã¡ Ã¡ Ã¡ Ã¡addql Ã¡ #4,%sp
>> diff --git a/arch/m68k/platform/coldfire/entry.S b/arch/m68k/platform/coldfire/entry.S
>> index f567a16..5fc1f40 100644
>> --- a/arch/m68k/platform/coldfire/entry.S
>> +++ b/arch/m68k/platform/coldfire/entry.S
>> @@ -63,6 +63,13 @@ ENTRY(system_call)
>> Ã¡ Ã¡ Ã¡ Ã¡SAVE_ALL_SYS
>> Ã¡ Ã¡ Ã¡ Ã¡move Ã¡ Ã¡#0x2000,%sr Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ /* enable intrs again */
>>
>> +#ifdef CONFIG_MMU
>> + Ã¡ Ã¡ Ã¡ movel Ã¡ %sp,%d2 Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ /* get thread_info pointer */
>> + Ã¡ Ã¡ Ã¡ andl Ã¡ Ã¡#-THREAD_SIZE,%d2 Ã¡ Ã¡ Ã¡ /* at start of kernel stack */
>> + Ã¡ Ã¡ Ã¡ movel Ã¡ %d2,%a2
>> + Ã¡ Ã¡ Ã¡ movel Ã¡ %a2@,%a2 Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡/* current pointer into a2 */
>> +#endif
>> +
>> Ã¡ Ã¡ Ã¡ Ã¡cmpl Ã¡ Ã¡#NR_syscalls,%d0
>> Ã¡ Ã¡ Ã¡ Ã¡jcc Ã¡ Ã¡ enosys
>> Ã¡ Ã¡ Ã¡ Ã¡lea Ã¡ Ã¡ sys_call_table,%a0
>> @@ -166,6 +173,13 @@ Lsignal_return:
>> Ã¡ENTRY(inthandler)
>> Ã¡ Ã¡ Ã¡ Ã¡SAVE_ALL_INT
>>
>> +#ifdef CONFIG_MMU
>> + Ã¡ Ã¡ Ã¡ movel Ã¡ %sp,%d2 Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ /* get thread_info pointer */
>> + Ã¡ Ã¡ Ã¡ andl Ã¡ Ã¡#-THREAD_SIZE,%d2 Ã¡ Ã¡ Ã¡ /* at start of kernel stack */
>> + Ã¡ Ã¡ Ã¡ movel Ã¡ %d2,%a2
>> + Ã¡ Ã¡ Ã¡ movel Ã¡ %a2@,%a2 Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡/* current pointer into a2 */
>> +#endif
>> +
>> Ã¡ Ã¡ Ã¡ Ã¡movew Ã¡ %sp@(PT_OFF_FORMATVEC),%d0 /* put exception # in d0 */
>> Ã¡ Ã¡ Ã¡ Ã¡andl Ã¡ Ã¡#0x03fc,%d0 Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ /* mask out vector only */
>>
>> @@ -190,7 +204,9 @@ ENTRY(resume)
>> Ã¡ Ã¡ Ã¡ Ã¡movel Ã¡ %sp,%a0@(TASK_THREAD+THREAD_KSP) /* save kernel stack pointer */
>> Ã¡ Ã¡ Ã¡ Ã¡RDUSP Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡/* movel %usp,%a3 */
>> Ã¡ Ã¡ Ã¡ Ã¡movel Ã¡ %a3,%a0@(TASK_THREAD+THREAD_USP) /* save thread user stack */
>> -
>> +#ifdef CONFIG_MMU
>> + Ã¡ Ã¡ Ã¡ movel Ã¡ %a1,%a2 Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡/* set new current */
>> +#endif
>> Ã¡ Ã¡ Ã¡ Ã¡movel Ã¡ %a1@(TASK_THREAD+THREAD_USP),%a3 /* restore thread user stack */
>> Ã¡ Ã¡ Ã¡ Ã¡WRUSP Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡/* movel %a3,%usp */
>> Ã¡ Ã¡ Ã¡ Ã¡movel Ã¡ %a1@(TASK_THREAD+THREAD_KSP),%sp /* restore new kernel stack */
>
> Gr{oetje,eeting}s,
>
> Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Geert
>
> --
> Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
>
> In personal conversations with technical people, I call myself a hacker. But
> when I'm talking to journalists I just say "programmer" or something like that.
> Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡ Ã¡Ã¡ Ã¡Ã¡ -- Linus Torvalds
>
>
>

--
------------------------------------------------------------------------
Greg Ungerer -- Principal Engineer EMAIL: gerg@snapgear.com
SnapGear Group, McAfee PHONE: +61 7 3435 2888
8 Gardner Close FAX: +61 7 3217 5323
Milton, QLD, 4064, Australia WEB: http://www.SnapGear.com