13ad0a769SPeter Maydell /* 23ad0a769SPeter Maydell * loader.h: prototypes for linux-user guest binary loader 33ad0a769SPeter Maydell * 43ad0a769SPeter Maydell * This program is free software; you can redistribute it and/or modify 53ad0a769SPeter Maydell * it under the terms of the GNU General Public License as published by 63ad0a769SPeter Maydell * the Free Software Foundation; either version 2 of the License, or 73ad0a769SPeter Maydell * (at your option) any later version. 83ad0a769SPeter Maydell * 93ad0a769SPeter Maydell * This program is distributed in the hope that it will be useful, 103ad0a769SPeter Maydell * but WITHOUT ANY WARRANTY; without even the implied warranty of 113ad0a769SPeter Maydell * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 123ad0a769SPeter Maydell * GNU General Public License for more details. 133ad0a769SPeter Maydell * 143ad0a769SPeter Maydell * You should have received a copy of the GNU General Public License 153ad0a769SPeter Maydell * along with this program; if not, see <http://www.gnu.org/licenses/>. 163ad0a769SPeter Maydell */ 173ad0a769SPeter Maydell 183ad0a769SPeter Maydell #ifndef LINUX_USER_LOADER_H 193ad0a769SPeter Maydell #define LINUX_USER_LOADER_H 203ad0a769SPeter Maydell 217d2c5526SRichard Henderson typedef struct { 227d2c5526SRichard Henderson const void *cache; 237d2c5526SRichard Henderson unsigned int cache_size; 247d2c5526SRichard Henderson int fd; 257d2c5526SRichard Henderson } ImageSource; 267d2c5526SRichard Henderson 277d2c5526SRichard Henderson /** 287d2c5526SRichard Henderson * imgsrc_read: Read from ImageSource 297d2c5526SRichard Henderson * @dst: destination for read 307d2c5526SRichard Henderson * @offset: offset within file for read 317d2c5526SRichard Henderson * @len: size of the read 327d2c5526SRichard Henderson * @img: ImageSource to read from 337d2c5526SRichard Henderson * @errp: Error details. 347d2c5526SRichard Henderson * 357d2c5526SRichard Henderson * Read into @dst, using the cache when possible. 367d2c5526SRichard Henderson */ 377d2c5526SRichard Henderson bool imgsrc_read(void *dst, off_t offset, size_t len, 387d2c5526SRichard Henderson const ImageSource *img, Error **errp); 397d2c5526SRichard Henderson 407d2c5526SRichard Henderson /** 417d2c5526SRichard Henderson * imgsrc_read_alloc: Read from ImageSource 427d2c5526SRichard Henderson * @offset: offset within file for read 437d2c5526SRichard Henderson * @size: size of the read 447d2c5526SRichard Henderson * @img: ImageSource to read from 457d2c5526SRichard Henderson * @errp: Error details. 467d2c5526SRichard Henderson * 477d2c5526SRichard Henderson * Read into newly allocated memory, using the cache when possible. 487d2c5526SRichard Henderson */ 497d2c5526SRichard Henderson void *imgsrc_read_alloc(off_t offset, size_t len, 507d2c5526SRichard Henderson const ImageSource *img, Error **errp); 517d2c5526SRichard Henderson 527d2c5526SRichard Henderson /** 537d2c5526SRichard Henderson * imgsrc_mmap: Map from ImageSource 547d2c5526SRichard Henderson * 557d2c5526SRichard Henderson * If @src has a file descriptor, pass on to target_mmap. Otherwise, 567d2c5526SRichard Henderson * this is "mapping" from a host buffer, which resolves to memcpy. 577d2c5526SRichard Henderson * Therefore, flags must be MAP_PRIVATE | MAP_FIXED; the argument is 587d2c5526SRichard Henderson * retained for clarity. 597d2c5526SRichard Henderson */ 607d2c5526SRichard Henderson abi_long imgsrc_mmap(abi_ulong start, abi_ulong len, int prot, 617d2c5526SRichard Henderson int flags, const ImageSource *src, abi_ulong offset); 627d2c5526SRichard Henderson 633ad0a769SPeter Maydell /* 643ad0a769SPeter Maydell * Read a good amount of data initially, to hopefully get all the 653ad0a769SPeter Maydell * program headers loaded. 663ad0a769SPeter Maydell */ 673ad0a769SPeter Maydell #define BPRM_BUF_SIZE 1024 683ad0a769SPeter Maydell 693ad0a769SPeter Maydell /* 703ad0a769SPeter Maydell * This structure is used to hold the arguments that are 713ad0a769SPeter Maydell * used when loading binaries. 723ad0a769SPeter Maydell */ 733ad0a769SPeter Maydell struct linux_binprm { 743ad0a769SPeter Maydell char buf[BPRM_BUF_SIZE] __attribute__((aligned)); 757d2c5526SRichard Henderson ImageSource src; 763ad0a769SPeter Maydell abi_ulong p; 773ad0a769SPeter Maydell int e_uid, e_gid; 783ad0a769SPeter Maydell int argc, envc; 793ad0a769SPeter Maydell char **argv; 803ad0a769SPeter Maydell char **envp; 813ad0a769SPeter Maydell char *filename; /* Name of binary */ 823ad0a769SPeter Maydell int (*core_dump)(int, const CPUArchState *); /* coredump routine */ 833ad0a769SPeter Maydell }; 843ad0a769SPeter Maydell 853ad0a769SPeter Maydell void do_init_thread(struct target_pt_regs *regs, struct image_info *infop); 863ad0a769SPeter Maydell abi_ulong loader_build_argptr(int envc, int argc, abi_ulong sp, 873ad0a769SPeter Maydell abi_ulong stringp, int push_ptr); 883ad0a769SPeter Maydell int loader_exec(int fdexec, const char *filename, char **argv, char **envp, 893ad0a769SPeter Maydell struct target_pt_regs *regs, struct image_info *infop, 903ad0a769SPeter Maydell struct linux_binprm *); 913ad0a769SPeter Maydell 923ad0a769SPeter Maydell uint32_t get_elf_eflags(int fd); 933ad0a769SPeter Maydell int load_elf_binary(struct linux_binprm *bprm, struct image_info *info); 943ad0a769SPeter Maydell int load_flt_binary(struct linux_binprm *bprm, struct image_info *info); 953ad0a769SPeter Maydell 963ad0a769SPeter Maydell abi_long memcpy_to_target(abi_ulong dest, const void *src, 973ad0a769SPeter Maydell unsigned long len); 983ad0a769SPeter Maydell 993ad0a769SPeter Maydell extern unsigned long guest_stack_size; 1003ad0a769SPeter Maydell 101a55b9e72SHelge Deller #if defined(TARGET_S390X) || defined(TARGET_AARCH64) || defined(TARGET_ARM) 102e1b819c8SIlya Leoshkevich uint32_t get_elf_hwcap(void); 103e19807beSIlya Leoshkevich const char *elf_hwcap_str(uint32_t bit); 104e1b819c8SIlya Leoshkevich #endif 105a55b9e72SHelge Deller #if defined(TARGET_AARCH64) || defined(TARGET_ARM) 106*63c1b7deSPeter Maydell uint64_t get_elf_hwcap2(void); 107a55b9e72SHelge Deller const char *elf_hwcap2_str(uint32_t bit); 108a55b9e72SHelge Deller #endif 109e1b819c8SIlya Leoshkevich 1103ad0a769SPeter Maydell #endif /* LINUX_USER_LOADER_H */ 111