36 #include "loader/elf32.h"
37 #include "loader/cle.h"
38 #include "loader/cmod.h"
40 #include "lib/malloc.h"
42 #include "lib/assert.h"
45 #define PRINTF(...) do {} while (0)
47 #define PRINTF(...) printf(__VA_ARGS__)
51 #define CMOD_NMODULES 4
53 struct cmod_info cmod_module[CMOD_NMODULES];
56 cmod_load(
unsigned imod,
58 int (*pread)(
void *,
int, off_t),
65 if(imod >= CMOD_NMODULES) {
66 PRINTF(
"imod to large");
70 if(cmod_module[imod].ram !=
NULL || cmod_module[imod].fini !=
NULL) {
71 PRINTF(
"module busy\n");
76 ret = cle_read_info(&h, pread, off);
79 strcpy(scratch, h.name);
83 cmod_module[imod].ram = malloc(h.datasize + h.bsssize + h.textsize);
84 if(cmod_module[imod].ram ==
NULL) {
85 return CMOD_DATA_TO_LARGE;
91 h.data = cmod_module[imod].ram;
92 h.bss = h.data + h.datasize;
93 h.text = (cle_addr)h.bss + h.bsssize;
95 PRINTF(
"cmod: copy text segment to RAM %p %p\n",
96 h.text, h.text + h.textsize);
97 ret = pread((
void *)h.text, h.textsize, off + h.textoff);
99 if(h.textrelasize > 0) {
100 PRINTF(
"cmod: relocate text in RAM\n");
101 ret = cle_relocate(&h,
105 h.textrelaoff, h.textrelasize);
107 strcpy(scratch, h.name);
112 PRINTF(
"cmod: copy data segment to RAM %p %p\n",
113 h.data, h.data + h.datasize);
114 ret = pread(h.data, h.datasize, off + h.dataoff);
116 if(h.datarelasize > 0) {
117 PRINTF(
"cmod: relocate data segment\n");
118 ret = cle_relocate(&h,
122 h.datarelaoff, h.datarelasize);
124 strcpy(scratch, h.name);
129 PRINTF(
"cmod: zero bss %p %p\n", h.bss, h.bss + h.bsssize);
130 memset(h.bss, 0, h.bsssize);
132 cmod_module[imod].fini = cle_lookup(&h, pread, off,
"_fini");
133 init = cle_lookup(&h, pread, off,
"_init");
136 PRINTF(
"init=%p fini=%p\n", init, cmod_module[imod].fini);
140 return CMOD_NO_STARTPOINT;
144 cmod_unload(
int imod)
146 if(cmod_module[imod].fini !=
NULL) {
147 (*cmod_module[imod].fini)();
148 cmod_module[imod].fini =
NULL;
150 if(cmod_module[imod].ram !=
NULL) {
151 free(cmod_module[imod].ram);
152 cmod_module[imod].ram =
NULL;
161 PRINTF(
"Id Module Address Fini\n");
162 for(i = 0; i < CMOD_NMODULES; i++)
163 if(cmod_module[i].ram !=
NULL)
164 PRINTF(
"%2d %-8s %7p %4p\n", i,
165 cmod_module[i].name, cmod_module[i].ram, cmod_module[i].fini);
#define NULL
The null pointer.