Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


minor updates
[palacios.git] / palacios / include / palacios / vmm_util.h
index 95a0c8e..38ae086 100644 (file)
@@ -38,7 +38,7 @@ struct VMM_GPRs {
 
 
 void PrintTraceHex(unsigned char x);
-
+void PrintTraceLL(ullong_t num);
 void PrintTraceMemDump(unsigned char * start, int n);
 
 
@@ -97,19 +97,38 @@ void PrintTraceMemDump(unsigned char * start, int n);
  * This ends up being the most efficient "calling
  * convention" on x86.
  */
-#define do_div(n,base) ({ \
-       unsigned long __upper, __low, __high, __mod, __base; \
-       __base = (base); \
-       asm("":"=a" (__low), "=d" (__high):"A" (n)); \
-       __upper = __high; \
-       if (__high) { \
-               __upper = __high % (__base); \
-               __high = __high / (__base); \
-       } \
-       asm("divl %2":"=a" (__low), "=d" (__mod):"rm" (__base), "0" (__low), "1" (__upper)); \
-       asm("":"=A" (n):"a" (__low),"d" (__high)); \
-       __mod; \
-})
+#define do_div(n,base) ({                                   \
+      unsigned long __upper, __low, __high, __mod, __base;   \
+      __base = (base);                                      \
+      asm("":"=a" (__low), "=d" (__high):"A" (n));          \
+      __upper = __high;                                             \
+      if (__high) {                                         \
+       __upper = __high % (__base);                         \
+       __high = __high / (__base);                          \
+      }                                                                        \
+      asm("divl %2":"=a" (__low), "=d" (__mod):"rm" (__base), "0" (__low), "1" (__upper)); \
+      asm("":"=A" (n):"a" (__low),"d" (__high));                       \
+      __mod;                                                           \
+    })
+
+
+
+/* This divides two 64bit unsigned ints
+ * The previous version only allows 32 bit bases(?)...
+ * 
+ * NOTE: This absolutely sucks... there has to be a better way....
+ */
+#define do_divll(n, base) ({                           \
+      ullong_t __rem = 0;                              \
+      ullong_t __num = 0;                              \
+      while (n > base) {                               \
+       __num++;                                        \
+       n -= base;                                      \
+      }                                                        \
+      __rem = n;                                       \
+      n = __num;                                       \
+      __rem;                                           \
+    })                                         
 
 #endif
 
@@ -117,4 +136,6 @@ void PrintTraceMemDump(unsigned char * start, int n);
 
 
 
+
+
 #endif