From bfbb2b8f1cbcb169b38c3c2d8ff89874facaa920 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Thu, 5 Mar 2015 02:43:37 +0000 Subject: [PATCH] [linux] Rewrite headers included in all builds Rewrite (and relicense) the header files which are included in all builds of iPXE (including non-Linux builds). Signed-off-by: Michael Brown --- src/include/ipxe/linux/linux_entropy.h | 12 ++- src/include/ipxe/linux/linux_nap.h | 2 +- src/include/ipxe/linux/linux_smbios.h | 4 +- src/include/ipxe/linux/linux_timer.h | 2 +- src/include/ipxe/linux/linux_uaccess.h | 126 ++++++++++++------------- src/include/ipxe/linux/linux_umalloc.h | 6 +- src/interface/linux/linux_uaccess.c | 1 - 7 files changed, 73 insertions(+), 80 deletions(-) diff --git a/src/include/ipxe/linux/linux_entropy.h b/src/include/ipxe/linux/linux_entropy.h index 38227edf..afef6fe1 100644 --- a/src/include/ipxe/linux/linux_entropy.h +++ b/src/include/ipxe/linux/linux_entropy.h @@ -3,11 +3,11 @@ /** @file * - * iPXE entropy API for linux + * /dev/random-based entropy source * */ -FILE_LICENCE(GPL2_OR_LATER_OR_UBDL); +FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #ifdef ENTROPY_LINUX #define ENTROPY_PREFIX_linux @@ -23,10 +23,12 @@ FILE_LICENCE(GPL2_OR_LATER_OR_UBDL); static inline __always_inline double ENTROPY_INLINE ( linux, min_entropy_per_sample ) ( void ) { - /* We read single bytes from /dev/random and assume that each - * contains full entropy. + /* linux_get_noise() reads a single byte from /dev/random, + * which is supposed to block until a sufficient amount of + * entropy is available. We therefore assume that each sample + * contains exactly 8 bits of entropy. */ - return 8; + return 8.0; } #endif /* _IPXE_LINUX_ENTROPY_H */ diff --git a/src/include/ipxe/linux/linux_nap.h b/src/include/ipxe/linux/linux_nap.h index 5bac7242..d072886c 100644 --- a/src/include/ipxe/linux/linux_nap.h +++ b/src/include/ipxe/linux/linux_nap.h @@ -7,7 +7,7 @@ * */ -FILE_LICENCE(GPL2_OR_LATER); +FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #ifdef NAP_LINUX #define NAP_PREFIX_linux diff --git a/src/include/ipxe/linux/linux_smbios.h b/src/include/ipxe/linux/linux_smbios.h index 6d51e13b..16c6d8ac 100644 --- a/src/include/ipxe/linux/linux_smbios.h +++ b/src/include/ipxe/linux/linux_smbios.h @@ -3,11 +3,11 @@ /** @file * - * iPXE SMBIOS API for linux + * iPXE SMBIOS API for Linux * */ -FILE_LICENCE(GPL2_OR_LATER); +FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #ifdef SMBIOS_LINUX #define SMBIOS_PREFIX_linux diff --git a/src/include/ipxe/linux/linux_timer.h b/src/include/ipxe/linux/linux_timer.h index 37950741..7f46e36b 100644 --- a/src/include/ipxe/linux/linux_timer.h +++ b/src/include/ipxe/linux/linux_timer.h @@ -7,7 +7,7 @@ * */ -FILE_LICENCE ( GPL2_OR_LATER ); +FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #ifdef TIMER_LINUX #define TIMER_PREFIX_linux diff --git a/src/include/ipxe/linux/linux_uaccess.h b/src/include/ipxe/linux/linux_uaccess.h index e4d16d9e..acd919a8 100644 --- a/src/include/ipxe/linux/linux_uaccess.h +++ b/src/include/ipxe/linux/linux_uaccess.h @@ -1,116 +1,108 @@ -/* - * Copyright (C) 2010 Piotr JaroszyƄski - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - */ - #ifndef _IPXE_LINUX_UACCESS_H #define _IPXE_LINUX_UACCESS_H -FILE_LICENCE(GPL2_OR_LATER); - /** @file * - * iPXE user access API for linux + * iPXE user access API for Linux * - * In linux userspace virtual == user == phys addresses. - * Physical addresses also being the same is wrong, but there is no general way - * of converting userspace addresses to physical as what appears to be - * contiguous in userspace is physically fragmented. - * Currently only the DMA memory is special-cased, but its conversion to bus - * addresses is done in phys_to_bus. - * This is known to break virtio as it is passing phys addresses to the virtual - * device. + * We run with no distinction between internal and external addresses, + * so can use trivial_virt_to_user() et al. + * + * We have no concept of the underlying physical addresses, since + * these are not exposed to userspace. We provide a stub + * implementation of user_to_phys() since this is required by + * alloc_memblock(). We provide no implementation of phys_to_user(); + * any code attempting to access physical addresses will therefore + * (correctly) fail to link. */ +FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); + #ifdef UACCESS_LINUX #define UACCESS_PREFIX_linux #else #define UACCESS_PREFIX_linux __linux_ #endif -static inline __always_inline userptr_t -UACCESS_INLINE(linux, phys_to_user)(unsigned long phys_addr) -{ - return phys_addr; -} - +/** + * Convert user buffer to physical address + * + * @v userptr User pointer + * @v offset Offset from user pointer + * @ret phys_addr Physical address + */ static inline __always_inline unsigned long -UACCESS_INLINE(linux, user_to_phys)(userptr_t userptr, off_t offset) -{ - return userptr + offset; +UACCESS_INLINE ( linux, user_to_phys ) ( userptr_t userptr, off_t offset ) { + + /* We do not know the real underlying physical address. We + * provide this stub implementation only because it is + * required by alloc_memblock() (which allocates memory with + * specified physical address alignment). We assume that the + * low-order bits of virtual addresses match the low-order + * bits of physical addresses, and so simply returning the + * virtual address will suffice for the purpose of determining + * alignment. + */ + return ( userptr + offset ); } static inline __always_inline userptr_t -UACCESS_INLINE(linux, virt_to_user)(volatile const void *addr) -{ - return trivial_virt_to_user(addr); +UACCESS_INLINE ( linux, virt_to_user ) ( volatile const void *addr ) { + return trivial_virt_to_user ( addr ); } static inline __always_inline void * -UACCESS_INLINE(linux, user_to_virt)(userptr_t userptr, off_t offset) -{ - return trivial_user_to_virt(userptr, offset); +UACCESS_INLINE ( linux, user_to_virt ) ( userptr_t userptr, off_t offset ) { + return trivial_user_to_virt ( userptr, offset ); } static inline __always_inline userptr_t -UACCESS_INLINE(linux, userptr_add)(userptr_t userptr, off_t offset) -{ - return trivial_userptr_add(userptr, offset); +UACCESS_INLINE ( linux, userptr_add ) ( userptr_t userptr, off_t offset ) { + return trivial_userptr_add ( userptr, offset ); } static inline __always_inline off_t -UACCESS_INLINE(linux, userptr_sub)(userptr_t userptr, userptr_t subtrahend) -{ +UACCESS_INLINE ( linux, userptr_sub ) ( userptr_t userptr, + userptr_t subtrahend ) { return trivial_userptr_sub ( userptr, subtrahend ); } static inline __always_inline void -UACCESS_INLINE(linux, memcpy_user)(userptr_t dest, off_t dest_off, userptr_t src, off_t src_off, size_t len) -{ - trivial_memcpy_user(dest, dest_off, src, src_off, len); +UACCESS_INLINE ( linux, memcpy_user ) ( userptr_t dest, off_t dest_off, + userptr_t src, off_t src_off, + size_t len ) { + trivial_memcpy_user ( dest, dest_off, src, src_off, len ); } static inline __always_inline void -UACCESS_INLINE(linux, memmove_user)(userptr_t dest, off_t dest_off, userptr_t src, off_t src_off, size_t len) -{ - trivial_memmove_user(dest, dest_off, src, src_off, len); +UACCESS_INLINE ( linux, memmove_user ) ( userptr_t dest, off_t dest_off, + userptr_t src, off_t src_off, + size_t len ) { + trivial_memmove_user ( dest, dest_off, src, src_off, len ); } static inline __always_inline int -UACCESS_INLINE(linux, memcmp_user)(userptr_t first, off_t first_off, userptr_t second, off_t second_off, size_t len) -{ - return trivial_memcmp_user(first, first_off, second, second_off, len); +UACCESS_INLINE ( linux, memcmp_user ) ( userptr_t first, off_t first_off, + userptr_t second, off_t second_off, + size_t len ) { + return trivial_memcmp_user ( first, first_off, second, second_off, len); } static inline __always_inline void -UACCESS_INLINE(linux, memset_user)(userptr_t buffer, off_t offset, int c, size_t len) -{ - trivial_memset_user(buffer, offset, c, len); +UACCESS_INLINE ( linux, memset_user ) ( userptr_t buffer, off_t offset, + int c, size_t len ) { + trivial_memset_user ( buffer, offset, c, len ); } static inline __always_inline size_t -UACCESS_INLINE(linux, strlen_user)(userptr_t buffer, off_t offset) -{ - return trivial_strlen_user(buffer, offset); +UACCESS_INLINE ( linux, strlen_user ) ( userptr_t buffer, off_t offset ) { + return trivial_strlen_user ( buffer, offset ); } static inline __always_inline off_t -UACCESS_INLINE(linux, memchr_user)(userptr_t buffer, off_t offset, int c, size_t len) -{ - return trivial_memchr_user(buffer, offset, c, len); +UACCESS_INLINE ( linux, memchr_user ) ( userptr_t buffer, off_t offset, + int c, size_t len ) { + return trivial_memchr_user ( buffer, offset, c, len ); } #endif /* _IPXE_LINUX_UACCESS_H */ diff --git a/src/include/ipxe/linux/linux_umalloc.h b/src/include/ipxe/linux/linux_umalloc.h index 4de55ecf..1811d0bc 100644 --- a/src/include/ipxe/linux/linux_umalloc.h +++ b/src/include/ipxe/linux/linux_umalloc.h @@ -1,14 +1,14 @@ #ifndef _IPXE_LINUX_UMALLOC_H #define _IPXE_LINUX_UMALLOC_H -FILE_LICENCE(GPL2_OR_LATER); - /** @file * - * iPXE user memory allocation API for linux + * iPXE user memory allocation API for Linux * */ +FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); + #ifdef UMALLOC_LINUX #define UMALLOC_PREFIX_linux #else diff --git a/src/interface/linux/linux_uaccess.c b/src/interface/linux/linux_uaccess.c index 5ab0b6b6..ea2d8057 100644 --- a/src/interface/linux/linux_uaccess.c +++ b/src/interface/linux/linux_uaccess.c @@ -27,7 +27,6 @@ FILE_LICENCE(GPL2_OR_LATER); * */ -PROVIDE_UACCESS_INLINE(linux, phys_to_user); PROVIDE_UACCESS_INLINE(linux, user_to_phys); PROVIDE_UACCESS_INLINE(linux, virt_to_user); PROVIDE_UACCESS_INLINE(linux, user_to_virt);