11.9Sriastrad/*	$NetBSD: exec_elf64.c,v 1.9 2024/12/06 16:19:41 riastradh Exp $	*/
21.1Scgd
31.1Scgd/*
41.1Scgd * Copyright (c) 1996 Christopher G. Demetriou
51.1Scgd * All rights reserved.
61.1Scgd *
71.1Scgd * Redistribution and use in source and binary forms, with or without
81.1Scgd * modification, are permitted provided that the following conditions
91.1Scgd * are met:
101.1Scgd * 1. Redistributions of source code must retain the above copyright
111.1Scgd *    notice, this list of conditions and the following disclaimer.
121.1Scgd * 2. Redistributions in binary form must reproduce the above copyright
131.1Scgd *    notice, this list of conditions and the following disclaimer in the
141.1Scgd *    documentation and/or other materials provided with the distribution.
151.1Scgd * 3. All advertising materials mentioning features or use of this software
161.1Scgd *    must display the following acknowledgement:
171.1Scgd *      This product includes software developed by Christopher G. Demetriou
181.1Scgd *	for the NetBSD Project.
191.1Scgd * 4. The name of the author may not be used to endorse or promote products
201.1Scgd *    derived from this software without specific prior written permission
211.1Scgd *
221.1Scgd * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
231.1Scgd * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
241.1Scgd * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
251.1Scgd * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
261.1Scgd * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
271.1Scgd * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
281.1Scgd * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
291.1Scgd * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
301.1Scgd * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
311.1Scgd * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
321.1Scgd */
331.2Slukem
341.2Slukem#include <sys/cdefs.h>
351.9Sriastrad__KERNEL_RCSID(0, "$NetBSD: exec_elf64.c,v 1.9 2024/12/06 16:19:41 riastradh Exp $");
361.1Scgd
371.1Scgd#define	ELFSIZE	64
381.1Scgd
391.3Sad#include "exec_elf.c"
401.3Sad
411.3Sad#include <sys/module.h>
421.3Sad
431.7Schristos#define ELF64_AUXSIZE (ELF_AUX_ENTRIES * sizeof(Aux64Info) \
441.7Schristos    + MAXPATHLEN + ALIGN(1))
451.3Sad
461.8SpgoyetteMODULE(MODULE_CLASS_EXEC, exec_elf64, NULL);
471.3Sad
481.3Sadstatic struct execsw exec_elf64_execsw[] = {
491.3Sad	/* Native Elf64 */
501.5Schristos	{
511.5Schristos		.es_hdrsz = sizeof (Elf64_Ehdr),
521.5Schristos	  	.es_makecmds = exec_elf64_makecmds,
531.5Schristos	  	.u = {
541.5Schristos			.elf_probe_func = netbsd_elf64_probe,
551.5Schristos		},
561.5Schristos		.es_emul = &emul_netbsd,
571.6Smaxv		.es_prio = EXECSW_PRIO_FIRST,
581.5Schristos		.es_arglen = ELF64_AUXSIZE,
591.5Schristos		.es_copyargs = elf64_copyargs,
601.5Schristos		.es_setregs = NULL,
611.5Schristos		.es_coredump = coredump_elf64,
621.5Schristos		.es_setup_stack = exec_setup_stack,
631.5Schristos	},
641.3Sad#if EXEC_ELF_NOTELESS
651.3Sad	/* Generic Elf64 -- run at NetBSD Elf64 */
661.5Schristos	{
671.5Schristos		.es_hdrsz = sizeof (Elf64_Ehdr),
681.5Schristos		.es_makecmds = exec_elf64_makecmds,
691.5Schristos		.u = {
701.5Schristos			.elf_probe_func = NULL,
711.5Schristos		},
721.5Schristos		.es_emul = &emul_netbsd,
731.5Schristos		.es_prio = EXECSW_PRIO_ANY,
741.5Schristos		.es_arglen = ELF64_AUXSIZE,
751.5Schristos		.es_copyargs = elf64_copyargs,
761.5Schristos		.es_setregs = NULL,
771.5Schristos		.es_coredump = coredump_elf64,
781.5Schristos		.es_setup_stack = exec_setup_stack,
791.5Schristos	},
801.3Sad#endif
811.3Sad};
821.3Sad
831.3Sadstatic int
841.3Sadexec_elf64_modcmd(modcmd_t cmd, void *arg)
851.3Sad{
861.3Sad
871.3Sad	switch (cmd) {
881.3Sad	case MODULE_CMD_INIT:
891.3Sad		return exec_add(exec_elf64_execsw,
901.3Sad		    __arraycount(exec_elf64_execsw));
911.3Sad
921.3Sad	case MODULE_CMD_FINI:
931.3Sad		return exec_remove(exec_elf64_execsw,
941.3Sad		    __arraycount(exec_elf64_execsw));
951.3Sad
961.3Sad	default:
971.9Sriastrad		return SET_ERROR(ENOTTY);
981.3Sad        }
991.3Sad}
100