MFH
Sponsored by: The FreeBSD Foundation
This commit is contained in:
commit
acbbf33c47
@ -32,6 +32,7 @@
|
||||
#include <sys/sysctl.h>
|
||||
#include <link.h>
|
||||
#include <stddef.h>
|
||||
#include "libc_private.h"
|
||||
|
||||
int __elf_phdr_match_addr(struct dl_phdr_info *, void *);
|
||||
void __pthread_map_stacks_exec(void);
|
||||
@ -54,9 +55,8 @@ __elf_phdr_match_addr(struct dl_phdr_info *phdr_info, void *addr)
|
||||
return (i != phdr_info->dlpi_phnum);
|
||||
}
|
||||
|
||||
#pragma weak __pthread_map_stacks_exec
|
||||
void
|
||||
__pthread_map_stacks_exec(void)
|
||||
__libc_map_stacks_exec(void)
|
||||
{
|
||||
int mib[2];
|
||||
struct rlimit rlim;
|
||||
@ -75,3 +75,10 @@ __pthread_map_stacks_exec(void)
|
||||
rlim.rlim_cur, _rtld_get_stack_prot());
|
||||
}
|
||||
|
||||
#pragma weak __pthread_map_stacks_exec
|
||||
void
|
||||
__pthread_map_stacks_exec(void)
|
||||
{
|
||||
|
||||
((void (*)(void))__libc_interposing[INTERPOS_map_stacks_exec])();
|
||||
}
|
||||
|
@ -224,6 +224,7 @@ enum {
|
||||
INTERPOS_kevent,
|
||||
INTERPOS_wait6,
|
||||
INTERPOS_ppoll,
|
||||
INTERPOS_map_stacks_exec,
|
||||
INTERPOS_MAX
|
||||
};
|
||||
|
||||
@ -381,6 +382,7 @@ int _elf_aux_info(int aux, void *buf, int buflen);
|
||||
struct dl_phdr_info;
|
||||
int __elf_phdr_match_addr(struct dl_phdr_info *, void *);
|
||||
void __init_elf_aux_vector(void);
|
||||
void __libc_map_stacks_exec(void);
|
||||
|
||||
void _pthread_cancel_enter(int);
|
||||
void _pthread_cancel_leave(int);
|
||||
|
@ -78,6 +78,7 @@ interpos_func_t __libc_interposing[INTERPOS_MAX] = {
|
||||
SLOT(kevent, __sys_kevent),
|
||||
SLOT(wait6, __sys_wait6),
|
||||
SLOT(ppoll, __sys_ppoll),
|
||||
SLOT(map_stacks_exec, __libc_map_stacks_exec),
|
||||
};
|
||||
#undef SLOT
|
||||
|
||||
|
@ -295,8 +295,6 @@ FBSDprivate_1.0 {
|
||||
_thread_size_key;
|
||||
_thread_state_running;
|
||||
_thread_state_zoombie;
|
||||
|
||||
__pthread_map_stacks_exec;
|
||||
};
|
||||
|
||||
FBSD_1.1 {
|
||||
|
@ -927,6 +927,8 @@ int __thr_sigwait(const sigset_t *set, int *sig);
|
||||
int __thr_sigwaitinfo(const sigset_t *set, siginfo_t *info);
|
||||
int __thr_swapcontext(ucontext_t *oucp, const ucontext_t *ucp);
|
||||
|
||||
void __thr_map_stacks_exec(void);
|
||||
|
||||
struct _spinlock;
|
||||
void __thr_spinunlock(struct _spinlock *lck);
|
||||
void __thr_spinlock(struct _spinlock *lck);
|
||||
|
@ -161,9 +161,8 @@ singlethread_map_stacks_exec(void)
|
||||
rlim.rlim_cur, _rtld_get_stack_prot());
|
||||
}
|
||||
|
||||
void __pthread_map_stacks_exec(void);
|
||||
void
|
||||
__pthread_map_stacks_exec(void)
|
||||
__thr_map_stacks_exec(void)
|
||||
{
|
||||
struct pthread *curthread, *thrd;
|
||||
struct stack *st;
|
||||
|
@ -652,6 +652,7 @@ __thr_interpose_libc(void)
|
||||
SLOT(kevent);
|
||||
SLOT(wait6);
|
||||
SLOT(ppoll);
|
||||
SLOT(map_stacks_exec);
|
||||
#undef SLOT
|
||||
*(__libc_interposing_slot(
|
||||
INTERPOS__pthread_mutex_init_calloc_cb)) =
|
||||
|
@ -33,7 +33,11 @@
|
||||
############################################################ INFORMATION
|
||||
#
|
||||
# Use this tool with jail.conf(5) (or rc.conf(5) ``legacy'' configuration) to
|
||||
# manage `vnet' interfaces. In jail.conf(5) format:
|
||||
# manage `vnet' interfaces for jails. Designed to automate the creation of vnet
|
||||
# interface(s) during jail `prestart' and destroy said interface(s) during jail
|
||||
# `poststop'.
|
||||
#
|
||||
# In jail.conf(5) format:
|
||||
#
|
||||
# ### BEGIN EXCERPT ###
|
||||
#
|
||||
@ -223,32 +227,37 @@ jib_addm()
|
||||
# 6. Set the MAC address of the new interface using a sensible
|
||||
# algorithm to prevent conflicts on the network.
|
||||
#
|
||||
# The formula I'm using is ``SP:SS:SI:II:II:II'' where:
|
||||
# + S denotes 16 bits of sum(1) data, split because P (below).
|
||||
# The formula I'm using is ``NP:SS:SS:II:II:II'' where:
|
||||
# + N denotes 4 bits used as a counter to support branching
|
||||
# each parent interface up to 15 times under the same jail
|
||||
# name (see S below).
|
||||
# + P denotes the special nibble whose value, if one of
|
||||
# 2, 6, A, or E (but usually 2) denotes a privately
|
||||
# administered MAC address (while remaining routable).
|
||||
# + S denotes 16 bits, the sum(1) value of the jail name.
|
||||
# + I denotes bits that are inherited from parent interface.
|
||||
#
|
||||
# The S bits are a CRC-16 checksum of NAME, allowing the jail
|
||||
# to change the epair(4) generation order without affecting the
|
||||
# MAC address. Meanwhile, if the jail NAME changes (e.g., it
|
||||
# was duplicated and given a new name with no other changes),
|
||||
# the underlying network interface changes, or the jail is
|
||||
# moved to another host, the MAC address will be recalculated
|
||||
# to a new, similarly unique value preventing conflict.
|
||||
# MAC address. Meanwhile, if...
|
||||
# + the jail NAME changes (e.g., it was duplicated and given
|
||||
# a new name with no other changes)
|
||||
# + the underlying network interface changes
|
||||
# + the jail is moved to another host
|
||||
# the MAC address will be recalculated to a new, similarly
|
||||
# unique value preventing conflict.
|
||||
#
|
||||
iface_devid=$( ifconfig $iface ether | awk '/ether/,$0=$2' )
|
||||
eiface_devid_a=${iface_devid#??:??:?}
|
||||
eiface_devid_b=${iface_devid#??:??:?}
|
||||
eiface_devid_a=${iface_devid#??:??:??}
|
||||
eiface_devid_b=${iface_devid#??:??:??}
|
||||
num=$( set -- `echo -n $name | sum` && echo $1 )
|
||||
quad=$(( $num & 15 ))
|
||||
case "$quad" in
|
||||
10) quad=a ;; 11) quad=b ;; 12) quad=c ;;
|
||||
13) quad=d ;; 14) quad=e ;; 15) quad=f ;;
|
||||
esac
|
||||
eiface_devid_a=:$quad$eiface_devid_a
|
||||
eiface_devid_b=:$quad$eiface_devid_b
|
||||
eiface_devid_a=$quad$eiface_devid_a
|
||||
eiface_devid_b=$quad$eiface_devid_b
|
||||
num=$(( $num >> 4 ))
|
||||
quad=$(( $num & 15 ))
|
||||
case "$quad" in
|
||||
@ -263,27 +272,49 @@ jib_addm()
|
||||
10) quad=a ;; 11) quad=b ;; 12) quad=c ;;
|
||||
13) quad=d ;; 14) quad=e ;; 15) quad=f ;;
|
||||
esac
|
||||
eiface_devid_a=2:$quad$eiface_devid_a
|
||||
eiface_devid_b=6:$quad$eiface_devid_b
|
||||
eiface_devid_a=$quad:$eiface_devid_a
|
||||
eiface_devid_b=$quad:$eiface_devid_b
|
||||
num=$(( $num >> 4 ))
|
||||
quad=$(( $num & 15 ))
|
||||
case "$quad" in
|
||||
10) quad=a ;; 11) quad=b ;; 12) quad=c ;;
|
||||
13) quad=d ;; 14) quad=e ;; 15) quad=f ;;
|
||||
esac
|
||||
case "$iface_devid" in
|
||||
?2:*|?6:*)
|
||||
eiface_devid_a=a:$quad$eiface_devid_a
|
||||
eiface_devid_b=e:$quad$eiface_devid_b
|
||||
;;
|
||||
*)
|
||||
eiface_devid_a=2:$quad$eiface_devid_a
|
||||
eiface_devid_b=6:$quad$eiface_devid_b
|
||||
esac
|
||||
eval num=\$_${iface}_num
|
||||
if [ "$num" ]; then
|
||||
num=$(( $num + 1 ))
|
||||
eval _${iface}_num=$num
|
||||
else
|
||||
num=0
|
||||
local _${iface}_num=$num
|
||||
fi
|
||||
quad=$(( $num & 15 ))
|
||||
case "$quad" in
|
||||
10) quad=a ;; 11) quad=b ;; 12) quad=c ;;
|
||||
13) quad=d ;; 14) quad=e ;; 15) quad=f ;;
|
||||
esac
|
||||
eiface_devid_a=$quad$eiface_devid_a
|
||||
eiface_devid_b=$quad$eiface_devid_b
|
||||
ifconfig "e${i}a_$name" ether $eiface_devid_a > /dev/null 2>&1
|
||||
ifconfig "e${i}b_$name" ether $eiface_devid_b > /dev/null 2>&1
|
||||
|
||||
i=$(( $i + 1 )) # on to next ng{i}_name
|
||||
i=$(( $i + 1 )) # on to next e{i}b_name
|
||||
done # for iface
|
||||
}
|
||||
|
||||
jib_show_usage="show"
|
||||
jib_show_descr="List possible NAME values for \`show NAME'"
|
||||
jib_show1_usage="show NAME"
|
||||
jib_show1_descr="Lists ng0_NAME [ng1_NAME ...]"
|
||||
jib_show1_descr="Lists e0b_NAME [e1b_NAME ...]"
|
||||
jib_show2_usage="show [NAME]"
|
||||
jib_show()
|
||||
{
|
||||
|
@ -33,7 +33,11 @@
|
||||
############################################################ INFORMATION
|
||||
#
|
||||
# Use this tool with jail.conf(5) (or rc.conf(5) ``legacy'' configuration) to
|
||||
# manage `vnet' interfaces. In jail.conf(5) format:
|
||||
# manage `vnet' interfaces for jails. Designed to automate the creation of vnet
|
||||
# interface(s) during jail `prestart' and destroy said interface(s) during jail
|
||||
# `poststop'.
|
||||
#
|
||||
# In jail.conf(5) format:
|
||||
#
|
||||
# ### BEGIN EXCERPT ###
|
||||
#
|
||||
@ -256,30 +260,35 @@ jng_bridge()
|
||||
# 6. Set the MAC address of the new interface using a sensible
|
||||
# algorithm to prevent conflicts on the network.
|
||||
#
|
||||
# The formula I'm using is ``SP:SS:SI:II:II:II'' where:
|
||||
# + S denotes 16 bits of sum(1) data, split because P (below).
|
||||
# The formula I'm using is ``NP:SS:SS:II:II:II'' where:
|
||||
# + N denotes 4 bits used as a counter to support branching
|
||||
# each parent interface up to 15 times under the same jail
|
||||
# name (see S below).
|
||||
# + P denotes the special nibble whose value, if one of
|
||||
# 2, 6, A, or E (but usually 2) denotes a privately
|
||||
# administered MAC address (while remaining routable).
|
||||
# + S denotes 16 bits, the sum(1) value of the jail name.
|
||||
# + I denotes bits that are inherited from parent interface.
|
||||
#
|
||||
# The S bits are a CRC-16 checksum of NAME, allowing the jail
|
||||
# to change link numbers in ng_bridge(4) without affecting the
|
||||
# MAC address. Meanwhile, if the jail NAME changes (e.g., it
|
||||
# was duplicated and given a new name with no other changes),
|
||||
# the underlying network interface changes, or the jail is
|
||||
# moved to another host, the MAC address will be recalculated
|
||||
# to a new, similarly unique value preventing conflict.
|
||||
# MAC address. Meanwhile, if...
|
||||
# + the jail NAME changes (e.g., it was duplicated and given
|
||||
# a new name with no other changes)
|
||||
# + the underlying network interface changes
|
||||
# + the jail is moved to another host
|
||||
# the MAC address will be recalculated to a new, similarly
|
||||
# unique value preventing conflict.
|
||||
#
|
||||
iface_devid=$( ifconfig $iface ether | awk '/ether/,$0=$2' )
|
||||
eiface_devid=${iface_devid#??:??:?}
|
||||
eiface_devid=${iface_devid#??:??:??}
|
||||
num=$( set -- `echo -n $name | sum` && echo $1 )
|
||||
quad=$(( $num & 15 ))
|
||||
case "$quad" in
|
||||
10) quad=a ;; 11) quad=b ;; 12) quad=c ;;
|
||||
13) quad=d ;; 14) quad=e ;; 15) quad=f ;;
|
||||
esac
|
||||
eiface_devid=:$quad$eiface_devid
|
||||
eiface_devid=$quad$eiface_devid
|
||||
num=$(( $num >> 4 ))
|
||||
quad=$(( $num & 15 ))
|
||||
case "$quad" in
|
||||
@ -293,13 +302,30 @@ jng_bridge()
|
||||
10) quad=a ;; 11) quad=b ;; 12) quad=c ;;
|
||||
13) quad=d ;; 14) quad=e ;; 15) quad=f ;;
|
||||
esac
|
||||
eiface_devid=2:$quad$eiface_devid
|
||||
eiface_devid=$quad:$eiface_devid
|
||||
num=$(( $num >> 4 ))
|
||||
quad=$(( $num & 15 ))
|
||||
case "$quad" in
|
||||
10) quad=a ;; 11) quad=b ;; 12) quad=c ;;
|
||||
13) quad=d ;; 14) quad=e ;; 15) quad=f ;;
|
||||
esac
|
||||
case "$iface_devid" in
|
||||
?2:*) eiface_devid=a:$quad$eiface_devid ;;
|
||||
*) eiface_devid=2:$quad$eiface_devid
|
||||
esac
|
||||
eval num=\$_${iface}_num
|
||||
if [ "$num" ]; then
|
||||
num=$(( $num + 1 ))
|
||||
eval _${iface}_num=$num
|
||||
else
|
||||
num=0
|
||||
local _${iface}_num=$num
|
||||
fi
|
||||
quad=$(( $num & 15 ))
|
||||
case "$quad" in
|
||||
10) quad=a ;; 11) quad=b ;; 12) quad=c ;;
|
||||
13) quad=d ;; 14) quad=e ;; 15) quad=f ;;
|
||||
esac
|
||||
eiface_devid=$quad$eiface_devid
|
||||
ifconfig $eiface ether $eiface_devid > /dev/null 2>&1
|
||||
|
||||
|
@ -1,3 +1,11 @@
|
||||
# $FreeBSD$
|
||||
|
||||
SSP_CFLAGS=
|
||||
|
||||
.if ${MACHINE_CPUARCH} == "arm"
|
||||
# Do not generate movt/movw, because the relocation fixup for them does not
|
||||
# translate to the -Bsymbolic -pie format required by self_reloc() in loader(8).
|
||||
# Also, the fpu is not available in a standalone environment.
|
||||
CFLAGS.clang+= -mllvm -arm-use-movt=0
|
||||
CFLAGS.clang+= -mfpu=none
|
||||
.endif
|
||||
|
@ -15,7 +15,7 @@ SECTIONS
|
||||
} =0
|
||||
_etext = .;
|
||||
PROVIDE (etext = .);
|
||||
. = ALIGN(4096);
|
||||
. = ALIGN(16);
|
||||
.data :
|
||||
{
|
||||
*(.data *.data.*)
|
||||
@ -24,6 +24,7 @@ SECTIONS
|
||||
*(.rodata.*)
|
||||
CONSTRUCTORS
|
||||
|
||||
. = ALIGN(4);
|
||||
PROVIDE (__bss_start = .);
|
||||
*(.sbss)
|
||||
*(.scommon)
|
||||
@ -31,6 +32,7 @@ SECTIONS
|
||||
*(.dynbss)
|
||||
*(.bss)
|
||||
*(COMMON)
|
||||
. = ALIGN(4);
|
||||
PROVIDE (__bss_end = .);
|
||||
}
|
||||
/* We want the small data sections together, so single-instruction offsets
|
||||
|
@ -66,6 +66,7 @@ EFI_GUID hoblist = HOB_LIST_TABLE_GUID;
|
||||
EFI_GUID memtype = MEMORY_TYPE_INFORMATION_TABLE_GUID;
|
||||
EFI_GUID debugimg = DEBUG_IMAGE_INFO_TABLE_GUID;
|
||||
EFI_GUID fdtdtb = FDT_TABLE_GUID;
|
||||
EFI_GUID inputid = SIMPLE_TEXT_INPUT_PROTOCOL;
|
||||
|
||||
#ifdef EFI_ZFS_BOOT
|
||||
static void efi_zfs_probe(void);
|
||||
@ -94,6 +95,88 @@ cp16to8(const CHAR16 *src, char *dst, size_t len)
|
||||
dst[i] = (char)src[i];
|
||||
}
|
||||
|
||||
static int
|
||||
has_keyboard(void)
|
||||
{
|
||||
EFI_STATUS status;
|
||||
EFI_DEVICE_PATH *path;
|
||||
EFI_HANDLE *hin, *hin_end, *walker;
|
||||
UINTN sz;
|
||||
int retval = 0;
|
||||
|
||||
/*
|
||||
* Find all the handles that support the SIMPLE_TEXT_INPUT_PROTOCOL and
|
||||
* do the typical dance to get the right sized buffer.
|
||||
*/
|
||||
sz = 0;
|
||||
hin = NULL;
|
||||
status = BS->LocateHandle(ByProtocol, &inputid, 0, &sz, 0);
|
||||
if (status == EFI_BUFFER_TOO_SMALL) {
|
||||
hin = (EFI_HANDLE *)malloc(sz);
|
||||
status = BS->LocateHandle(ByProtocol, &inputid, 0, &sz,
|
||||
hin);
|
||||
if (EFI_ERROR(status))
|
||||
free(hin);
|
||||
}
|
||||
if (EFI_ERROR(status))
|
||||
return retval;
|
||||
|
||||
/*
|
||||
* Look at each of the handles. If it supports the device path protocol,
|
||||
* use it to get the device path for this handle. Then see if that
|
||||
* device path matches either the USB device path for keyboards or the
|
||||
* legacy device path for keyboards.
|
||||
*/
|
||||
hin_end = &hin[sz / sizeof(*hin)];
|
||||
for (walker = hin; walker < hin_end; walker++) {
|
||||
status = BS->HandleProtocol(*walker, &devid, (VOID **)&path);
|
||||
if (EFI_ERROR(status))
|
||||
continue;
|
||||
|
||||
while (!IsDevicePathEnd(path)) {
|
||||
/*
|
||||
* Check for the ACPI keyboard node. All PNP3xx nodes
|
||||
* are keyboards of different flavors. Note: It is
|
||||
* unclear of there's always a keyboard node when
|
||||
* there's a keyboard controller, or if there's only one
|
||||
* when a keyboard is detected at boot.
|
||||
*/
|
||||
if (DevicePathType(path) == ACPI_DEVICE_PATH &&
|
||||
(DevicePathSubType(path) == ACPI_DP ||
|
||||
DevicePathSubType(path) == ACPI_EXTENDED_DP)) {
|
||||
ACPI_HID_DEVICE_PATH *acpi;
|
||||
|
||||
acpi = (ACPI_HID_DEVICE_PATH *)(void *)path;
|
||||
if ((EISA_ID_TO_NUM(acpi->HID) & 0xff00) == 0x300 &&
|
||||
(acpi->HID & 0xffff) == PNP_EISA_ID_CONST) {
|
||||
retval = 1;
|
||||
goto out;
|
||||
}
|
||||
/*
|
||||
* Check for USB keyboard node, if present. Unlike a
|
||||
* PS/2 keyboard, these definitely only appear when
|
||||
* connected to the system.
|
||||
*/
|
||||
} else if (DevicePathType(path) == MESSAGING_DEVICE_PATH &&
|
||||
DevicePathSubType(path) == MSG_USB_CLASS_DP) {
|
||||
USB_CLASS_DEVICE_PATH *usb;
|
||||
|
||||
usb = (USB_CLASS_DEVICE_PATH *)(void *)path;
|
||||
if (usb->DeviceClass == 3 && /* HID */
|
||||
usb->DeviceSubClass == 1 && /* Boot devices */
|
||||
usb->DeviceProtocol == 1) { /* Boot keyboards */
|
||||
retval = 1;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
path = NextDevicePathNode(path);
|
||||
}
|
||||
}
|
||||
out:
|
||||
free(hin);
|
||||
return retval;
|
||||
}
|
||||
|
||||
EFI_STATUS
|
||||
main(int argc, CHAR16 *argv[])
|
||||
{
|
||||
@ -104,6 +187,7 @@ main(int argc, CHAR16 *argv[])
|
||||
struct devsw *dev;
|
||||
uint64_t pool_guid;
|
||||
UINTN k;
|
||||
int has_kbd;
|
||||
|
||||
archsw.arch_autoload = efi_autoload;
|
||||
archsw.arch_getdev = efi_getdev;
|
||||
@ -115,6 +199,8 @@ main(int argc, CHAR16 *argv[])
|
||||
archsw.arch_zfs_probe = efi_zfs_probe;
|
||||
#endif
|
||||
|
||||
has_kbd = has_keyboard();
|
||||
|
||||
/*
|
||||
* XXX Chicken-and-egg problem; we want to have console output
|
||||
* early, but some console attributes may depend on reading from
|
||||
@ -150,15 +236,19 @@ main(int argc, CHAR16 *argv[])
|
||||
case 'D':
|
||||
howto |= RB_MULTIPLE;
|
||||
break;
|
||||
case 'm':
|
||||
howto |= RB_MUTE;
|
||||
break;
|
||||
case 'h':
|
||||
howto |= RB_SERIAL;
|
||||
break;
|
||||
case 'm':
|
||||
howto |= RB_MUTE;
|
||||
break;
|
||||
case 'p':
|
||||
howto |= RB_PAUSE;
|
||||
break;
|
||||
case 'P':
|
||||
if (!has_kbd)
|
||||
howto |= RB_SERIAL | RB_MULTIPLE;
|
||||
break;
|
||||
case 'r':
|
||||
howto |= RB_DFLTROOT;
|
||||
break;
|
||||
|
@ -4822,7 +4822,7 @@ WORDKIND ficlWordClassify(FICL_WORD *pFW)
|
||||
**************************************************************************/
|
||||
static void ficlRandom(FICL_VM *pVM)
|
||||
{
|
||||
PUSHINT(rand());
|
||||
PUSHUNS(random());
|
||||
}
|
||||
|
||||
|
||||
@ -4832,7 +4832,7 @@ static void ficlRandom(FICL_VM *pVM)
|
||||
**************************************************************************/
|
||||
static void ficlSeedRandom(FICL_VM *pVM)
|
||||
{
|
||||
srand(POPINT());
|
||||
srandom(POPUNS());
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -8,6 +8,10 @@ SUBDIR= mbr pmbr boot0 boot0sio btx boot2 cdboot gptboot \
|
||||
# special boot programs, 'self-extracting boot2+loader'
|
||||
SUBDIR+= pxeldr
|
||||
|
||||
.if ${MACHINE_CPUARCH} == "i386"
|
||||
SUBDIR+= kgzldr
|
||||
.endif
|
||||
|
||||
.if ${MK_ZFS} != "no"
|
||||
SUBDIR+= zfsboot gptzfsboot zfsloader
|
||||
.endif
|
||||
|
@ -1518,7 +1518,7 @@ probedone(struct cam_periph *periph, union ccb *done_ccb)
|
||||
} else if (cam_periph_error(done_ccb, 0,
|
||||
SF_RETRY_UA,
|
||||
&softc->saved_ccb) == ERESTART) {
|
||||
return;
|
||||
goto outr;
|
||||
} else if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) {
|
||||
/* Don't wedge the queue */
|
||||
xpt_release_devq(done_ccb->ccb_h.path, /*count*/1,
|
||||
|
@ -249,9 +249,11 @@ _ILINKS+=x86
|
||||
.endif
|
||||
CLEANFILES+=${_ILINKS}
|
||||
|
||||
all: objwarn ${PROG}
|
||||
all: beforebuild .WAIT ${PROG}
|
||||
beforebuild: objwarn
|
||||
|
||||
beforedepend: ${_ILINKS}
|
||||
beforebuild: ${_ILINKS}
|
||||
|
||||
# Ensure that the links exist without depending on it when it exists which
|
||||
# causes all the modules to be rebuilt when the directory pointed to changes.
|
||||
|
@ -479,7 +479,7 @@ proc0_init(void *dummy __unused)
|
||||
session0.s_leader = p;
|
||||
|
||||
p->p_sysent = &null_sysvec;
|
||||
p->p_flag = P_SYSTEM | P_INMEM;
|
||||
p->p_flag = P_SYSTEM | P_INMEM | P_KTHREAD;
|
||||
p->p_flag2 = 0;
|
||||
p->p_state = PRS_NORMAL;
|
||||
knlist_init_mtx(&p->p_klist, &p->p_mtx);
|
||||
|
@ -1040,7 +1040,7 @@ fork_exit(void (*callout)(void *, struct trapframe *), void *arg,
|
||||
if (p->p_flag & P_KTHREAD) {
|
||||
printf("Kernel thread \"%s\" (pid %d) exited prematurely.\n",
|
||||
td->td_name, p->p_pid);
|
||||
kproc_exit(0);
|
||||
kthread_exit();
|
||||
}
|
||||
mtx_assert(&Giant, MA_NOTOWNED);
|
||||
|
||||
|
@ -40,6 +40,7 @@ DIRDEPS.x86sys= \
|
||||
sys/boot/i386/btx/lib \
|
||||
sys/boot/i386/cdboot \
|
||||
sys/boot/i386/gptboot \
|
||||
sys/boot/i386/kgzldr \
|
||||
sys/boot/i386/libfirewire \
|
||||
sys/boot/i386/libi386 \
|
||||
sys/boot/i386/loader \
|
||||
|
Loading…
Reference in New Issue
Block a user