162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* bootstd.h: Bootloader system call interface 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * (c) 1999, Rt-Control, Inc. 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#ifndef __BOOTSTD_H__ 862306a36Sopenharmony_ci#define __BOOTSTD_H__ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#define NR_BSC 21 /* last used bootloader system call */ 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#define __BN_reset 0 /* reset and start the bootloader */ 1362306a36Sopenharmony_ci#define __BN_test 1 /* tests the system call interface */ 1462306a36Sopenharmony_ci#define __BN_exec 2 /* executes a bootloader image */ 1562306a36Sopenharmony_ci#define __BN_exit 3 /* terminates a bootloader image */ 1662306a36Sopenharmony_ci#define __BN_program 4 /* program FLASH from a chain */ 1762306a36Sopenharmony_ci#define __BN_erase 5 /* erase sector(s) of FLASH */ 1862306a36Sopenharmony_ci#define __BN_open 6 1962306a36Sopenharmony_ci#define __BN_write 7 2062306a36Sopenharmony_ci#define __BN_read 8 2162306a36Sopenharmony_ci#define __BN_close 9 2262306a36Sopenharmony_ci#define __BN_mmap 10 /* map a file descriptor into memory */ 2362306a36Sopenharmony_ci#define __BN_munmap 11 /* remove a file to memory mapping */ 2462306a36Sopenharmony_ci#define __BN_gethwaddr 12 /* get the hardware address of my interfaces */ 2562306a36Sopenharmony_ci#define __BN_getserialnum 13 /* get the serial number of this board */ 2662306a36Sopenharmony_ci#define __BN_getbenv 14 /* get a bootloader envvar */ 2762306a36Sopenharmony_ci#define __BN_setbenv 15 /* get a bootloader envvar */ 2862306a36Sopenharmony_ci#define __BN_setpmask 16 /* set the protection mask */ 2962306a36Sopenharmony_ci#define __BN_readenv 17 /* read environment variables */ 3062306a36Sopenharmony_ci#define __BN_flash_chattr_range 18 3162306a36Sopenharmony_ci#define __BN_flash_erase_range 19 3262306a36Sopenharmony_ci#define __BN_flash_write_range 20 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci/* Calling conventions compatible to (uC)linux/68k 3562306a36Sopenharmony_ci * We use similar macros to call into the bootloader as for uClinux 3662306a36Sopenharmony_ci */ 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci#define __bsc_return(type, res) \ 3962306a36Sopenharmony_cido { \ 4062306a36Sopenharmony_ci if ((unsigned long)(res) >= (unsigned long)(-64)) { \ 4162306a36Sopenharmony_ci /* let errno be a function, preserve res in %d0 */ \ 4262306a36Sopenharmony_ci int __err = -(res); \ 4362306a36Sopenharmony_ci errno = __err; \ 4462306a36Sopenharmony_ci res = -1; \ 4562306a36Sopenharmony_ci } \ 4662306a36Sopenharmony_ci return (type)(res); \ 4762306a36Sopenharmony_ci} while (0) 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci#define _bsc0(type,name) \ 5062306a36Sopenharmony_citype name(void) \ 5162306a36Sopenharmony_ci{ \ 5262306a36Sopenharmony_ci register long __res __asm__ ("%d0") = __BN_##name; \ 5362306a36Sopenharmony_ci __asm__ __volatile__ ("trap #2" \ 5462306a36Sopenharmony_ci : "=g" (__res) \ 5562306a36Sopenharmony_ci : "0" (__res) \ 5662306a36Sopenharmony_ci ); \ 5762306a36Sopenharmony_ci __bsc_return(type,__res); \ 5862306a36Sopenharmony_ci} 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci#define _bsc1(type,name,atype,a) \ 6162306a36Sopenharmony_citype name(atype a) \ 6262306a36Sopenharmony_ci{ \ 6362306a36Sopenharmony_ci register long __res __asm__ ("%d0") = __BN_##name; \ 6462306a36Sopenharmony_ci register long __a __asm__ ("%d1") = (long)a; \ 6562306a36Sopenharmony_ci __asm__ __volatile__ ("trap #2" \ 6662306a36Sopenharmony_ci : "=g" (__res) \ 6762306a36Sopenharmony_ci : "0" (__res), "d" (__a) \ 6862306a36Sopenharmony_ci ); \ 6962306a36Sopenharmony_ci __bsc_return(type,__res); \ 7062306a36Sopenharmony_ci} 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci#define _bsc2(type,name,atype,a,btype,b) \ 7362306a36Sopenharmony_citype name(atype a, btype b) \ 7462306a36Sopenharmony_ci{ \ 7562306a36Sopenharmony_ci register long __res __asm__ ("%d0") = __BN_##name; \ 7662306a36Sopenharmony_ci register long __a __asm__ ("%d1") = (long)a; \ 7762306a36Sopenharmony_ci register long __b __asm__ ("%d2") = (long)b; \ 7862306a36Sopenharmony_ci __asm__ __volatile__ ("trap #2" \ 7962306a36Sopenharmony_ci : "=g" (__res) \ 8062306a36Sopenharmony_ci : "0" (__res), "d" (__a), "d" (__b) \ 8162306a36Sopenharmony_ci ); \ 8262306a36Sopenharmony_ci __bsc_return(type,__res); \ 8362306a36Sopenharmony_ci} 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci#define _bsc3(type,name,atype,a,btype,b,ctype,c) \ 8662306a36Sopenharmony_citype name(atype a, btype b, ctype c) \ 8762306a36Sopenharmony_ci{ \ 8862306a36Sopenharmony_ci register long __res __asm__ ("%d0") = __BN_##name; \ 8962306a36Sopenharmony_ci register long __a __asm__ ("%d1") = (long)a; \ 9062306a36Sopenharmony_ci register long __b __asm__ ("%d2") = (long)b; \ 9162306a36Sopenharmony_ci register long __c __asm__ ("%d3") = (long)c; \ 9262306a36Sopenharmony_ci __asm__ __volatile__ ("trap #2" \ 9362306a36Sopenharmony_ci : "=g" (__res) \ 9462306a36Sopenharmony_ci : "0" (__res), "d" (__a), "d" (__b), \ 9562306a36Sopenharmony_ci "d" (__c) \ 9662306a36Sopenharmony_ci ); \ 9762306a36Sopenharmony_ci __bsc_return(type,__res); \ 9862306a36Sopenharmony_ci} 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_ci#define _bsc4(type,name,atype,a,btype,b,ctype,c,dtype,d) \ 10162306a36Sopenharmony_citype name(atype a, btype b, ctype c, dtype d) \ 10262306a36Sopenharmony_ci{ \ 10362306a36Sopenharmony_ci register long __res __asm__ ("%d0") = __BN_##name; \ 10462306a36Sopenharmony_ci register long __a __asm__ ("%d1") = (long)a; \ 10562306a36Sopenharmony_ci register long __b __asm__ ("%d2") = (long)b; \ 10662306a36Sopenharmony_ci register long __c __asm__ ("%d3") = (long)c; \ 10762306a36Sopenharmony_ci register long __d __asm__ ("%d4") = (long)d; \ 10862306a36Sopenharmony_ci __asm__ __volatile__ ("trap #2" \ 10962306a36Sopenharmony_ci : "=g" (__res) \ 11062306a36Sopenharmony_ci : "0" (__res), "d" (__a), "d" (__b), \ 11162306a36Sopenharmony_ci "d" (__c), "d" (__d) \ 11262306a36Sopenharmony_ci ); \ 11362306a36Sopenharmony_ci __bsc_return(type,__res); \ 11462306a36Sopenharmony_ci} 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_ci#define _bsc5(type,name,atype,a,btype,b,ctype,c,dtype,d,etype,e) \ 11762306a36Sopenharmony_citype name(atype a, btype b, ctype c, dtype d, etype e) \ 11862306a36Sopenharmony_ci{ \ 11962306a36Sopenharmony_ci register long __res __asm__ ("%d0") = __BN_##name; \ 12062306a36Sopenharmony_ci register long __a __asm__ ("%d1") = (long)a; \ 12162306a36Sopenharmony_ci register long __b __asm__ ("%d2") = (long)b; \ 12262306a36Sopenharmony_ci register long __c __asm__ ("%d3") = (long)c; \ 12362306a36Sopenharmony_ci register long __d __asm__ ("%d4") = (long)d; \ 12462306a36Sopenharmony_ci register long __e __asm__ ("%d5") = (long)e; \ 12562306a36Sopenharmony_ci __asm__ __volatile__ ("trap #2" \ 12662306a36Sopenharmony_ci : "=g" (__res) \ 12762306a36Sopenharmony_ci : "0" (__res), "d" (__a), "d" (__b), \ 12862306a36Sopenharmony_ci "d" (__c), "d" (__d), "d" (__e) \ 12962306a36Sopenharmony_ci ); \ 13062306a36Sopenharmony_ci __bsc_return(type,__res); \ 13162306a36Sopenharmony_ci} 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ci#endif /* __BOOTSTD_H__ */ 134