1 1.1 matt /*- 2 1.1 matt * Copyright (c) 2011 The NetBSD Foundation, Inc. 3 1.1 matt * All rights reserved. 4 1.1 matt * 5 1.1 matt * This code is derived from software contributed to The NetBSD Foundation 6 1.1 matt * by Matt Thomas of 3am Software Foundry. 7 1.1 matt * 8 1.1 matt * Redistribution and use in source and binary forms, with or without 9 1.1 matt * modification, are permitted provided that the following conditions 10 1.1 matt * are met: 11 1.1 matt * 1. Redistributions of source code must retain the above copyright 12 1.1 matt * notice, this list of conditions and the following disclaimer. 13 1.1 matt * 2. Redistributions in binary form must reproduce the above copyright 14 1.1 matt * notice, this list of conditions and the following disclaimer in the 15 1.1 matt * documentation and/or other materials provided with the distribution. 16 1.1 matt * 17 1.1 matt * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 18 1.1 matt * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 19 1.1 matt * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 20 1.1 matt * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 21 1.1 matt * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22 1.1 matt * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23 1.1 matt * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24 1.1 matt * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 25 1.1 matt * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 26 1.1 matt * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 27 1.1 matt * POSSIBILITY OF SUCH DAMAGE. 28 1.1 matt */ 29 1.1 matt 30 1.1 matt #include <sys/cdefs.h> 31 1.1 matt #include <machine/asm.h> 32 1.1 matt 33 1.1 matt #include "assym.h" 34 1.1 matt 35 1.4 tsutsui RCSID("$NetBSD: arcbios_calls.S,v 1.4 2020/05/30 03:16:31 tsutsui Exp $") 36 1.1 matt 37 1.1 matt .text 38 1.1 matt .set noreorder 39 1.1 matt 40 1.1 matt #ifdef _LP64 41 1.1 matt #define FIX_V0 sll v0, v0, 0 42 1.1 matt #else 43 1.1 matt #define FIX_V0 /* nothing */ 44 1.1 matt #endif 45 1.1 matt 46 1.1 matt #define CALLFRAME2_SIZ (CALLFRAME_SIZ + 16) 47 1.1 matt #define CALLFRAME2_RA (CALLFRAME_RA + 16) 48 1.4 tsutsui #define CALLFRAME2_SP (CALLFRAME_SP + 16) 49 1.1 matt 50 1.1 matt #ifndef _STANDALONE 51 1.1 matt NESTED(arcbios_4orless_args, CALLFRAME_SIZ, ra) 52 1.1 matt PTR_SUBU sp, CALLFRAME_SIZ 53 1.1 matt 54 1.1 matt REG_S ra, CALLFRAME_RA(sp) 55 1.4 tsutsui REG_S s0, CALLFRAME_SP(sp) 56 1.1 matt 57 1.1 matt PTR_L t9, _C_LABEL(ARCBIOS) 58 1.1 matt PTR_ADDU t9, t0 59 1.1 matt INT_L t9, 0(t9) 60 1.1 matt nop 61 1.1 matt 62 1.1 matt jalr t9 63 1.3 tsutsui move s0, MIPS_CURLWP 64 1.1 matt 65 1.1 matt FIX_V0 66 1.1 matt 67 1.3 tsutsui move MIPS_CURLWP, s0 68 1.1 matt 69 1.1 matt REG_L ra, CALLFRAME_RA(sp) 70 1.4 tsutsui REG_L s0, CALLFRAME_SP(sp) 71 1.1 matt 72 1.1 matt jr ra 73 1.1 matt PTR_ADDU sp, CALLFRAME_SIZ 74 1.1 matt END(arcbios_4orless_args) 75 1.1 matt 76 1.1 matt NESTED(arcbios_5to8_args, CALLFRAME2_SIZ, ra) 77 1.1 matt PTR_SUBU sp, CALLFRAME2_SIZ 78 1.1 matt 79 1.1 matt REG_S ra, CALLFRAME2_RA(sp) 80 1.4 tsutsui REG_S s0, CALLFRAME2_SP(sp) 81 1.1 matt 82 1.1 matt #ifdef __mips_o32 83 1.1 matt INT_L ta0, CALLFRAME2_SIZ+16(sp) # load 5th arg 84 1.1 matt INT_L ta1, CALLFRAME2_SIZ+20(sp) # load 6th arg 85 1.1 matt INT_L ta2, CALLFRAME2_SIZ+24(sp) # load 7th arg 86 1.1 matt INT_L ta3, CALLFRAME2_SIZ+28(sp) # load 8th arg 87 1.1 matt INT_S ta0, 16(sp) # save 5th arg on stack (o32) 88 1.1 matt INT_S ta1, 20(sp) # save 6th arg on stack (o32) 89 1.1 matt INT_S ta2, 24(sp) # save 7th arg on stack (o32) 90 1.1 matt INT_S ta3, 28(sp) # save 8th arg on stack (o32) 91 1.1 matt #else 92 1.1 matt INT_S a4, 16(sp) # save 5th arg on stack (o32) 93 1.1 matt INT_S a5, 20(sp) # save 6th arg on stack (o32) 94 1.1 matt INT_S a6, 24(sp) # save 7th arg on stack (o32) 95 1.1 matt INT_S a7, 28(sp) # save 8th arg on stack (o32) 96 1.1 matt #endif 97 1.1 matt 98 1.1 matt PTR_L t9, _C_LABEL(ARCBIOS) 99 1.1 matt PTR_ADDU t9, t0 100 1.1 matt INT_L t9, 0(t9) 101 1.1 matt nop 102 1.1 matt 103 1.1 matt jalr t9 104 1.3 tsutsui move s0, MIPS_CURLWP 105 1.1 matt 106 1.1 matt FIX_V0 107 1.1 matt 108 1.3 tsutsui move MIPS_CURLWP, s0 109 1.1 matt 110 1.1 matt REG_L ra, CALLFRAME2_RA(sp) 111 1.4 tsutsui REG_L s0, CALLFRAME2_SP(sp) 112 1.1 matt 113 1.1 matt jr ra 114 1.1 matt PTR_ADDU sp, CALLFRAME2_SIZ 115 1.1 matt END(arcbios_5to8_args) 116 1.1 matt #endif /* !_STANDALONE */ 117 1.1 matt 118 1.1 matt #define AFVDIRECT(name) \ 119 1.1 matt .globl __CONCAT(arcbios_,name); \ 120 1.1 matt LEAF(__CONCAT(arcbios_,name)); \ 121 1.1 matt PTR_L t9, _C_LABEL(ARCBIOS); \ 122 1.1 matt nop; \ 123 1.1 matt INT_L t9, __CONCAT(AFV_,name)(t9); \ 124 1.1 matt nop; \ 125 1.1 matt jr t9; \ 126 1.1 matt nop; \ 127 1.1 matt END(__CONCAT(arcbios_,name)) 128 1.1 matt 129 1.1 matt #ifdef _STANDALONE 130 1.1 matt #define AFV4ORLESS(name) AFVDIRECT(name) 131 1.1 matt #define AFV5ORMORE(name) AFVDIRECT(name) 132 1.1 matt #else 133 1.1 matt #define AFV4ORLESS(name) \ 134 1.1 matt .globl __CONCAT(arcbios_,name); \ 135 1.1 matt NESTED(__CONCAT(arcbios_,name), 0, ra); \ 136 1.1 matt b arcbios_4orless_args; \ 137 1.1 matt li t0, __CONCAT(AFV_,name); \ 138 1.1 matt END(__CONCAT(arcbios_,name)) 139 1.1 matt 140 1.1 matt #define AFV5ORMORE(name) \ 141 1.1 matt .globl __CONCAT(arcbios_,name); \ 142 1.1 matt NESTED(__CONCAT(arcbios_,name), 0, ra); \ 143 1.1 matt b arcbios_5to8_args; \ 144 1.1 matt li t0, __CONCAT(AFV_,name); \ 145 1.1 matt END(__CONCAT(arcbios_,name)) 146 1.1 matt #endif 147 1.1 matt 148 1.1 matt /* 149 1.1 matt * ARC firmware vector 150 1.1 matt */ 151 1.1 matt AFV4ORLESS(Load) /* long (*Load)(char *image, u_long top, u_long entry, u_long *low); */ 152 1.1 matt AFV5ORMORE(Invoke) /* long (*Invoke)(u_long, u_long, u_long, char **, char **); */ 153 1.1 matt AFV4ORLESS(Execute) /* long (*Execute)(char *, u_long, char **, char **); */ 154 1.1 matt AFVDIRECT(Halt) /* void (*Halt)(void) __dead; */ 155 1.1 matt AFVDIRECT(PowerDown) /* void (*PowerDown)(void) __dead; */ 156 1.1 matt AFVDIRECT(Restart) /* void (*Restart)(void) __dead; */ 157 1.1 matt AFVDIRECT(Reboot) /* void (*Reboot)(void) __dead; */ 158 1.1 matt AFVDIRECT(EnterInteractiveMode) /* void (*EnterInteractiveMode)(void) __dead; */ 159 1.1 matt #ifndef sgimips 160 1.1 matt AFVDIRECT(ReturnFromMain) /* void (*ReturnFromMain)(void) __dead; */ 161 1.1 matt #endif 162 1.1 matt AFV4ORLESS(GetPeer) /* void *(*GetPeer)(void *); */ 163 1.1 matt AFV4ORLESS(GetChild) /* void *(*GetChild)(void *); */ 164 1.1 matt AFV4ORLESS(GetParent) /* void *(*GetParent)(void *); */ 165 1.1 matt AFV4ORLESS(GetConfigurationData) /* long (*GetConfigurationData)(void *, void *); */ 166 1.1 matt AFV4ORLESS(AddChild) /* void *(*AddChild)(void *, void *); */ 167 1.1 matt AFV4ORLESS(DeleteComponent) /* long (*DeleteComponent)(void *component); */ 168 1.1 matt AFV4ORLESS(GetComponent) /* void *(*GetComponent)(char *path); */ 169 1.1 matt AFV4ORLESS(SaveConfiguration) /* long (*SaveConfiguration)(void); */ 170 1.1 matt AFV4ORLESS(GetSystemId) /* void *(*GetSystemId)(void); */ 171 1.1 matt AFV4ORLESS(GetMemoryDescriptor) /* void *(*GetMemoryDescriptor)(void *); */ 172 1.1 matt #if !defined(sgimips) 173 1.1 matt AFV4ORLESS(Signal) /* void (*Signal)(u_long, void *); */ 174 1.1 matt #endif 175 1.1 matt AFV4ORLESS(GetTime) /* void *(*GetTime)(void); */ 176 1.1 matt AFV4ORLESS(GetRelativeTime) /* u_long (*GetRelativeTime)(void); */ 177 1.1 matt AFV4ORLESS(GetDirectoryEntry) /* long (*GetDirectoryEntry)(u_long, void *, u_long, u_long *); */ 178 1.1 matt AFV4ORLESS(Open) /* long (*Open)(char *, u_long, u_long *); */ 179 1.1 matt AFV4ORLESS(Close) /* long (*Close)(u_long); */ 180 1.1 matt AFV4ORLESS(Read) /* long (*Read)(u_long, void *, u_long, u_long *); */ 181 1.1 matt AFV4ORLESS(GetReadStatus) /* long (*GetReadStatus)(u_long); */ 182 1.1 matt AFV4ORLESS(Write) /* long (*Write)(u_long, void *, u_long, u_long *); */ 183 1.1 matt AFV4ORLESS(Seek) /* long (*Seek)(u_long, int64_t *, u_long); */ 184 1.1 matt AFV4ORLESS(Mount) /* long (*Mount)(char *, u_long); */ 185 1.1 matt AFV4ORLESS(GetEnvironmentVariable) /* const char *(*GetEnvironmentVariable)(const char *); */ 186 1.1 matt AFV4ORLESS(SetEnvironmentVariable) /* long (*SetEnvironmentVariable)(const char *, const char *); */ 187 1.1 matt AFV4ORLESS(GetFileInformation) /* long (*GetFileInformation)(u_long, void *); */ 188 1.1 matt AFV4ORLESS(SetFileInformation) /* long (*SetFileInformation)(u_long, u_long, u_long); */ 189 1.1 matt AFV4ORLESS(FlushAllCaches) /* void (*FlushAllCaches)(void); */ 190 1.1 matt #ifndef sgimips 191 1.1 matt AFV4ORLESS(TestUnicode) /* paddr_t (*TestUnicode)(u_long, uint16_t); */ 192 1.1 matt AFV4ORLESS(GetDisplayStatus) /* void *(*GetDisplayStatus)(u_long); */ 193 1.1 matt #endif 194