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