mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 21:38:32 +08:00
49316cbf0a
They tend to get not updated when files are moved around or copied and lack any obvious use. While at it zap some only too obvious comments and as per Shinya's suggestion, add a copyright header to extable.c. Signed-off-by: Ralf Baechle <ralf@linux-mips.org> Acked-by: Shinya Kuribayashi <shinya.kuribayashi@necel.com> Acked-by: Thadeu Lima de Souza Cascardo <cascardo@holoscopio.com>
96 lines
2.6 KiB
ArmAsm
96 lines
2.6 KiB
ArmAsm
/*
|
|
* O32 interface for the 64 (or N32) ABI.
|
|
*
|
|
* Copyright (C) 2002 Maciej W. Rozycki
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version
|
|
* 2 of the License, or (at your option) any later version.
|
|
*/
|
|
|
|
#include <asm/asm.h>
|
|
#include <asm/regdef.h>
|
|
|
|
/* Maximum number of arguments supported. Must be even! */
|
|
#define O32_ARGC 32
|
|
/* Number of static registers we save. */
|
|
#define O32_STATC 11
|
|
/* Frame size for static register */
|
|
#define O32_FRAMESZ (SZREG * O32_STATC)
|
|
/* Frame size on new stack */
|
|
#define O32_FRAMESZ_NEW (SZREG + 4 * O32_ARGC)
|
|
|
|
.text
|
|
|
|
/*
|
|
* O32 function call dispatcher, for interfacing 32-bit ROM routines.
|
|
*
|
|
* The standard 64 (N32) calling sequence is supported, with a0
|
|
* holding a function pointer, a1 a new stack pointer, a2-a7 -- its
|
|
* first six arguments and the stack -- remaining ones (up to O32_ARGC,
|
|
* including a2-a7). Static registers, gp and fp are preserved, v0 holds
|
|
* a result. This code relies on the called o32 function for sp and ra
|
|
* restoration and this dispatcher has to be placed in a KSEGx (or KUSEG)
|
|
* address space. Any pointers passed have to point to addresses within
|
|
* one of these spaces as well.
|
|
*/
|
|
NESTED(call_o32, O32_FRAMESZ, ra)
|
|
REG_SUBU sp,O32_FRAMESZ
|
|
|
|
REG_S ra,O32_FRAMESZ-1*SZREG(sp)
|
|
REG_S fp,O32_FRAMESZ-2*SZREG(sp)
|
|
REG_S gp,O32_FRAMESZ-3*SZREG(sp)
|
|
REG_S s7,O32_FRAMESZ-4*SZREG(sp)
|
|
REG_S s6,O32_FRAMESZ-5*SZREG(sp)
|
|
REG_S s5,O32_FRAMESZ-6*SZREG(sp)
|
|
REG_S s4,O32_FRAMESZ-7*SZREG(sp)
|
|
REG_S s3,O32_FRAMESZ-8*SZREG(sp)
|
|
REG_S s2,O32_FRAMESZ-9*SZREG(sp)
|
|
REG_S s1,O32_FRAMESZ-10*SZREG(sp)
|
|
REG_S s0,O32_FRAMESZ-11*SZREG(sp)
|
|
|
|
move jp,a0
|
|
REG_SUBU s0,a1,O32_FRAMESZ_NEW
|
|
REG_S sp,O32_FRAMESZ_NEW-1*SZREG(s0)
|
|
|
|
sll a0,a2,zero
|
|
sll a1,a3,zero
|
|
sll a2,a4,zero
|
|
sll a3,a5,zero
|
|
sw a6,0x10(s0)
|
|
sw a7,0x14(s0)
|
|
|
|
PTR_LA t0,O32_FRAMESZ(sp)
|
|
PTR_LA t1,0x18(s0)
|
|
li t2,O32_ARGC-6
|
|
1:
|
|
lw t3,(t0)
|
|
REG_ADDU t0,SZREG
|
|
sw t3,(t1)
|
|
REG_SUBU t2,1
|
|
REG_ADDU t1,4
|
|
bnez t2,1b
|
|
|
|
move sp,s0
|
|
|
|
jalr jp
|
|
|
|
REG_L sp,O32_FRAMESZ_NEW-1*SZREG(sp)
|
|
|
|
REG_L s0,O32_FRAMESZ-11*SZREG(sp)
|
|
REG_L s1,O32_FRAMESZ-10*SZREG(sp)
|
|
REG_L s2,O32_FRAMESZ-9*SZREG(sp)
|
|
REG_L s3,O32_FRAMESZ-8*SZREG(sp)
|
|
REG_L s4,O32_FRAMESZ-7*SZREG(sp)
|
|
REG_L s5,O32_FRAMESZ-6*SZREG(sp)
|
|
REG_L s6,O32_FRAMESZ-5*SZREG(sp)
|
|
REG_L s7,O32_FRAMESZ-4*SZREG(sp)
|
|
REG_L gp,O32_FRAMESZ-3*SZREG(sp)
|
|
REG_L fp,O32_FRAMESZ-2*SZREG(sp)
|
|
REG_L ra,O32_FRAMESZ-1*SZREG(sp)
|
|
|
|
REG_ADDU sp,O32_FRAMESZ
|
|
jr ra
|
|
END(call_o32)
|