aboutsummaryrefslogtreecommitdiff
path: root/backends/plugins/ds
diff options
context:
space:
mode:
authorTony Puccinelli2010-07-26 00:41:31 +0000
committerTony Puccinelli2010-07-26 00:41:31 +0000
commit4e530debd2b2cb79078b705792fc599d328d6c7c (patch)
treefd26aeb28a9d95d6a83c960fdca88dd80f4adde2 /backends/plugins/ds
parent95f66e6fb280a65702fdb932827f89d2c63b0cda (diff)
downloadscummvm-rg350-4e530debd2b2cb79078b705792fc599d328d6c7c.tar.gz
scummvm-rg350-4e530debd2b2cb79078b705792fc599d328d6c7c.tar.bz2
scummvm-rg350-4e530debd2b2cb79078b705792fc599d328d6c7c.zip
moved flushDataCache function from ds-loader.cpp to elf-loader.cpp and moved arm-relocations from ds-loader.cpp to arm-relocs.cpp; deleted ds-loader.cpp
svn-id: r51289
Diffstat (limited to 'backends/plugins/ds')
-rw-r--r--backends/plugins/ds/ds-loader.cpp143
1 files changed, 0 insertions, 143 deletions
diff --git a/backends/plugins/ds/ds-loader.cpp b/backends/plugins/ds/ds-loader.cpp
deleted file mode 100644
index 7dd27cfb4a..0000000000
--- a/backends/plugins/ds/ds-loader.cpp
+++ /dev/null
@@ -1,143 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-#include "backends/fs/ds/ds-fs.h"
-#include "../elf-loader.h"
-#include "dsmain.h"
-
-#define __DEBUG_PLUGINS__
-
-#ifdef __DEBUG_PLUGINS__
-#define DBG(x,...) consolePrintf(x, ## __VA_ARGS__)
-#else
-#define DBG(x,...)
-#endif
-
-#define seterror(x,...) consolePrintf(x, ## __VA_ARGS__)
-
-/**
- * Flushes the data cache.
- */
-void flushDataCache() {
- DC_FlushAll();
-}
-
-/**
- * Follow the instruction of a relocation section.
- *
- * @param DLFile SeekableReadStream of File
- * @param offset Offset into the File
- * @param size Size of relocation section
- *
- */
-bool dlRelocate(Common::SeekableReadStream* DLFile, unsigned long offset, unsigned long size, void *relSegment) {
- Elf32_Rel *rel = NULL; //relocation entry
-
- // Allocate memory for relocation table
- if (!(rel = (Elf32_Rel *)malloc(size))) {
- seterror("Out of memory.");
- return false;
- }
-
- // Read in our relocation table
- if (DLFile->seek(offset, SEEK_SET) < 0 ||
- DLFile->read(rel, size) != (ssize_t)size) {
- seterror("Relocation table load failed.");
- free(rel);
- return false;
- }
-
- // Treat each relocation entry. Loop over all of them
- int cnt = size / sizeof(*rel);
-
- DBG("Loaded relocation table. %d entries. base address=%p\n", cnt, relSegment);
-
- int a = 0;
- unsigned int relocation = 0;
-
- // Loop over relocation entries
- for (int i = 0; i < cnt; i++) {
-
- // Get the symbol this relocation entry is referring to
- Elf32_Sym *sym = (Elf32_Sym *)(_symtab) + (REL_INDEX(rel[i].r_info));
-
- // Get the target instruction in the code
- unsigned int *target = (unsigned int *)((char *)relSegment + rel[i].r_offset);
-
- unsigned int origTarget = *target; //Save for debugging
-
- // Act differently based on the type of relocation
- switch (REL_TYPE(rel[i].r_info)) {
-
- case R_ARM_ABS32:
- if (sym->st_shndx < SHN_LOPROC) { // Only shift for plugin section.
- a = *target; // Get full 32 bits of addend
- relocation = a + (Elf32_Addr)_segment; // Shift by main offset
-
- *target = relocation;
-
- DBG("R_ARM_ABS32: i=%d, a=%x, origTarget=%x, target=%x\n", i, a, origTarget, *target);
- }
- break;
-
- case R_ARM_THM_CALL:
- DBG("R_ARM_THM_CALL: PC-relative jump, ld takes care of necessary relocation work for us.\n");
- break;
-
- case R_ARM_CALL:
- DBG("R_ARM_CALL: PC-relative jump, ld takes care of necessary relocation work for us.\n");
- break;
-
- case R_ARM_JUMP24:
- DBG("R_ARM_JUMP24: PC-relative jump, ld takes care of all relocation work for us.\n");
- break;
-
- case R_ARM_TARGET1:
- if (sym->st_shndx < SHN_LOPROC) { // Only shift for plugin section.
- a = *target; // Get full 32 bits of addend
- relocation = a + (Elf32_Addr)_segment; // Shift by main offset
-
- *target = relocation;
-
- DBG("R_ARM_TARGET1: i=%d, a=%x, origTarget=%x, target=%x\n", i, a, origTarget, *target);
- DBG("Make sure --target1-abs is a flag to LD.\n");
- }
- break;
-
- case R_ARM_V4BX:
- DBG("R_ARM_V4BX: No relocation calculation necessary.\n");
- break;
-
- default:
- seterror("Unknown relocation type %d.", REL_TYPE(rel[i].r_info));
- free(rel);
- return false;
- }
-
- }
-
- free(rel);
- return true;
-}