1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* bootstd.h: Bootloader system call interface 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * (c) 1999, Rt-Control, Inc. 5*4882a593Smuzhiyun */ 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun #ifndef __BOOTSTD_H__ 8*4882a593Smuzhiyun #define __BOOTSTD_H__ 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #define NR_BSC 21 /* last used bootloader system call */ 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #define __BN_reset 0 /* reset and start the bootloader */ 13*4882a593Smuzhiyun #define __BN_test 1 /* tests the system call interface */ 14*4882a593Smuzhiyun #define __BN_exec 2 /* executes a bootloader image */ 15*4882a593Smuzhiyun #define __BN_exit 3 /* terminates a bootloader image */ 16*4882a593Smuzhiyun #define __BN_program 4 /* program FLASH from a chain */ 17*4882a593Smuzhiyun #define __BN_erase 5 /* erase sector(s) of FLASH */ 18*4882a593Smuzhiyun #define __BN_open 6 19*4882a593Smuzhiyun #define __BN_write 7 20*4882a593Smuzhiyun #define __BN_read 8 21*4882a593Smuzhiyun #define __BN_close 9 22*4882a593Smuzhiyun #define __BN_mmap 10 /* map a file descriptor into memory */ 23*4882a593Smuzhiyun #define __BN_munmap 11 /* remove a file to memory mapping */ 24*4882a593Smuzhiyun #define __BN_gethwaddr 12 /* get the hardware address of my interfaces */ 25*4882a593Smuzhiyun #define __BN_getserialnum 13 /* get the serial number of this board */ 26*4882a593Smuzhiyun #define __BN_getbenv 14 /* get a bootloader envvar */ 27*4882a593Smuzhiyun #define __BN_setbenv 15 /* get a bootloader envvar */ 28*4882a593Smuzhiyun #define __BN_setpmask 16 /* set the protection mask */ 29*4882a593Smuzhiyun #define __BN_readenv 17 /* read environment variables */ 30*4882a593Smuzhiyun #define __BN_flash_chattr_range 18 31*4882a593Smuzhiyun #define __BN_flash_erase_range 19 32*4882a593Smuzhiyun #define __BN_flash_write_range 20 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun /* Calling conventions compatible to (uC)linux/68k 35*4882a593Smuzhiyun * We use similar macros to call into the bootloader as for uClinux 36*4882a593Smuzhiyun */ 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun #define __bsc_return(type, res) \ 39*4882a593Smuzhiyun do { \ 40*4882a593Smuzhiyun if ((unsigned long)(res) >= (unsigned long)(-64)) { \ 41*4882a593Smuzhiyun /* let errno be a function, preserve res in %d0 */ \ 42*4882a593Smuzhiyun int __err = -(res); \ 43*4882a593Smuzhiyun errno = __err; \ 44*4882a593Smuzhiyun res = -1; \ 45*4882a593Smuzhiyun } \ 46*4882a593Smuzhiyun return (type)(res); \ 47*4882a593Smuzhiyun } while (0) 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun #define _bsc0(type,name) \ 50*4882a593Smuzhiyun type name(void) \ 51*4882a593Smuzhiyun { \ 52*4882a593Smuzhiyun register long __res __asm__ ("%d0") = __BN_##name; \ 53*4882a593Smuzhiyun __asm__ __volatile__ ("trap #2" \ 54*4882a593Smuzhiyun : "=g" (__res) \ 55*4882a593Smuzhiyun : "0" (__res) \ 56*4882a593Smuzhiyun ); \ 57*4882a593Smuzhiyun __bsc_return(type,__res); \ 58*4882a593Smuzhiyun } 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun #define _bsc1(type,name,atype,a) \ 61*4882a593Smuzhiyun type name(atype a) \ 62*4882a593Smuzhiyun { \ 63*4882a593Smuzhiyun register long __res __asm__ ("%d0") = __BN_##name; \ 64*4882a593Smuzhiyun register long __a __asm__ ("%d1") = (long)a; \ 65*4882a593Smuzhiyun __asm__ __volatile__ ("trap #2" \ 66*4882a593Smuzhiyun : "=g" (__res) \ 67*4882a593Smuzhiyun : "0" (__res), "d" (__a) \ 68*4882a593Smuzhiyun ); \ 69*4882a593Smuzhiyun __bsc_return(type,__res); \ 70*4882a593Smuzhiyun } 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun #define _bsc2(type,name,atype,a,btype,b) \ 73*4882a593Smuzhiyun type name(atype a, btype b) \ 74*4882a593Smuzhiyun { \ 75*4882a593Smuzhiyun register long __res __asm__ ("%d0") = __BN_##name; \ 76*4882a593Smuzhiyun register long __a __asm__ ("%d1") = (long)a; \ 77*4882a593Smuzhiyun register long __b __asm__ ("%d2") = (long)b; \ 78*4882a593Smuzhiyun __asm__ __volatile__ ("trap #2" \ 79*4882a593Smuzhiyun : "=g" (__res) \ 80*4882a593Smuzhiyun : "0" (__res), "d" (__a), "d" (__b) \ 81*4882a593Smuzhiyun ); \ 82*4882a593Smuzhiyun __bsc_return(type,__res); \ 83*4882a593Smuzhiyun } 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun #define _bsc3(type,name,atype,a,btype,b,ctype,c) \ 86*4882a593Smuzhiyun type name(atype a, btype b, ctype c) \ 87*4882a593Smuzhiyun { \ 88*4882a593Smuzhiyun register long __res __asm__ ("%d0") = __BN_##name; \ 89*4882a593Smuzhiyun register long __a __asm__ ("%d1") = (long)a; \ 90*4882a593Smuzhiyun register long __b __asm__ ("%d2") = (long)b; \ 91*4882a593Smuzhiyun register long __c __asm__ ("%d3") = (long)c; \ 92*4882a593Smuzhiyun __asm__ __volatile__ ("trap #2" \ 93*4882a593Smuzhiyun : "=g" (__res) \ 94*4882a593Smuzhiyun : "0" (__res), "d" (__a), "d" (__b), \ 95*4882a593Smuzhiyun "d" (__c) \ 96*4882a593Smuzhiyun ); \ 97*4882a593Smuzhiyun __bsc_return(type,__res); \ 98*4882a593Smuzhiyun } 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun #define _bsc4(type,name,atype,a,btype,b,ctype,c,dtype,d) \ 101*4882a593Smuzhiyun type name(atype a, btype b, ctype c, dtype d) \ 102*4882a593Smuzhiyun { \ 103*4882a593Smuzhiyun register long __res __asm__ ("%d0") = __BN_##name; \ 104*4882a593Smuzhiyun register long __a __asm__ ("%d1") = (long)a; \ 105*4882a593Smuzhiyun register long __b __asm__ ("%d2") = (long)b; \ 106*4882a593Smuzhiyun register long __c __asm__ ("%d3") = (long)c; \ 107*4882a593Smuzhiyun register long __d __asm__ ("%d4") = (long)d; \ 108*4882a593Smuzhiyun __asm__ __volatile__ ("trap #2" \ 109*4882a593Smuzhiyun : "=g" (__res) \ 110*4882a593Smuzhiyun : "0" (__res), "d" (__a), "d" (__b), \ 111*4882a593Smuzhiyun "d" (__c), "d" (__d) \ 112*4882a593Smuzhiyun ); \ 113*4882a593Smuzhiyun __bsc_return(type,__res); \ 114*4882a593Smuzhiyun } 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun #define _bsc5(type,name,atype,a,btype,b,ctype,c,dtype,d,etype,e) \ 117*4882a593Smuzhiyun type name(atype a, btype b, ctype c, dtype d, etype e) \ 118*4882a593Smuzhiyun { \ 119*4882a593Smuzhiyun register long __res __asm__ ("%d0") = __BN_##name; \ 120*4882a593Smuzhiyun register long __a __asm__ ("%d1") = (long)a; \ 121*4882a593Smuzhiyun register long __b __asm__ ("%d2") = (long)b; \ 122*4882a593Smuzhiyun register long __c __asm__ ("%d3") = (long)c; \ 123*4882a593Smuzhiyun register long __d __asm__ ("%d4") = (long)d; \ 124*4882a593Smuzhiyun register long __e __asm__ ("%d5") = (long)e; \ 125*4882a593Smuzhiyun __asm__ __volatile__ ("trap #2" \ 126*4882a593Smuzhiyun : "=g" (__res) \ 127*4882a593Smuzhiyun : "0" (__res), "d" (__a), "d" (__b), \ 128*4882a593Smuzhiyun "d" (__c), "d" (__d), "d" (__e) \ 129*4882a593Smuzhiyun ); \ 130*4882a593Smuzhiyun __bsc_return(type,__res); \ 131*4882a593Smuzhiyun } 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun #endif /* __BOOTSTD_H__ */ 134