diff options
Diffstat (limited to 'tools/debugger/pdb/pdb_caml_process.c')
-rw-r--r-- | tools/debugger/pdb/pdb_caml_process.c | 587 |
1 files changed, 0 insertions, 587 deletions
diff --git a/tools/debugger/pdb/pdb_caml_process.c b/tools/debugger/pdb/pdb_caml_process.c deleted file mode 100644 index 3d39b846a7..0000000000 --- a/tools/debugger/pdb/pdb_caml_process.c +++ /dev/null @@ -1,587 +0,0 @@ -/* - * pdb_caml_process.c - * - * http://www.cl.cam.ac.uk/netos/pdb - * - * PDB's OCaml interface library for debugging processes - */ - -#include <errno.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <caml/alloc.h> -#include <caml/fail.h> -#include <caml/memory.h> -#include <caml/mlvalues.h> - -#include <xenctrl.h> -#include <xen/xen.h> -#include <xen/io/domain_controller.h> -#include "pdb_module.h" -#include "pdb_caml_xen.h" - -typedef struct -{ - int domain; - int process; - int evtchn; - pdb_front_ring_t *ring; -} context_t; - -#define decode_context(_ctx, _ocaml) \ -{ \ - (_ctx)->domain = Int_val(Field((_ocaml),0)); \ - (_ctx)->process = Int_val(Field((_ocaml),1)); \ - (_ctx)->evtchn = Int_val(Field((_ocaml),2)); \ - (_ctx)->ring = (pdb_front_ring_t *)Int32_val(Field((_ocaml),3)); \ -} - -#define encode_context(_ctx, _ocaml) \ -{ \ - (_ocaml) = caml_alloc_tuple(2); \ - Store_field((_ocaml), 0, Val_int((_ctx)->domain)); \ - Store_field((_ocaml), 1, Val_int((_ctx)->process)); \ -} - -/* - * send a request to a pdb domain backend. - * - * puts the request on a ring and kicks the backend using an event channel. - */ -static void -send_request (pdb_front_ring_t *pdb_ring, int evtchn, pdb_request_t *request) -{ - pdb_request_t *req; - - req = RING_GET_REQUEST(pdb_ring, pdb_ring->req_prod_pvt); - - memcpy(req, request, sizeof(pdb_request_t)); - - pdb_ring->req_prod_pvt++; - - RING_PUSH_REQUESTS(pdb_ring); - xc_evtchn_send(xc_handle, evtchn); -} - -/* - * process_handle_response : int32 -> int * int * string - * - * A backend domain has notified pdb (via an event channel) - * that a command has finished. - * We read the result from the channel and formulate a response - * as a single string. Also return the domain and process. - */ - -static inline unsigned int -_flip (unsigned int orig) -{ - return (((orig << 24) & 0xff000000) | ((orig << 8) & 0x00ff0000) | - ((orig >> 8) & 0x0000ff00) | ((orig >> 24) & 0x000000ff)); -} - -value -process_handle_response (value ring) -{ - CAMLparam1(ring); - CAMLlocal2(result, str); - - RING_IDX rp; - pdb_response_p resp; - pdb_front_ring_t *my_ring = (pdb_front_ring_t *)Int32_val(ring); - char msg[2048]; - int msglen; - - memset(msg, 0, sizeof(msg)); - - rp = my_ring->sring->rsp_prod; - rmb(); /* Ensure we see queued responses up to 'rp'. */ - - /* default response is OK unless the command has something - more interesting to say */ - sprintf(msg, "OK"); - - if (my_ring->rsp_cons != rp) - { - resp = RING_GET_RESPONSE(my_ring, my_ring->rsp_cons); - - switch (resp->operation) - { - case PDB_OPCODE_PAUSE : - case PDB_OPCODE_ATTACH : - case PDB_OPCODE_DETACH : - break; - - case PDB_OPCODE_RD_REG : - { - sprintf(&msg[0], "%08x", _flip(resp->u.rd_reg.value)); - break; - } - - case PDB_OPCODE_RD_REGS : - { - int loop; - pdb_op_rd_regs_p regs = &resp->u.rd_regs; - - for (loop = 0; loop < GDB_REGISTER_FRAME_SIZE * 8; loop += 8) - { - sprintf(&msg[loop], "%08x", _flip(regs->reg[loop >> 3])); - } - - break; - } - case PDB_OPCODE_WR_REG : - { - /* should check the return status */ - break; - } - - case PDB_OPCODE_RD_MEM : - { - int loop; - pdb_op_rd_mem_resp_p mem = &resp->u.rd_mem; - - for (loop = 0; loop < mem->length; loop ++) - { - sprintf(&msg[loop * 2], "%02x", mem->data[loop]); - } - break; - } - case PDB_OPCODE_WR_MEM : - { - /* should check the return status */ - break; - } - - /* this is equivalent to process_xen_virq */ - case PDB_OPCODE_CONTINUE : - { - sprintf(msg, "S05"); - break; - } - case PDB_OPCODE_STEP : - { - sprintf(msg, "S05"); - break; - } - - case PDB_OPCODE_SET_BKPT : - case PDB_OPCODE_CLR_BKPT : - case PDB_OPCODE_SET_WATCHPT : - case PDB_OPCODE_CLR_WATCHPT : - { - break; - } - - case PDB_OPCODE_WATCHPOINT : - { - sprintf(msg, "S05"); - break; - } - - default : - printf("(linux) UNKNOWN MESSAGE TYPE IN RESPONSE %d\n", - resp->operation); - break; - } - - my_ring->rsp_cons++; - } - - msglen = strlen(msg); - result = caml_alloc(3,0); - str = alloc_string(msglen); - memmove(&Byte(str,0), msg, msglen); - - Store_field(result, 0, Val_int(resp->domain)); - Store_field(result, 1, Val_int(resp->process)); - Store_field(result, 2, str); - - CAMLreturn(result); -} - -/* - * proc_attach_debugger : context_t -> unit - */ -value -proc_attach_debugger (value context) -{ - CAMLparam1(context); - context_t ctx; - pdb_request_t req; - - decode_context(&ctx, context); - - req.operation = PDB_OPCODE_ATTACH; - req.u.attach.domain = ctx.domain; - req.process = ctx.process; - - send_request (ctx.ring, ctx.evtchn, &req); - - CAMLreturn(Val_unit); -} - - -/* - * proc_detach_debugger : context_t -> unit - */ -value -proc_detach_debugger (value context) -{ - CAMLparam1(context); - context_t ctx; - pdb_request_t req; - - decode_context(&ctx, context); - - printf("(pdb) detach process [%d.%d] %d %p\n", ctx.domain, ctx.process, - ctx.evtchn, ctx.ring); - fflush(stdout); - - req.operation = PDB_OPCODE_DETACH; - req.process = ctx.process; - - send_request (ctx.ring, ctx.evtchn, &req); - - CAMLreturn(Val_unit); -} - - -/* - * proc_pause_target : int -> unit - */ -value -proc_pause_target (value context) -{ - CAMLparam1(context); - context_t ctx; - pdb_request_t req; - - decode_context(&ctx, context); - - printf("(pdb) pause target %d %d\n", ctx.domain, ctx.process); - fflush(stdout); - - req.operation = PDB_OPCODE_PAUSE; - req.process = ctx.process; - - send_request (ctx.ring, ctx.evtchn, &req); - - CAMLreturn(Val_unit); -} - - -/* - * proc_read_register : context_t -> int -> unit - */ -value -proc_read_register (value context, value reg) -{ - CAMLparam1(context); - - pdb_request_t req; - context_t ctx; - int my_reg = Int_val(reg); - - decode_context(&ctx, context); - - req.operation = PDB_OPCODE_RD_REG; - req.process = ctx.process; - req.u.rd_reg.reg = my_reg; - req.u.rd_reg.value = 0; - - send_request (ctx.ring, ctx.evtchn, &req); - - CAMLreturn(Val_unit); -} - - - -/* - * proc_read_registers : context_t -> unit - */ -value -proc_read_registers (value context) -{ - CAMLparam1(context); - - pdb_request_t req; - context_t ctx; - - decode_context(&ctx, context); - - req.operation = PDB_OPCODE_RD_REGS; - req.process = ctx.process; - - send_request (ctx.ring, ctx.evtchn, &req); - - CAMLreturn(Val_unit); -} - - -/* - * proc_write_register : context_t -> register -> int32 -> unit - */ -value -proc_write_register (value context, value reg, value newval) -{ - CAMLparam3(context, reg, newval); - - int my_reg = Int_val(reg); - unsigned long my_newval = Int32_val(newval); - - context_t ctx; - pdb_request_t req; - - decode_context(&ctx, context); - - req.operation = PDB_OPCODE_WR_REG; - req.process = ctx.process; - req.u.wr_reg.value = my_newval; - - switch (my_reg) - { - case GDB_EAX: req.u.wr_reg.reg = LINUX_EAX; break; - case GDB_ECX: req.u.wr_reg.reg = LINUX_ECX; break; - case GDB_EDX: req.u.wr_reg.reg = LINUX_EDX; break; - case GDB_EBX: req.u.wr_reg.reg = LINUX_EBX; break; - - case GDB_ESP: req.u.wr_reg.reg = LINUX_ESP; break; - case GDB_EBP: req.u.wr_reg.reg = LINUX_EBP; break; - case GDB_ESI: req.u.wr_reg.reg = LINUX_ESI; break; - case GDB_EDI: req.u.wr_reg.reg = LINUX_EDI; break; - - case GDB_EIP: req.u.wr_reg.reg = LINUX_EIP; break; - case GDB_EFL: req.u.wr_reg.reg = LINUX_EFL; break; - - case GDB_CS: req.u.wr_reg.reg = LINUX_CS; break; - case GDB_SS: req.u.wr_reg.reg = LINUX_SS; break; - case GDB_DS: req.u.wr_reg.reg = LINUX_DS; break; - case GDB_ES: req.u.wr_reg.reg = LINUX_ES; break; - case GDB_FS: req.u.wr_reg.reg = LINUX_FS; break; - case GDB_GS: req.u.wr_reg.reg = LINUX_GS; break; - } - - send_request(ctx.ring, ctx.evtchn, &req); - - CAMLreturn(Val_unit); -} - - -/* - * proc_read_memory : context_t -> int32 -> int -> unit - */ -value -proc_read_memory (value context, value address, value length) -{ - CAMLparam3(context, address, length); - - context_t ctx; - pdb_request_t req; - - decode_context(&ctx, context); - - req.operation = PDB_OPCODE_RD_MEM; - req.process = ctx.process; - req.u.rd_mem.address = Int32_val(address); - req.u.rd_mem.length = Int_val(length); - - send_request(ctx.ring, ctx.evtchn, &req); - - CAMLreturn(Val_unit); -} - - -/* - * proc_write_memory : context_t -> int32 -> int list -> unit - */ -value -proc_write_memory (value context, value address, value val_list) -{ - CAMLparam3(context, address, val_list); - CAMLlocal1(node); - - context_t ctx; - pdb_request_t req; - uint32_t length = 0; - - decode_context(&ctx, context); - - req.operation = PDB_OPCODE_WR_MEM; - req.process = ctx.process; - - node = val_list; - if ( Int_val(node) == 0 ) /* gdb functionalty test uses empty list */ - { - req.u.wr_mem.address = Int32_val(address); - req.u.wr_mem.length = 0; - } - else - { - while ( Int_val(Field(node,1)) != 0 ) - { - req.u.wr_mem.data[length++] = Int_val(Field(node, 0)); - node = Field(node,1); - } - req.u.wr_mem.data[length++] = Int_val(Field(node, 0)); - - req.u.wr_mem.address = Int32_val(address); - req.u.wr_mem.length = length; - } - - send_request(ctx.ring, ctx.evtchn, &req); - - CAMLreturn(Val_unit); -} - - -/* - * proc_continue_target : context_t -> unit - */ -value -proc_continue_target (value context) -{ - CAMLparam1(context); - - context_t ctx; - pdb_request_t req; - - decode_context(&ctx, context); - - req.operation = PDB_OPCODE_CONTINUE; - req.process = ctx.process; - - send_request(ctx.ring, ctx.evtchn, &req); - - CAMLreturn(Val_unit); -} - -/* - * proc_step_target : context_t -> unit - */ -value -proc_step_target (value context) -{ - CAMLparam1(context); - - context_t ctx; - pdb_request_t req; - - decode_context(&ctx, context); - - req.operation = PDB_OPCODE_STEP; - req.process = ctx.process; - - send_request(ctx.ring, ctx.evtchn, &req); - - CAMLreturn(Val_unit); -} - - - -/* - * proc_insert_memory_breakpoint : context_t -> int32 -> int -> unit - */ -value -proc_insert_memory_breakpoint (value context, value address, value length) -{ - CAMLparam3(context, address, length); - - context_t ctx; - pdb_request_t req; - - decode_context(&ctx, context); - - req.operation = PDB_OPCODE_SET_BKPT; - req.process = ctx.process; - req.u.bkpt.address = (unsigned long) Int32_val(address); - req.u.bkpt.length = Int_val(length); - - send_request(ctx.ring, ctx.evtchn, &req); - - CAMLreturn(Val_unit); -} - -/* - * proc_remove_memory_breakpoint : context_t -> int32 -> int -> unit - */ -value -proc_remove_memory_breakpoint (value context, value address, value length) -{ - CAMLparam3(context, address, length); - - context_t ctx; - pdb_request_t req; - - decode_context(&ctx, context); - - req.operation = PDB_OPCODE_CLR_BKPT; - req.process = ctx.process; - req.u.bkpt.address = (unsigned long) Int32_val(address); - req.u.bkpt.length = Int_val(length); - - send_request(ctx.ring, ctx.evtchn, &req); - - CAMLreturn(Val_unit); -} - -/* - * proc_insert_watchpoint : context_t -> bwcpoint_t -> int32 -> int -> unit - */ -value -proc_insert_watchpoint (value context, value kind, value address, value length) -{ - CAMLparam3(context, address, length); - - context_t ctx; - pdb_request_t req; - - decode_context(&ctx, context); - - req.operation = PDB_OPCODE_SET_WATCHPT; - req.process = ctx.process; - req.u.watchpt.type = Int_val(kind); - req.u.watchpt.address = (unsigned long) Int32_val(address); - req.u.watchpt.length = Int_val(length); - - send_request(ctx.ring, ctx.evtchn, &req); - - CAMLreturn(Val_unit); -} - -/* - * proc_remove_watchpoint : context_t -> bwcpoint_t -> int32 -> int -> unit - */ -value -proc_remove_watchpoint (value context, value kind, value address, value length) -{ - CAMLparam3(context, address, length); - - context_t ctx; - pdb_request_t req; - - decode_context(&ctx, context); - - req.operation = PDB_OPCODE_CLR_WATCHPT; - req.process = ctx.process; - req.u.watchpt.type = Int_val(kind); - req.u.watchpt.address = (unsigned long) Int32_val(address); - req.u.watchpt.length = Int_val(length); - - send_request(ctx.ring, ctx.evtchn, &req); - - CAMLreturn(Val_unit); -} - - -/* - * Local variables: - * mode: C - * c-set-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ - - |