[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] PDB 0.3
ChangeSet 1.1666.1.1, 2005/06/03 22:17:48+01:00, ach61@xxxxxxxxxxxxxxxxxxxxxx PDB 0.3 tools/libxc/Makefile | 3 tools/libxc/list.h | 186 ++++++ tools/libxc/xc_debug.c | 580 ++++++++++++++++++++ tools/libxc/xc_debug.h | 76 ++ tools/pdb/Domain.ml | 63 ++ tools/pdb/Domain.mli | 38 + tools/pdb/Intel.ml | 71 ++ tools/pdb/Makefile | 54 + tools/pdb/OCamlMakefile | 1149 +++++++++++++++++++++++++++++++++++++++++ tools/pdb/PDB.ml | 180 ++++++ tools/pdb/Process.ml | 39 + tools/pdb/Process.mli | 20 tools/pdb/Util.ml | 153 +++++ tools/pdb/debugger.ml | 315 +++++++++++ tools/pdb/evtchn.ml | 32 + tools/pdb/evtchn.mli | 14 tools/pdb/pdb_caml_xc.c | 732 ++++++++++++++++++++++++++ tools/pdb/pdb_xen.c | 93 +++ tools/pdb/server.ml | 219 +++++++ xen/Rules.mk | 5 xen/include/asm-x86/debugger.h | 44 + xen/include/public/xen.h | 1 22 files changed, 4066 insertions(+), 1 deletion(-) diff -Nru a/tools/libxc/Makefile b/tools/libxc/Makefile --- a/tools/libxc/Makefile 2005-06-04 03:01:59 -04:00 +++ b/tools/libxc/Makefile 2005-06-04 03:01:59 -04:00 @@ -17,6 +17,7 @@ SRCS += xc_bvtsched.c SRCS += xc_core.c SRCS += xc_domain.c +SRCS += xc_debug.c SRCS += xc_evtchn.c SRCS += xc_gnttab.c SRCS += xc_linux_build.c @@ -93,7 +94,7 @@ mv staging/i386/*.rpm . rm -rf staging -libxc.a: $(LIB_OBJS) +libxc.a: $(OBJS) $(AR) rc $@ $^ libxc.so: libxc.so.$(MAJOR) diff -Nru a/tools/libxc/list.h b/tools/libxc/list.h --- /dev/null Wed Dec 31 16:00:00 196900 +++ b/tools/libxc/list.h 2005-06-04 03:01:59 -04:00 @@ -0,0 +1,186 @@ +#ifndef _LINUX_LIST_H +#define _LINUX_LIST_H + +/* + * Simple doubly linked list implementation. + * + * Some of the internal functions ("__xxx") are useful when + * manipulating whole lists rather than single entries, as + * sometimes we already know the next/prev entries and we can + * generate better code by using them directly rather than + * using the generic single-entry routines. + */ + +struct list_head { + struct list_head *next, *prev; +}; + +#define LIST_HEAD_INIT(name) { &(name), &(name) } + +#define LIST_HEAD(name) \ + struct list_head name = LIST_HEAD_INIT(name) + +#define INIT_LIST_HEAD(ptr) do { \ + (ptr)->next = (ptr); (ptr)->prev = (ptr); \ +} while (0) + +/* + * Insert a new entry between two known consecutive entries. + * + * This is only for internal list manipulation where we know + * the prev/next entries already! + */ +static __inline__ void __list_add(struct list_head * new, + struct list_head * prev, + struct list_head * next) +{ + next->prev = new; + new->next = next; + new->prev = prev; + prev->next = new; +} + +/** + * list_add - add a new entry + * @new: new entry to be added + * @head: list head to add it after + * + * Insert a new entry after the specified head. + * This is good for implementing stacks. + */ +static __inline__ void list_add(struct list_head *new, struct list_head *head) +{ + __list_add(new, head, head->next); +} + +/** + * list_add_tail - add a new entry + * @new: new entry to be added + * @head: list head to add it before + * + * Insert a new entry before the specified head. + * This is useful for implementing queues. + */ +static __inline__ void list_add_tail(struct list_head *new, struct list_head *head) +{ + __list_add(new, head->prev, head); +} + +/* + * Delete a list entry by making the prev/next entries + * point to each other. + * + * This is only for internal list manipulation where we know + * the prev/next entries already! + */ +static __inline__ void __list_del(struct list_head * prev, + struct list_head * next) +{ + next->prev = prev; + prev->next = next; +} + +/** + * list_del - deletes entry from list. + * @entry: the element to delete from the list. + * Note: list_empty on entry does not return true after this, the entry is in an undefined state. + */ +static __inline__ void list_del(struct list_head *entry) +{ + __list_del(entry->prev, entry->next); +} + +/** + * list_del_init - deletes entry from list and reinitialize it. + * @entry: the element to delete from the list. + */ +static __inline__ void list_del_init(struct list_head *entry) +{ + __list_del(entry->prev, entry->next); + INIT_LIST_HEAD(entry); +} + +/** + * list_empty - tests whether a list is empty + * @head: the list to test. + */ +static __inline__ int list_empty(struct list_head *head) +{ + return head->next == head; +} + +/** + * list_splice - join two lists + * @list: the new list to add. + * @head: the place to add it in the first list. + */ +static __inline__ void list_splice(struct list_head *list, struct list_head *head) +{ + struct list_head *first = list->next; + + if (first != list) { + struct list_head *last = list->prev; + struct list_head *at = head->next; + + first->prev = head; + head->next = first; + + last->next = at; + at->prev = last; + } +} + +/** + * list_entry - get the struct for this entry + * @ptr: the &struct list_head pointer. + * @type: the type of the struct this is embedded in. + * @member: the name of the list_struct within the struct. + */ +#define list_entry(ptr, type, member) \ + ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member))) + +/** + * list_for_each - iterate over a list + * @pos: the &struct list_head to use as a loop counter. + * @head: the head for your list. + */ +#define list_for_each(pos, head) \ + for (pos = (head)->next; pos != (head); pos = pos->next) + +/** + * list_for_each_safe - iterate over a list safe against removal of list entry + * @pos: the &struct list_head to use as a loop counter. + * @n: another &struct list_head to use as temporary storage + * @head: the head for your list. + */ +#define list_for_each_safe(pos, n, head) \ + for (pos = (head)->next, n = pos->next; pos != (head); \ + pos = n, n = pos->next) + +/** + * list_for_each_entry - iterate over list of given type + * @pos: the type * to use as a loop counter. + * @head: the head for your list. + * @member: the name of the list_struct within the struct. + */ +#define list_for_each_entry(pos, head, member) \ + for (pos = list_entry((head)->next, typeof(*pos), member), \ + prefetch(pos->member.next); \ + &pos->member != (head); \ + pos = list_entry(pos->member.next, typeof(*pos), member), \ + prefetch(pos->member.next)) + +/** + * list_for_each_entry_safe - iterate over list of given type safe against removal of list entry + * @pos: the type * to use as a loop counter. + * @n: another type * to use as temporary storage + * @head: the head for your list. + * @member: the name of the list_struct within the struct. + */ +#define list_for_each_entry_safe(pos, n, head, member) \ + for (pos = list_entry((head)->next, typeof(*pos), member), \ + n = list_entry(pos->member.next, typeof(*pos), member); \ + &pos->member != (head); \ + pos = n, n = list_entry(n->member.next, typeof(*n), member)) +#endif /* _LINUX_LIST_H */ + diff -Nru a/tools/libxc/xc_debug.c b/tools/libxc/xc_debug.c --- /dev/null Wed Dec 31 16:00:00 196900 +++ b/tools/libxc/xc_debug.c 2005-06-04 03:01:59 -04:00 @@ -0,0 +1,580 @@ +/* + * xc_debug.c + * + * alex ho + * http://www.cl.cam.ac.uk/netos/pdb + * + * xc_debug_memory_page adapted from xc_ptrace.c + */ + +#include "xc_private.h" +#include "list.h" + +/* from xen/include/asm-x86/processor.h */ +#define X86_EFLAGS_TF 0x00000100 /* Trap Flag */ + +typedef int boolean; +#define true 1 +#define false 0 + + +typedef struct bwcpoint /* break/watch/catch point */ +{ + struct list_head list; + memory_t address; + u32 domain; + u16 vcpu; + u8 old_value; /* old value for software bkpt */ +} bwcpoint_t, *bwcpoint_p; + +static bwcpoint_t bwcpoint_list; + + + +typedef struct domain_context /* local cache of domain state */ +{ + struct list_head list; _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |