/* BSD Kernel Data Access Library (libkvm) interface.
- Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc.
This file is part of GDB.
}
execfile = get_exec_file (0);
- temp_kd = kvm_openfiles (execfile, filename, NULL, O_RDONLY, errbuf);
+ temp_kd = kvm_openfiles (execfile, filename, NULL,
+ write_files ? O_RDWR : O_RDONLY, errbuf);
if (temp_kd == NULL)
error (("%s"), errbuf);
core_kd = temp_kd;
push_target (&bsd_kvm_ops);
- target_fetch_registers (-1);
+ target_fetch_registers (get_current_regcache (), -1);
- flush_cached_frames ();
- select_frame (get_current_frame ());
+ reinit_frame_cache ();
print_stack_frame (get_selected_frame (NULL), -1, 1);
}
/* Fetch process control block at address PADDR. */
static int
-bsd_kvm_fetch_pcb (struct pcb *paddr)
+bsd_kvm_fetch_pcb (struct regcache *regcache, struct pcb *paddr)
{
struct pcb pcb;
error (("%s"), kvm_geterr (core_kd));
gdb_assert (bsd_kvm_supply_pcb);
- return bsd_kvm_supply_pcb (current_regcache, &pcb);
+ return bsd_kvm_supply_pcb (regcache, &pcb);
}
static void
-bsd_kvm_fetch_registers (int regnum)
+bsd_kvm_fetch_registers (struct regcache *regcache, int regnum)
{
struct nlist nl[2];
if (bsd_kvm_paddr)
{
- bsd_kvm_fetch_pcb (bsd_kvm_paddr);
+ bsd_kvm_fetch_pcb (regcache, bsd_kvm_paddr);
return;
}
{
/* Found dumppcb. If it contains a valid context, return
immediately. */
- if (bsd_kvm_fetch_pcb ((struct pcb *) nl[0].n_value))
+ if (bsd_kvm_fetch_pcb (regcache, (struct pcb *) nl[0].n_value))
return;
}
if (kvm_read (core_kd, nl[0].n_value, &paddr, sizeof paddr) == -1)
error (("%s"), kvm_geterr (core_kd));
- bsd_kvm_fetch_pcb (paddr);
+ bsd_kvm_fetch_pcb (regcache, paddr);
return;
}
if (kvm_read (core_kd, nl[0].n_value, &paddr, sizeof paddr) == -1)
error (("%s"), kvm_geterr (core_kd));
- bsd_kvm_fetch_pcb (paddr);
+ bsd_kvm_fetch_pcb (regcache, paddr);
return;
}
#endif
if (kvm_read (core_kd, addr, &bsd_kvm_paddr, sizeof bsd_kvm_paddr) == -1)
error (("%s"), kvm_geterr (core_kd));
- target_fetch_registers (-1);
+ target_fetch_registers (get_current_regcache (), -1);
- flush_cached_frames ();
- select_frame (get_current_frame ());
+ reinit_frame_cache ();
print_stack_frame (get_selected_frame (NULL), -1, 1);
}
bsd_kvm_paddr = (struct pcb *)(u_long) parse_and_eval_address (arg);
- target_fetch_registers (-1);
+ target_fetch_registers (get_current_regcache (), -1);
- flush_cached_frames ();
- select_frame (get_current_frame ());
+ reinit_frame_cache ();
print_stack_frame (get_selected_frame (NULL), -1, 1);
}