18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci/* bootstd.h: Bootloader system call interface 38c2ecf20Sopenharmony_ci * 48c2ecf20Sopenharmony_ci * (c) 1999, Rt-Control, Inc. 58c2ecf20Sopenharmony_ci */ 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci#ifndef __BOOTSTD_H__ 88c2ecf20Sopenharmony_ci#define __BOOTSTD_H__ 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#define NR_BSC 21 /* last used bootloader system call */ 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ci#define __BN_reset 0 /* reset and start the bootloader */ 138c2ecf20Sopenharmony_ci#define __BN_test 1 /* tests the system call interface */ 148c2ecf20Sopenharmony_ci#define __BN_exec 2 /* executes a bootloader image */ 158c2ecf20Sopenharmony_ci#define __BN_exit 3 /* terminates a bootloader image */ 168c2ecf20Sopenharmony_ci#define __BN_program 4 /* program FLASH from a chain */ 178c2ecf20Sopenharmony_ci#define __BN_erase 5 /* erase sector(s) of FLASH */ 188c2ecf20Sopenharmony_ci#define __BN_open 6 198c2ecf20Sopenharmony_ci#define __BN_write 7 208c2ecf20Sopenharmony_ci#define __BN_read 8 218c2ecf20Sopenharmony_ci#define __BN_close 9 228c2ecf20Sopenharmony_ci#define __BN_mmap 10 /* map a file descriptor into memory */ 238c2ecf20Sopenharmony_ci#define __BN_munmap 11 /* remove a file to memory mapping */ 248c2ecf20Sopenharmony_ci#define __BN_gethwaddr 12 /* get the hardware address of my interfaces */ 258c2ecf20Sopenharmony_ci#define __BN_getserialnum 13 /* get the serial number of this board */ 268c2ecf20Sopenharmony_ci#define __BN_getbenv 14 /* get a bootloader envvar */ 278c2ecf20Sopenharmony_ci#define __BN_setbenv 15 /* get a bootloader envvar */ 288c2ecf20Sopenharmony_ci#define __BN_setpmask 16 /* set the protection mask */ 298c2ecf20Sopenharmony_ci#define __BN_readenv 17 /* read environment variables */ 308c2ecf20Sopenharmony_ci#define __BN_flash_chattr_range 18 318c2ecf20Sopenharmony_ci#define __BN_flash_erase_range 19 328c2ecf20Sopenharmony_ci#define __BN_flash_write_range 20 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_ci/* Calling conventions compatible to (uC)linux/68k 358c2ecf20Sopenharmony_ci * We use similar macros to call into the bootloader as for uClinux 368c2ecf20Sopenharmony_ci */ 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_ci#define __bsc_return(type, res) \ 398c2ecf20Sopenharmony_cido { \ 408c2ecf20Sopenharmony_ci if ((unsigned long)(res) >= (unsigned long)(-64)) { \ 418c2ecf20Sopenharmony_ci /* let errno be a function, preserve res in %d0 */ \ 428c2ecf20Sopenharmony_ci int __err = -(res); \ 438c2ecf20Sopenharmony_ci errno = __err; \ 448c2ecf20Sopenharmony_ci res = -1; \ 458c2ecf20Sopenharmony_ci } \ 468c2ecf20Sopenharmony_ci return (type)(res); \ 478c2ecf20Sopenharmony_ci} while (0) 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_ci#define _bsc0(type,name) \ 508c2ecf20Sopenharmony_citype name(void) \ 518c2ecf20Sopenharmony_ci{ \ 528c2ecf20Sopenharmony_ci register long __res __asm__ ("%d0") = __BN_##name; \ 538c2ecf20Sopenharmony_ci __asm__ __volatile__ ("trap #2" \ 548c2ecf20Sopenharmony_ci : "=g" (__res) \ 558c2ecf20Sopenharmony_ci : "0" (__res) \ 568c2ecf20Sopenharmony_ci ); \ 578c2ecf20Sopenharmony_ci __bsc_return(type,__res); \ 588c2ecf20Sopenharmony_ci} 598c2ecf20Sopenharmony_ci 608c2ecf20Sopenharmony_ci#define _bsc1(type,name,atype,a) \ 618c2ecf20Sopenharmony_citype name(atype a) \ 628c2ecf20Sopenharmony_ci{ \ 638c2ecf20Sopenharmony_ci register long __res __asm__ ("%d0") = __BN_##name; \ 648c2ecf20Sopenharmony_ci register long __a __asm__ ("%d1") = (long)a; \ 658c2ecf20Sopenharmony_ci __asm__ __volatile__ ("trap #2" \ 668c2ecf20Sopenharmony_ci : "=g" (__res) \ 678c2ecf20Sopenharmony_ci : "0" (__res), "d" (__a) \ 688c2ecf20Sopenharmony_ci ); \ 698c2ecf20Sopenharmony_ci __bsc_return(type,__res); \ 708c2ecf20Sopenharmony_ci} 718c2ecf20Sopenharmony_ci 728c2ecf20Sopenharmony_ci#define _bsc2(type,name,atype,a,btype,b) \ 738c2ecf20Sopenharmony_citype name(atype a, btype b) \ 748c2ecf20Sopenharmony_ci{ \ 758c2ecf20Sopenharmony_ci register long __res __asm__ ("%d0") = __BN_##name; \ 768c2ecf20Sopenharmony_ci register long __a __asm__ ("%d1") = (long)a; \ 778c2ecf20Sopenharmony_ci register long __b __asm__ ("%d2") = (long)b; \ 788c2ecf20Sopenharmony_ci __asm__ __volatile__ ("trap #2" \ 798c2ecf20Sopenharmony_ci : "=g" (__res) \ 808c2ecf20Sopenharmony_ci : "0" (__res), "d" (__a), "d" (__b) \ 818c2ecf20Sopenharmony_ci ); \ 828c2ecf20Sopenharmony_ci __bsc_return(type,__res); \ 838c2ecf20Sopenharmony_ci} 848c2ecf20Sopenharmony_ci 858c2ecf20Sopenharmony_ci#define _bsc3(type,name,atype,a,btype,b,ctype,c) \ 868c2ecf20Sopenharmony_citype name(atype a, btype b, ctype c) \ 878c2ecf20Sopenharmony_ci{ \ 888c2ecf20Sopenharmony_ci register long __res __asm__ ("%d0") = __BN_##name; \ 898c2ecf20Sopenharmony_ci register long __a __asm__ ("%d1") = (long)a; \ 908c2ecf20Sopenharmony_ci register long __b __asm__ ("%d2") = (long)b; \ 918c2ecf20Sopenharmony_ci register long __c __asm__ ("%d3") = (long)c; \ 928c2ecf20Sopenharmony_ci __asm__ __volatile__ ("trap #2" \ 938c2ecf20Sopenharmony_ci : "=g" (__res) \ 948c2ecf20Sopenharmony_ci : "0" (__res), "d" (__a), "d" (__b), \ 958c2ecf20Sopenharmony_ci "d" (__c) \ 968c2ecf20Sopenharmony_ci ); \ 978c2ecf20Sopenharmony_ci __bsc_return(type,__res); \ 988c2ecf20Sopenharmony_ci} 998c2ecf20Sopenharmony_ci 1008c2ecf20Sopenharmony_ci#define _bsc4(type,name,atype,a,btype,b,ctype,c,dtype,d) \ 1018c2ecf20Sopenharmony_citype name(atype a, btype b, ctype c, dtype d) \ 1028c2ecf20Sopenharmony_ci{ \ 1038c2ecf20Sopenharmony_ci register long __res __asm__ ("%d0") = __BN_##name; \ 1048c2ecf20Sopenharmony_ci register long __a __asm__ ("%d1") = (long)a; \ 1058c2ecf20Sopenharmony_ci register long __b __asm__ ("%d2") = (long)b; \ 1068c2ecf20Sopenharmony_ci register long __c __asm__ ("%d3") = (long)c; \ 1078c2ecf20Sopenharmony_ci register long __d __asm__ ("%d4") = (long)d; \ 1088c2ecf20Sopenharmony_ci __asm__ __volatile__ ("trap #2" \ 1098c2ecf20Sopenharmony_ci : "=g" (__res) \ 1108c2ecf20Sopenharmony_ci : "0" (__res), "d" (__a), "d" (__b), \ 1118c2ecf20Sopenharmony_ci "d" (__c), "d" (__d) \ 1128c2ecf20Sopenharmony_ci ); \ 1138c2ecf20Sopenharmony_ci __bsc_return(type,__res); \ 1148c2ecf20Sopenharmony_ci} 1158c2ecf20Sopenharmony_ci 1168c2ecf20Sopenharmony_ci#define _bsc5(type,name,atype,a,btype,b,ctype,c,dtype,d,etype,e) \ 1178c2ecf20Sopenharmony_citype name(atype a, btype b, ctype c, dtype d, etype e) \ 1188c2ecf20Sopenharmony_ci{ \ 1198c2ecf20Sopenharmony_ci register long __res __asm__ ("%d0") = __BN_##name; \ 1208c2ecf20Sopenharmony_ci register long __a __asm__ ("%d1") = (long)a; \ 1218c2ecf20Sopenharmony_ci register long __b __asm__ ("%d2") = (long)b; \ 1228c2ecf20Sopenharmony_ci register long __c __asm__ ("%d3") = (long)c; \ 1238c2ecf20Sopenharmony_ci register long __d __asm__ ("%d4") = (long)d; \ 1248c2ecf20Sopenharmony_ci register long __e __asm__ ("%d5") = (long)e; \ 1258c2ecf20Sopenharmony_ci __asm__ __volatile__ ("trap #2" \ 1268c2ecf20Sopenharmony_ci : "=g" (__res) \ 1278c2ecf20Sopenharmony_ci : "0" (__res), "d" (__a), "d" (__b), \ 1288c2ecf20Sopenharmony_ci "d" (__c), "d" (__d), "d" (__e) \ 1298c2ecf20Sopenharmony_ci ); \ 1308c2ecf20Sopenharmony_ci __bsc_return(type,__res); \ 1318c2ecf20Sopenharmony_ci} 1328c2ecf20Sopenharmony_ci 1338c2ecf20Sopenharmony_ci#endif /* __BOOTSTD_H__ */ 134