about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorFabrice Desclaux <fabrice.desclaux@cea.fr>2014-10-09 17:04:19 +0200
committerFabrice Desclaux <fabrice.desclaux@cea.fr>2014-10-09 17:04:19 +0200
commit59ef1b1d854cac3e94cd4565a0ac750de9a4c92d (patch)
tree7325c13af164828bc9f4b4e251dbb8de7e982462
parent19ff9643d73b6c95a202f24b62b24871555b3797 (diff)
downloadmiasm-59ef1b1d854cac3e94cd4565a0ac750de9a4c92d.tar.gz
miasm-59ef1b1d854cac3e94cd4565a0ac750de9a4c92d.zip
Jitter: add endianess support
-rw-r--r--miasm2/jitter/vm_mngr.c47
-rw-r--r--miasm2/jitter/vm_mngr.h12
-rw-r--r--miasm2/jitter/vm_mngr_py.c22
3 files changed, 60 insertions, 21 deletions
diff --git a/miasm2/jitter/vm_mngr.c b/miasm2/jitter/vm_mngr.c
index 6caf7a15..950528f9 100644
--- a/miasm2/jitter/vm_mngr.c
+++ b/miasm2/jitter/vm_mngr.c
@@ -52,6 +52,29 @@ struct memory_breakpoint_info_head memory_breakpoint_pool;
 
 
 
+uint16_t set_endian16(vm_mngr_t* vm_mngr, uint16_t val)
+{
+	if (vm_mngr->sex == __BYTE_ORDER)
+		return val;
+	else
+		return Endian16_Swap(val);
+}
+
+uint32_t set_endian32(vm_mngr_t* vm_mngr, uint32_t val)
+{
+	if (vm_mngr->sex == __BYTE_ORDER)
+		return val;
+	else
+		return Endian32_Swap(val);
+}
+
+uint64_t set_endian64(vm_mngr_t* vm_mngr, uint64_t val)
+{
+	if (vm_mngr->sex == __BYTE_ORDER)
+		return val;
+	else
+		return Endian64_Swap(val);
+}
 
 
 void print_val(uint64_t base, uint64_t addr)
@@ -171,15 +194,15 @@ static uint64_t memory_page_read(vm_mngr_t* vm_mngr, unsigned int my_size, uint6
 			break;
 		case 16:
 			ret = *((unsigned short*)addr)&0xFFFF;
-			ret = Endian16_Swap(ret);
+			ret = set_endian16(vm_mngr, ret);
 			break;
 		case 32:
 			ret = *((unsigned int*)addr)&0xFFFFFFFF;
-			ret = Endian32_Swap(ret);
+			ret = set_endian32(vm_mngr, ret);
 			break;
 		case 64:
 			ret = *((uint64_t*)addr)&0xFFFFFFFFFFFFFFFFULL;
-			ret = Endian64_Swap(ret);
+			ret = set_endian64(vm_mngr, ret);
 			break;
 		default:
 			exit(0);
@@ -207,13 +230,13 @@ static uint64_t memory_page_read(vm_mngr_t* vm_mngr, unsigned int my_size, uint6
 			ret = ret;
 			break;
 		case 16:
-			ret = Endian16_Swap(ret);
+			ret = set_endian16(vm_mngr, ret);
 			break;
 		case 32:
-			ret = Endian32_Swap(ret);
+			ret = set_endian32(vm_mngr, ret);
 			break;
 		case 64:
-			ret = Endian64_Swap(ret);
+			ret = set_endian64(vm_mngr, ret);
 			break;
 		default:
 			exit(0);
@@ -257,15 +280,15 @@ static void memory_page_write(vm_mngr_t* vm_mngr, unsigned int my_size,
 			*((unsigned char*)addr) = src&0xFF;
 			break;
 		case 16:
-			src = Endian16_Swap(src);
+			src = set_endian16(vm_mngr, src);
 			*((unsigned short*)addr) = src&0xFFFF;
 			break;
 		case 32:
-			src = Endian32_Swap(src);
+			src = set_endian32(vm_mngr, src);
 			*((unsigned int*)addr) = src&0xFFFFFFFF;
 			break;
 		case 64:
-			src = Endian64_Swap(src);
+			src = set_endian64(vm_mngr, src);
 			*((uint64_t*)addr) = src&0xFFFFFFFFFFFFFFFFULL;
 			break;
 		default:
@@ -283,13 +306,13 @@ static void memory_page_write(vm_mngr_t* vm_mngr, unsigned int my_size,
 			src = src;
 			break;
 		case 16:
-			src = Endian16_Swap(src);
+			src = set_endian16(vm_mngr, src);
 			break;
 		case 32:
-			src = Endian32_Swap(src);
+			src = set_endian32(vm_mngr, src);
 			break;
 		case 64:
-			src = Endian64_Swap(src);
+			src = set_endian64(vm_mngr, src);
 			break;
 		default:
 			exit(0);
diff --git a/miasm2/jitter/vm_mngr.h b/miasm2/jitter/vm_mngr.h
index 2bf23f37..deb56042 100644
--- a/miasm2/jitter/vm_mngr.h
+++ b/miasm2/jitter/vm_mngr.h
@@ -22,7 +22,6 @@
 #define __BYTE_ORDER __BYTE_ORDER__
 #endif
 
-#if __BYTE_ORDER == __BIG_ENDIAN
 #define Endian16_Swap(value) \
       ((((uint16_t)((value) & 0x00FF)) << 8) | \
        (((uint16_t)((value) & 0xFF00)) >> 8))
@@ -42,13 +41,6 @@
 	 ((((uint64_t)value)>>24) & 0x0000000000FF0000ULL)  |	      \
 	 ((((uint64_t)value)>>40) & 0x000000000000FF00ULL)  |	      \
 	 ((((uint64_t)value)>>56) & 0x00000000000000FFULL))
-#else
-#define Endian16_Swap(value) (value)
-
-#define Endian32_Swap(value) (value)
-
-#define Endian64_Swap(value) (value)
-#endif
 
 
 
@@ -66,9 +58,11 @@ LIST_HEAD(memory_breakpoint_info_head, memory_breakpoint_info);
 #define MAX_MEMORY_PAGE_POOL_TAB 0x100000
 #define MEMORY_PAGE_POOL_MASK_BIT 12
 #define PAGE_SIZE (1<<MEMORY_PAGE_POOL_MASK_BIT)
+#define VM_BIG_ENDIAN 1
+#define VM_LITTLE_ENDIAN 2
 
 typedef struct {
-
+	int sex;
 	struct memory_page_list_head memory_page_pool;
 	struct code_bloc_list_head code_bloc_pool;
 	struct memory_breakpoint_info_head memory_breakpoint_pool;
diff --git a/miasm2/jitter/vm_mngr_py.c b/miasm2/jitter/vm_mngr_py.c
index 1462050b..474c974e 100644
--- a/miasm2/jitter/vm_mngr_py.c
+++ b/miasm2/jitter/vm_mngr_py.c
@@ -705,6 +705,23 @@ PyObject* vm_set_addr2obj(VmMngr* self, PyObject* args)
 }
 
 
+static PyObject *
+vm_set_big_endian(VmMngr *self, PyObject *value, void *closure)
+{
+	self->vm_mngr.sex   = __BIG_ENDIAN;
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+static PyObject *
+vm_set_little_endian(VmMngr *self, PyObject *value, void *closure)
+{
+	self->vm_mngr.sex   = __LITTLE_ENDIAN;
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+
 
 /*
 PyObject* add_jitbloc(VmMngr* self, PyObject* args)
@@ -816,6 +833,11 @@ static PyMethodDef VmMngr_methods[] = {
 	{"get_last_write_size",(PyCFunction)vm_get_last_write_size, METH_VARARGS,
 	 "X"},
 
+	{"set_big_endian",(PyCFunction)vm_set_big_endian, METH_VARARGS,
+	 "X"},
+	{"set_little_endian",(PyCFunction)vm_set_little_endian, METH_VARARGS,
+	 "X"},
+
 	{NULL}  /* Sentinel */
 };