xref: /freebsd/sys/compat/linuxkpi/common/include/linux/efi.h (revision 325ba120558e9ccfa9bb876c20d9c1a4463930e9)
189bb7f9bSVladimir Kondratyev /*-
289bb7f9bSVladimir Kondratyev  * SPDX-License-Identifier: BSD-2-Clause
389bb7f9bSVladimir Kondratyev  *
489bb7f9bSVladimir Kondratyev  * Copyright (c) 2021 Vladimir Kondratyev <wulf@FreeBSD.org>
589bb7f9bSVladimir Kondratyev  *
689bb7f9bSVladimir Kondratyev  * Redistribution and use in source and binary forms, with or without
789bb7f9bSVladimir Kondratyev  * modification, are permitted provided that the following conditions
889bb7f9bSVladimir Kondratyev  * are met:
989bb7f9bSVladimir Kondratyev  *
1089bb7f9bSVladimir Kondratyev  * 1. Redistributions of source code must retain the above copyright
1189bb7f9bSVladimir Kondratyev  *    notice, this list of conditions and the following disclaimer.
1289bb7f9bSVladimir Kondratyev  * 2. Redistributions in binary form must reproduce the above copyright
1389bb7f9bSVladimir Kondratyev  *    notice, this list of conditions and the following disclaimer in the
1489bb7f9bSVladimir Kondratyev  *    documentation and/or other materials provided with the distribution.
1589bb7f9bSVladimir Kondratyev  *
1689bb7f9bSVladimir Kondratyev  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
1789bb7f9bSVladimir Kondratyev  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
1889bb7f9bSVladimir Kondratyev  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
1989bb7f9bSVladimir Kondratyev  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
2089bb7f9bSVladimir Kondratyev  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2189bb7f9bSVladimir Kondratyev  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2289bb7f9bSVladimir Kondratyev  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2389bb7f9bSVladimir Kondratyev  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2489bb7f9bSVladimir Kondratyev  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2589bb7f9bSVladimir Kondratyev  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2689bb7f9bSVladimir Kondratyev  */
2789bb7f9bSVladimir Kondratyev 
28307f78f3SVladimir Kondratyev #ifndef _LINUXKPI_LINUX_EFI_H_
29307f78f3SVladimir Kondratyev #define	_LINUXKPI_LINUX_EFI_H_
3089bb7f9bSVladimir Kondratyev 
3189bb7f9bSVladimir Kondratyev #include <sys/param.h>
32*325ba120SBjoern A. Zeeb #include <sys/queue.h>
3389bb7f9bSVladimir Kondratyev #include <sys/linker.h>
3489bb7f9bSVladimir Kondratyev #include <sys/systm.h>
3589bb7f9bSVladimir Kondratyev 
3689bb7f9bSVladimir Kondratyev #include <machine/md_var.h>
3789bb7f9bSVladimir Kondratyev #include <machine/metadata.h>
3889bb7f9bSVladimir Kondratyev 
3989bb7f9bSVladimir Kondratyev #define	EFI_BOOT		0
4089bb7f9bSVladimir Kondratyev 
4189bb7f9bSVladimir Kondratyev static inline bool
4289bb7f9bSVladimir Kondratyev __efi_enabled(int feature)
4389bb7f9bSVladimir Kondratyev {
4489bb7f9bSVladimir Kondratyev #if defined(MODINFOMD_EFI_MAP) && !defined(__amd64__)
4589bb7f9bSVladimir Kondratyev 	caddr_t kmdp;
4689bb7f9bSVladimir Kondratyev #endif
4789bb7f9bSVladimir Kondratyev 	bool enabled = false;
4889bb7f9bSVladimir Kondratyev 
4989bb7f9bSVladimir Kondratyev 	switch (feature) {
5089bb7f9bSVladimir Kondratyev 	case EFI_BOOT:
5189bb7f9bSVladimir Kondratyev #ifdef __amd64__
5289bb7f9bSVladimir Kondratyev 		/* Use cached value on amd64 */
5389bb7f9bSVladimir Kondratyev 		enabled = efi_boot;
5489bb7f9bSVladimir Kondratyev #elif defined(MODINFOMD_EFI_MAP)
5589bb7f9bSVladimir Kondratyev 		kmdp = preload_search_by_type("elf kernel");
5689bb7f9bSVladimir Kondratyev 		if (kmdp == NULL)
5789bb7f9bSVladimir Kondratyev 			kmdp = preload_search_by_type("elf64 kernel");
5889bb7f9bSVladimir Kondratyev 		enabled = preload_search_info(kmdp,
5989bb7f9bSVladimir Kondratyev 		    MODINFO_METADATA | MODINFOMD_EFI_MAP) != NULL;
6089bb7f9bSVladimir Kondratyev #endif
6189bb7f9bSVladimir Kondratyev 		break;
6289bb7f9bSVladimir Kondratyev 	default:
6389bb7f9bSVladimir Kondratyev 		break;
6489bb7f9bSVladimir Kondratyev 	}
6589bb7f9bSVladimir Kondratyev 
6689bb7f9bSVladimir Kondratyev 	return (enabled);
6789bb7f9bSVladimir Kondratyev }
6889bb7f9bSVladimir Kondratyev 
6989bb7f9bSVladimir Kondratyev #define	efi_enabled(x)	({					\
7089bb7f9bSVladimir Kondratyev 	_Static_assert((x) == EFI_BOOT, "unsupported feature");	\
7189bb7f9bSVladimir Kondratyev 	__efi_enabled(x);					\
7289bb7f9bSVladimir Kondratyev })
7389bb7f9bSVladimir Kondratyev 
74307f78f3SVladimir Kondratyev #endif	/* _LINUXKPI_LINUX_EFI_H_ */
75