void _initialize_i386obsd_nat (void) { /* Add some extra features to the common *BSD/i386 target. */ obsd_add_target (i386bsd_target ()); /* Support debugging kernel virtual memory images. */ bsd_kvm_add_target (i386obsd_supply_pcb); /* OpenBSD provides a vm.psstrings sysctl that we can use to locate the sigtramp. That way we can still recognize a sigtramp if its location is changed in a new kernel. This is especially important for OpenBSD, since it uses a different memory layout than NetBSD, yet we cannot distinguish between the two. Of course this is still based on the assumption that the sigtramp is placed directly under the location where the program arguments and environment can be found. */ #ifdef VM_PSSTRINGS { struct _ps_strings _ps; int mib[2]; size_t len; mib[0] = CTL_VM; mib[1] = VM_PSSTRINGS; len = sizeof (_ps); if (sysctl (mib, 2, &_ps, &len, NULL, 0) == 0) { i386obsd_sigtramp_start_addr = (u_long) _ps.val - 128; i386obsd_sigtramp_end_addr = (u_long) _ps.val; } } #endif }
void _initialize_i386dfly_nat (void) { struct target_ops *t; /* Add some extra features to the common *BSD/i386 target. */ t = i386bsd_target (); t->to_pid_to_exec_file = fbsd_pid_to_exec_file; t->to_find_memory_regions = fbsd_find_memory_regions; t->to_make_corefile_notes = fbsd_make_corefile_notes; add_target (t); /* FreeBSD provides a kern.ps_strings sysctl that we can use to locate the sigtramp. That way we can still recognize a sigtramp if its location is changed in a new kernel. Of course this is still based on the assumption that the sigtramp is placed directly under the location where the program arguments and environment can be found. */ #ifdef KERN_PS_STRINGS { int mib[2]; u_long ps_strings; size_t len; mib[0] = CTL_KERN; mib[1] = KERN_PS_STRINGS; len = sizeof (ps_strings); if (sysctl (mib, 2, &ps_strings, &len, NULL, 0) == 0) { i386dfly_sigtramp_start_addr = ps_strings - 128; i386dfly_sigtramp_end_addr = ps_strings; } } #endif }
void _initialize_i386nbsd_nat (void) { /* We've got nothing to add to the common *BSD/i386 target. */ add_target (i386bsd_target ()); /* Support debugging kernel virtual memory images. */ bsd_kvm_add_target (i386nbsd_supply_pcb); }
void _initialize_i386fbsd_nat (void) { struct target_ops *t; /* Add some extra features to the common *BSD/i386 target. */ t = i386bsd_target (); #ifdef HAVE_PT_GETDBREGS i386_use_watchpoints (t); i386_dr_low.set_control = i386bsd_dr_set_control; i386_dr_low.set_addr = i386bsd_dr_set_addr; i386_dr_low.get_addr = i386bsd_dr_get_addr; i386_dr_low.get_status = i386bsd_dr_get_status; i386_dr_low.get_control = i386bsd_dr_get_control; i386_set_debug_register_length (4); #endif /* HAVE_PT_GETDBREGS */ t->to_resume = i386fbsd_resume; t->to_pid_to_exec_file = fbsd_pid_to_exec_file; t->to_find_memory_regions = fbsd_find_memory_regions; t->to_make_corefile_notes = fbsd_make_corefile_notes; add_target (t); /* Support debugging kernel virtual memory images. */ bsd_kvm_add_target (i386fbsd_supply_pcb); /* FreeBSD provides a kern.ps_strings sysctl that we can use to locate the sigtramp. That way we can still recognize a sigtramp if its location is changed in a new kernel. Of course this is still based on the assumption that the sigtramp is placed directly under the location where the program arguments and environment can be found. */ #ifdef KERN_PS_STRINGS { int mib[2]; u_long ps_strings; size_t len; mib[0] = CTL_KERN; mib[1] = KERN_PS_STRINGS; len = sizeof (ps_strings); if (sysctl (mib, 2, &ps_strings, &len, NULL, 0) == 0) { i386fbsd_sigtramp_start_addr = ps_strings - 128; i386fbsd_sigtramp_end_addr = ps_strings; } } #endif }
void _initialize_i386fbsd_nat (void) { struct target_ops *t; /* Add some extra features to the common *BSD/i386 target. */ t = i386bsd_target (); #ifdef PT_GETXSTATE_INFO t->to_read_description = i386fbsd_read_description; #endif t->to_resume = i386fbsd_resume; fbsd_nat_add_target (t); /* Support debugging kernel virtual memory images. */ bsd_kvm_add_target (i386fbsd_supply_pcb); #ifdef KERN_PROC_SIGTRAMP /* Normally signal frames are detected via i386fbsd_sigtramp_p. However, FreeBSD 9.2 through 10.1 do not include the page holding the signal code in core dumps. These releases do provide a kern.proc.sigtramp.<pid> sysctl that returns the location of the signal trampoline for a running process. We fetch the location of the current (gdb) process and use this to identify signal frames in core dumps from these releases. */ { int mib[4]; struct kinfo_sigtramp kst; size_t len; mib[0] = CTL_KERN; mib[1] = KERN_PROC; mib[2] = KERN_PROC_SIGTRAMP; mib[3] = getpid (); len = sizeof (kst); if (sysctl (mib, 4, &kst, &len, NULL, 0) == 0) { i386fbsd_sigtramp_start_addr = (uintptr_t) kst.ksigtramp_start; i386fbsd_sigtramp_end_addr = (uintptr_t) kst.ksigtramp_end; } } #endif }