Home | History | Annotate | Line # | Download | only in arm
      1 /*	$NetBSD: core_machdep.c,v 1.10 2020/11/10 21:38:03 rin Exp $	*/
      2 
      3 /*
      4  * Copyright (c) 1994-1998 Mark Brinicombe.
      5  * Copyright (c) 1994 Brini.
      6  * All rights reserved.
      7  *
      8  * This code is derived from software written for Brini by Mark Brinicombe
      9  *
     10  * Redistribution and use in source and binary forms, with or without
     11  * modification, are permitted provided that the following conditions
     12  * are met:
     13  * 1. Redistributions of source code must retain the above copyright
     14  *    notice, this list of conditions and the following disclaimer.
     15  * 2. Redistributions in binary form must reproduce the above copyright
     16  *    notice, this list of conditions and the following disclaimer in the
     17  *    documentation and/or other materials provided with the distribution.
     18  * 3. All advertising materials mentioning features or use of this software
     19  *    must display the following acknowledgement:
     20  *	This product includes software developed by Brini.
     21  * 4. The name of the company nor the name of the author may be used to
     22  *    endorse or promote products derived from this software without specific
     23  *    prior written permission.
     24  *
     25  * THIS SOFTWARE IS PROVIDED BY BRINI ``AS IS'' AND ANY EXPRESS OR IMPLIED
     26  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     27  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     28  * IN NO EVENT SHALL BRINI OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
     29  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     30  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
     31  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     32  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     33  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     34  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     35  * SUCH DAMAGE.
     36  */
     37 
     38 #include <sys/param.h>
     39 
     40 __KERNEL_RCSID(0, "$NetBSD: core_machdep.c,v 1.10 2020/11/10 21:38:03 rin Exp $");
     41 
     42 #ifdef _KERNEL_OPT
     43 #include "opt_execfmt.h"
     44 #else
     45 #define EXEC_ELF32 1
     46 #endif
     47 
     48 #include <sys/core.h>
     49 #include <sys/exec.h>
     50 #include <sys/ptrace.h>
     51 #include <sys/signalvar.h>
     52 #include <sys/systm.h>
     53 #include <sys/uio.h>
     54 #include <sys/vnode.h>
     55 #include <sys/compat_stub.h>
     56 
     57 #include <sys/exec_aout.h>	/* for MID_* */
     58 
     59 #include <arm/locore.h>
     60 
     61 #ifdef EXEC_ELF32
     62 #include <sys/exec_elf.h>
     63 #endif
     64 
     65 #include <machine/reg.h>
     66 
     67 
     68 /*
     69  * Dump the machine specific segment at the start of a core dump.
     70  */
     71 int
     72 cpu_coredump(struct lwp *l, struct coredump_iostate *iocookie,
     73     struct core *chdr)
     74 {
     75 	int error;
     76 	struct {
     77 		struct reg regs;
     78 		struct fpreg fpregs;
     79 	} cpustate;
     80 	struct coreseg cseg;
     81 
     82 	if (iocookie == NULL) {
     83 		CORE_SETMAGIC(*chdr, COREMAGIC, MID_MACHINE, 0);
     84 		chdr->c_hdrsize = ALIGN(sizeof(*chdr));
     85 		chdr->c_seghdrsize = ALIGN(sizeof(cseg));
     86 		chdr->c_cpusize = sizeof(cpustate);
     87 		chdr->c_nseg++;
     88 		return 0;
     89 	}
     90 
     91 	/* Save integer registers. */
     92 	error = process_read_regs(l, &cpustate.regs);
     93 	if (error)
     94 		return error;
     95 	/* Save floating point registers. */
     96 	error = process_read_fpregs(l, &cpustate.fpregs, NULL);
     97 	if (error)
     98 		return error;
     99 
    100 	CORE_SETMAGIC(cseg, CORESEGMAGIC, MID_MACHINE, CORE_CPU);
    101 	cseg.c_addr = 0;
    102 	cseg.c_size = chdr->c_cpusize;
    103 
    104 	MODULE_HOOK_CALL(coredump_write_hook, (iocookie, UIO_SYSSPACE,
    105 	    &cseg, chdr->c_seghdrsize), ENOSYS, error);
    106 	if (error)
    107 		return error;
    108 
    109 	MODULE_HOOK_CALL(coredump_write_hook, (iocookie, UIO_SYSSPACE,
    110 	    &cpustate, sizeof(cpustate)), ENOSYS, error);
    111 
    112 	return error;
    113 }
    114 
    115 #ifdef EXEC_ELF32
    116 void
    117 arm_netbsd_elf32_coredump_setup(struct lwp *l, void *arg)
    118 {
    119 #if defined(__ARMEB__) || defined(__ARM_EABI__)
    120 	Elf_Ehdr * const eh = arg;
    121 #endif
    122 #ifdef __ARM_EABI__
    123 	struct proc * const p = l->l_proc;
    124 
    125 	if (p->p_emul == &emul_netbsd) {
    126 		eh->e_flags |= EF_ARM_EABI_VER5;
    127 	}
    128 #endif
    129 #ifdef __ARMEB__
    130         if (CPU_IS_ARMV7_P()
    131 	    || (CPU_IS_ARMV6_P()
    132 		&& (armreg_sctlr_read() & CPU_CONTROL_BEND_ENABLE) == 0)) {
    133 		eh->e_flags |= EF_ARM_BE8;
    134 	}
    135 #endif
    136 }
    137 #endif
    138