qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH 17/18] instrument: Add PLVL point


From: Lluís
Subject: [Qemu-devel] [PATCH 17/18] instrument: Add PLVL point
Date: Tue, 19 Oct 2010 23:36:47 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.0.50 (gnu/linux)

Signed-off-by: Lluís Vilanova <address@hidden>
---
 instrument/examples/dynprint/guest/test.c          |    1 +
 .../examples/dynprint/host/instrument-host.h       |   21 ++++++++++++++++---
 instrument/host-stub.h                             |    7 ++++++
 3 files changed, 25 insertions(+), 4 deletions(-)

diff --git a/instrument/examples/dynprint/guest/test.c 
b/instrument/examples/dynprint/guest/test.c
index b6b5788..ce43a48 100644
--- a/instrument/examples/dynprint/guest/test.c
+++ b/instrument/examples/dynprint/guest/test.c
@@ -31,6 +31,7 @@ main ()
     int i;
 
     BACKDOOR_i8(0x01);                  /* enable instrumentation */
+    BACKDOOR_i8_V(0x01, INSTR_TYPE_USER);
 
     printf("start\n");
     BACKDOOR_i8_V(0x01, INSTR_TYPE_PC); /* show executed PCs */
diff --git a/instrument/examples/dynprint/host/instrument-host.h 
b/instrument/examples/dynprint/host/instrument-host.h
index 30eb7d4..24b6ece 100644
--- a/instrument/examples/dynprint/host/instrument-host.h
+++ b/instrument/examples/dynprint/host/instrument-host.h
@@ -32,6 +32,7 @@ typedef enum {
                          * global state of tracing is wasteful, but hey, this 
is
                          * just an example.
                          */
+    INSTR_TYPE_USER,    /* Executing at user-level                           */
     INSTR_TYPE_PC,      /* Print fetched PC                                  */
     INSTR_TYPE_ALL,     /* Print all instruction information                 */
     INSTR_TYPE_COUNT    /* Total number of instrumentation types (mandatory) */
@@ -41,10 +42,10 @@ typedef enum {
 #define INSTR_GEN_FETCH(taddr, addr, tlength, length,                   \
                         tused, used, tdefined, defined)                 \
     do {                                                                \
-        if (INSTR_TYPE(ENABLED) && INSTR_TYPE(PC)) {                    \
+        if (INSTR_TYPE(ENABLED) && INSTR_TYPE(PC) && INSTR_TYPE(USER)) { \
             INSTR_GEN_1(pc, taddr, addr);                               \
         }                                                               \
-        if (INSTR_TYPE(ENABLED) && INSTR_TYPE(ALL)) {                   \
+        if (INSTR_TYPE(ENABLED) && INSTR_TYPE(ALL) && INSTR_TYPE(USER)) { \
             INSTR_GEN_4(all_fetch, taddr, addr, tlength, length,        \
                         tused, used, tdefined, defined);                \
         }                                                               \
@@ -52,7 +53,7 @@ typedef enum {
 
 #define INSTR_GEN_VMEM(taddr, addr, tlength, length, tmode, mode)       \
     do {                                                                \
-        if (INSTR_TYPE(ENABLED) && INSTR_TYPE(ALL)) {                   \
+        if (INSTR_TYPE(ENABLED) && INSTR_TYPE(ALL) && INSTR_TYPE(USER)) { \
             INSTR_GEN_3(all_mem, taddr, addr, tlength, length,          \
                         tmode, mode);                                   \
         }                                                               \
@@ -60,9 +61,21 @@ typedef enum {
 
 #define INSTR_DO_VMEM(cpu, addr, length, mode)                          \
     do {                                                                \
-        if (INSTR_TYPE(ENABLED) && INSTR_TYPE(ALL)) {                   \
+        if (INSTR_TYPE(ENABLED) && INSTR_TYPE(ALL) && INSTR_TYPE(USER)) { \
             helper_all_mem_direct(addr, length, mode);                  \
         }                                                               \
     } while (0)
 
+#define INSTR_DO_PLVL(cpu, plvl)                        \
+    do {                                                \
+        if (INSTR_CPU_TYPE(cpu, ENABLED)) {             \
+            if (plvl == 0) {                            \
+                instr_disable_type(INSTR_TYPE_USER);    \
+            }                                           \
+            else{                                       \
+                instr_enable_type(INSTR_TYPE_USER);     \
+            }                                           \
+        }                                               \
+    } while (0)
+
 #endif /* INSTRUMENT_HOST_H */
diff --git a/instrument/host-stub.h b/instrument/host-stub.h
index bfe5b06..5cba4f2 100644
--- a/instrument/host-stub.h
+++ b/instrument/host-stub.h
@@ -71,4 +71,11 @@ typedef enum {
  */
 #define INSTR_DO_VMEM(cpu, addr, length, mode)
 
+/** Signal a privilege level change.
+ * This is called before actually changing the privilege level.
+ * @param cpu  CPU performing the operation (CPUState*)
+ * @param plvl New value for the privilege level (uint32_t)
+ */
+#define INSTR_DO_PLVL(cpu, plvl)
+
 #endif /* INSTRUMENT__HOST_STUB_H */
-- 
1.7.1

-- 
 "And it's much the same thing with knowledge, for whenever you learn
 something new, the whole world becomes that much richer."
 -- The Princess of Pure Reason, as told by Norton Juster in The Phantom
 Tollbooth



reply via email to

[Prev in Thread] Current Thread [Next in Thread]