63 kprintf(
"kmod_add: unable to allocate memory!\n");
80 elfHeader *binaryHeader = 0x0;
81 elfProgramHeader *programHeader = 0x0;
82 elfSectionHeader *sectionHeader = 0x0;
83 elfDynSym *relSymTab = 0x0;
84 elfPltInfo *elfRel = 0x0;
87 kmod_fd =
fopen(kmod_file,
"rb");
89 kprintf(
"Can not open %s\n", kmod_file);
94 fseek(kmod_fd, 0x0, 0x0);
95 binaryHeader = (elfHeader *)
kmalloc(
sizeof(elfHeader));
96 if (binaryHeader == 0x0) {
97 kprintf(
"kmod: out of memory\n");
102 fread(binaryHeader,
sizeof(elfHeader), 1, kmod_fd);
104 programHeader = (elfProgramHeader *)
kmalloc(
sizeof(elfProgramHeader) * binaryHeader->ePhnum);
106 fseek(kmod_fd, binaryHeader->ePhoff, 0);
107 fread(programHeader,
sizeof(elfSectionHeader), binaryHeader->ePhnum, kmod_fd);
109 sectionHeader = (elfSectionHeader *)
kmalloc(
sizeof(elfSectionHeader) * binaryHeader->eShnum);
111 fseek(kmod_fd, binaryHeader->eShoff, 0);
112 fread(sectionHeader,
sizeof(elfSectionHeader), binaryHeader->eShnum, kmod_fd);
114 shStr = (
char *)
kmalloc(sectionHeader[binaryHeader->eShstrndx].shSize);
115 fseek(kmod_fd, sectionHeader[binaryHeader->eShstrndx].shOffset, 0);
116 fread(shStr, sectionHeader[binaryHeader->eShstrndx].shSize, 1, kmod_fd);
118 for (i = 0; i < binaryHeader->ePhnum; i++) {
119 switch (programHeader[i].phType) {
122 newLoc = (
char *) programHeader[i].phVaddr +
LD_START;
127 for (x = 0; x < ((programHeader[i].phMemsz) + 4095); x += 0x1000) {
130 kpanic(
"vmmRemapPage: ld\n");
131 memset((
void *) ((programHeader[i].phVaddr & 0xFFFFF000) + x +
LD_START), 0x0, 0x1000);
134 fseek(kmod_fd, programHeader[i].phOffset, 0x0);
135 fread(newLoc, programHeader[i].phFilesz, 1, kmod_fd);
147 kprintf(
"Unhandled Header : %08x\n", programHeader[i].phType);
152 for (i = 0x0; i < binaryHeader->eShnum; i++) {
153 switch (sectionHeader[i].shType) {
155 if (!
strcmp((shStr + sectionHeader[i].shName),
".dynstr")) {
156 dynStr = (
char *)
kmalloc(sectionHeader[i].shSize);
157 fseek(kmod_fd, sectionHeader[i].shOffset, 0x0);
158 fread(dynStr, sectionHeader[i].shSize, 1, kmod_fd);
162 elfRel = (elfPltInfo *)
kmalloc(sectionHeader[i].shSize);
163 fseek(kmod_fd, sectionHeader[i].shOffset, 0x0);
164 fread(elfRel, sectionHeader[i].shSize, 1, kmod_fd);
166 for (x = 0x0; x < sectionHeader[i].shSize /
sizeof(elfPltInfo); x++) {
181 kprintf(
"relTab [%s][0x%X][0x%X]\n", dynStr + relSymTab[rel].dynName, relSymTab[rel].dynValue, relSymTab[rel].dynName);
188 relSymTab = (elfDynSym *)
kmalloc(sectionHeader[i].shSize);
189 fseek(kmod_fd, sectionHeader[i].shOffset, 0x0);
190 fread(relSymTab, sectionHeader[i].shSize, 1, kmod_fd);
196 i = binaryHeader->eEntry +
LD_START;
201 kfree(sectionHeader);
202 kfree(programHeader);