xref: /openbmc/qemu/linux-user/loader.h (revision d762bf97931b58839316b68a570eecc6143c9e3e)
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