PS2SDK
PS2 Homebrew Libraries
Loading...
Searching...
No Matches
elf_loader_common.h
1/*
2# _____ ___ ____ ___ ____
3# ____| | ____| | | |____|
4# | ___| |____ ___| ____| | \ PS2DEV Open Source Project.
5#-----------------------------------------------------------------------
6# Copyright ps2dev - http://www.ps2dev.org
7# Licenced under Academic Free License version 2.0
8# Review ps2sdk README & LICENSE files for further details.
9*/
10
11#ifndef __ELF_LOADER_COMMON_H__
12#define __ELF_LOADER_COMMON_H__
13
14#include <elf-loader.h>
15#include <stddef.h>
16#include <tamtypes.h>
17
18#ifdef __cplusplus
19extern "C"
20{
21#endif
22
23#define ELF_LOADER_MAX_PROGRAM_HEADERS 32
24
26 {
27 u8 e_ident[16];
28 u16 e_type;
29 u16 e_machine;
30 u32 e_version;
31 u32 e_entry;
32 u32 e_phoff;
33 u32 e_shoff;
34 u32 e_flags;
35 u16 e_ehsize;
36 u16 e_phentsize;
37 u16 e_phnum;
38 u16 e_shentsize;
39 u16 e_shnum;
40 u16 e_shstrndx;
42
44 {
45 u32 p_type;
46 u32 p_offset;
47 u32 p_vaddr;
48 u32 p_paddr;
49 u32 p_filesz;
50 u32 p_memsz;
51 u32 p_flags;
52 u32 p_align;
54
55 // dest_addr != 0, src_addr != 0, size != 0: move
56 // dest_addr != 0, src_addr == 0, size != 0: zero
57 // dest_addr != 0, size == 0: exec
59 {
60 void *dest_addr;
61 void *src_addr;
62 u32 size;
64
65#define ELF_LOADER_MAX_LOADERINFO_ITEMS (ELF_LOADER_MAX_PROGRAM_HEADERS + 3)
66
68 {
69 elf_loader_loaderinfo_item_t items[ELF_LOADER_MAX_LOADERINFO_ITEMS];
71
72 typedef struct elf_loader_arginfo_
73 {
74 int argc;
75 char *argv[16];
76 char payload[256];
78
79 typedef struct elf_loader_execinfo_
80 {
82 elf_loader_loaderinfo_t loaderinfo;
84
86 {
87 void *m_segment_addr;
88 int m_segment_offset;
89 size_t m_segment_size;
91
92 typedef enum elf_loader_reader_stage_
93 {
94 ELF_LOADER_READER_STAGE_ELF_HEADER,
95 ELF_LOADER_READER_STAGE_PROGRAM_HEADERS,
96 ELF_LOADER_READER_STAGE_SEGMENTS,
97 ELF_LOADER_READER_STAGE_END,
98 } elf_loader_reader_stage_t;
99
100 typedef void *(*elf_loader_reader_allocation_callback_t)(
101 void *userdata, void *pointer, ptrdiff_t old_size, ptrdiff_t new_size);
102 typedef int (*elf_loader_reader_read_callback_t)(
103 void *userdata,
104 elf_loader_reader_stage_t stage,
105 const elf_loader_reader_segment_info_t *segm_info,
106 size_t segm_count);
107 typedef void (*elf_loader_reader_result_callback_t)(
108 void *userdata, void *pointer, ptrdiff_t pointer_size, int errval);
110 {
111 void *m_userdata;
112 elf_loader_reader_allocation_callback_t m_alloc_callback;
113 elf_loader_reader_read_callback_t m_read_callback;
114 elf_loader_reader_result_callback_t m_result_callback;
116
118 {
119 void *m_buf;
120 ptrdiff_t m_bufsize;
121 int m_result;
123
124 // Defined in elf.c
125 extern int elf_loader_is_elf_ehdr_valid(const elf_loader_elf32_ehdr_t *ehdr);
126 extern int elf_loader_is_elf_valid_for_loading(const void *buf, size_t buf_size);
127 extern int elf_loader_exec_elf_prepare_loadinfo(elf_loader_execinfo_t *execinfo, const void *buf, size_t buf_size);
128 extern int elf_loader_exec_elf_prepare_arginfo(
129 elf_loader_execinfo_t *execinfo, const char *filename, const char *partition, int argc, char *argv[]);
130 extern int elf_loader_exec_elf(elf_loader_execinfo_t *execinfo);
131
132 // Defined in elf_loader_reader.c
133 extern void elf_loader_reader_read_elf_file(elf_loader_reader_info_t *info);
134
135 // Defined in elf_loader_stdio.c
136 extern int elf_loader_reader_read_elf_file_stdio(
137 elf_loader_reader_info_stdio_resultbuf_t *resultbuf, const char *filename, const char *flags);
138
139#ifdef __cplusplus
140}
141#endif
142
143#endif /* __ELF_LOADER_COMMON_H__ */