#include <sys/cdefs.h>
#include <machine/asm.h>
#include <mips/asm.h>
#include <mips/cpuregs.h>
#include "assym.h"
RCSID("$NetBSD: arcbios_calls.S,v 1.7 2026/05/03 23:06:13 adrian Exp $")
.text
.set noreorder
#ifdef _LP64
#define FIX_V0 sll v0, v0, 0
#else
#define FIX_V0
#endif
#define CALLFRAME2_SIZ (CALLFRAME_SIZ + 16)
#define CALLFRAME2_RA (CALLFRAME_RA + 16)
#define CALLFRAME2_SP (CALLFRAME_SP + 16)
#ifndef _STANDALONE
NESTED(arcbios_4orless_args, CALLFRAME_SIZ, ra)
PTR_SUBU sp, CALLFRAME_SIZ
REG_S ra, CALLFRAME_RA(sp)
REG_S s0, CALLFRAME_SP(sp)
mfc0 k0, MIPS_COP_0_STATUS
MFC0_HAZARD
or k0, MIPS_SR_COP_1_BIT
mtc0 k0, MIPS_COP_0_STATUS
COP0_HAZARD_FPUENABLE
PTR_L t9, _C_LABEL(ARCBIOS)
nop
PTR_ADDU t9, t0
INT_L t9, 0(t9)
nop
jalr t9
move s0, MIPS_CURLWP
FIX_V0
mfc0 k0, MIPS_COP_0_STATUS
MFC0_HAZARD
and k0, ~MIPS_SR_COP_1_BIT
mtc0 k0, MIPS_COP_0_STATUS
move MIPS_CURLWP, s0
REG_L ra, CALLFRAME_RA(sp)
REG_L s0, CALLFRAME_SP(sp)
jr ra
PTR_ADDU sp, CALLFRAME_SIZ
END(arcbios_4orless_args)
NESTED(arcbios_5to8_args, CALLFRAME2_SIZ, ra)
PTR_SUBU sp, CALLFRAME2_SIZ
REG_S ra, CALLFRAME2_RA(sp)
REG_S s0, CALLFRAME2_SP(sp)
#ifdef __mips_o32
INT_L ta0, CALLFRAME2_SIZ+16(sp) # load 5th arg
INT_L ta1, CALLFRAME2_SIZ+20(sp) # load 6th arg
INT_L ta2, CALLFRAME2_SIZ+24(sp) # load 7th arg
INT_L ta3, CALLFRAME2_SIZ+28(sp) # load 8th arg
INT_S ta0, 16(sp) # save 5th arg on stack (o32)
INT_S ta1, 20(sp) # save 6th arg on stack (o32)
INT_S ta2, 24(sp) # save 7th arg on stack (o32)
INT_S ta3, 28(sp) # save 8th arg on stack (o32)
#else
INT_S a4, 16(sp) # save 5th arg on stack (o32)
INT_S a5, 20(sp) # save 6th arg on stack (o32)
INT_S a6, 24(sp) # save 7th arg on stack (o32)
INT_S a7, 28(sp) # save 8th arg on stack (o32)
#endif
mfc0 k0, MIPS_COP_0_STATUS
MFC0_HAZARD
or k0, MIPS_SR_COP_1_BIT
mtc0 k0, MIPS_COP_0_STATUS
COP0_HAZARD_FPUENABLE
PTR_L t9, _C_LABEL(ARCBIOS)
nop
PTR_ADDU t9, t0
INT_L t9, 0(t9)
nop
jalr t9
move s0, MIPS_CURLWP
FIX_V0
mfc0 k0, MIPS_COP_0_STATUS
MFC0_HAZARD
and k0, ~MIPS_SR_COP_1_BIT
mtc0 k0, MIPS_COP_0_STATUS
move MIPS_CURLWP, s0
REG_L ra, CALLFRAME2_RA(sp)
REG_L s0, CALLFRAME2_SP(sp)
jr ra
PTR_ADDU sp, CALLFRAME2_SIZ
END(arcbios_5to8_args)
#endif
#define AFVDIRECT(name) \
.globl __CONCAT(arcbios_,name); \
LEAF(__CONCAT(arcbios_,name)); \
PTR_L t9, _C_LABEL(ARCBIOS); \
nop; \
INT_L t9, __CONCAT(AFV_,name)(t9); \
nop; \
jr t9; \
nop; \
END(__CONCAT(arcbios_,name))
#ifdef _STANDALONE
#define AFV4ORLESS(name) AFVDIRECT(name)
#define AFV5ORMORE(name) AFVDIRECT(name)
#else
#define AFV4ORLESS(name) \
.globl __CONCAT(arcbios_,name); \
NESTED(__CONCAT(arcbios_,name), 0, ra); \
b arcbios_4orless_args; \
li t0, __CONCAT(AFV_,name); \
END(__CONCAT(arcbios_,name))
#define AFV5ORMORE(name) \
.globl __CONCAT(arcbios_,name); \
NESTED(__CONCAT(arcbios_,name), 0, ra); \
b arcbios_5to8_args; \
li t0, __CONCAT(AFV_,name); \
END(__CONCAT(arcbios_,name))
#endif
AFV4ORLESS(Load)
AFV5ORMORE(Invoke)
AFV4ORLESS(Execute)
AFVDIRECT(Halt)
AFVDIRECT(PowerDown)
AFVDIRECT(Restart)
AFVDIRECT(Reboot)
AFVDIRECT(EnterInteractiveMode)
#ifndef sgimips
AFVDIRECT(ReturnFromMain)
#endif
AFV4ORLESS(GetPeer)
AFV4ORLESS(GetChild)
AFV4ORLESS(GetParent)
AFV4ORLESS(GetConfigurationData)
AFV4ORLESS(AddChild)
AFV4ORLESS(DeleteComponent)
AFV4ORLESS(GetComponent)
AFV4ORLESS(SaveConfiguration)
AFV4ORLESS(GetSystemId)
AFV4ORLESS(GetMemoryDescriptor)
#if !defined(sgimips)
AFV4ORLESS(Signal)
#endif
AFV4ORLESS(GetTime)
AFV4ORLESS(GetRelativeTime)
AFV4ORLESS(GetDirectoryEntry)
AFV4ORLESS(Open)
AFV4ORLESS(Close)
AFV4ORLESS(Read)
AFV4ORLESS(GetReadStatus)
AFV4ORLESS(Write)
AFV4ORLESS(Seek)
AFV4ORLESS(Mount)
AFV4ORLESS(GetEnvironmentVariable)
AFV4ORLESS(SetEnvironmentVariable)
AFV4ORLESS(GetFileInformation)
AFV4ORLESS(SetFileInformation)
AFV4ORLESS(FlushAllCaches)
#ifndef sgimips
AFV4ORLESS(TestUnicode)
AFV4ORLESS(GetDisplayStatus)
#endif