summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgjb <gjb@FreeBSD.org>2016-02-09 01:42:51 +0000
committergjb <gjb@FreeBSD.org>2016-02-09 01:42:51 +0000
commit208df68c342bd7992809fd2031bdf6f79103c169 (patch)
tree70f0e618229555b31fa72c4654cd22149f40460b
parentb476e226293d7eb7ef660ad6de4da7b187a2966a (diff)
downloadFreeBSD-src-208df68c342bd7992809fd2031bdf6f79103c169.zip
FreeBSD-src-208df68c342bd7992809fd2031bdf6f79103c169.tar.gz
MFH
Sponsored by: The FreeBSD Foundation
-rw-r--r--lib/libc/gen/elf_utils.c11
-rw-r--r--lib/libc/include/libc_private.h2
-rw-r--r--lib/libc/sys/interposing_table.c1
-rw-r--r--lib/libthr/pthread.map2
-rw-r--r--lib/libthr/thread/thr_private.h2
-rw-r--r--lib/libthr/thread/thr_stack.c3
-rw-r--r--lib/libthr/thread/thr_syscalls.c1
-rwxr-xr-xshare/examples/jails/jib63
-rwxr-xr-xshare/examples/jails/jng48
-rw-r--r--sys/boot/Makefile.inc8
-rw-r--r--sys/boot/efi/loader/arch/arm/ldscript.arm4
-rw-r--r--sys/boot/efi/loader/main.c96
-rw-r--r--sys/boot/ficl/words.c4
-rw-r--r--sys/boot/i386/Makefile4
-rw-r--r--sys/cam/scsi/scsi_xpt.c2
-rw-r--r--sys/conf/kmod.mk4
-rw-r--r--sys/kern/init_main.c2
-rw-r--r--sys/kern/kern_fork.c2
-rw-r--r--targets/pseudo/userland/misc/Makefile.depend1
19 files changed, 217 insertions, 43 deletions
diff --git a/lib/libc/gen/elf_utils.c b/lib/libc/gen/elf_utils.c
index 069f62e..80ab013 100644
--- a/lib/libc/gen/elf_utils.c
+++ b/lib/libc/gen/elf_utils.c
@@ -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])();
+}
diff --git a/lib/libc/include/libc_private.h b/lib/libc/include/libc_private.h
index 5caf9a3..8ee77d9 100644
--- a/lib/libc/include/libc_private.h
+++ b/lib/libc/include/libc_private.h
@@ -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);
diff --git a/lib/libc/sys/interposing_table.c b/lib/libc/sys/interposing_table.c
index 08dfbb1..75bb280 100644
--- a/lib/libc/sys/interposing_table.c
+++ b/lib/libc/sys/interposing_table.c
@@ -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
diff --git a/lib/libthr/pthread.map b/lib/libthr/pthread.map
index 0903989..9fb72eb 100644
--- a/lib/libthr/pthread.map
+++ b/lib/libthr/pthread.map
@@ -295,8 +295,6 @@ FBSDprivate_1.0 {
_thread_size_key;
_thread_state_running;
_thread_state_zoombie;
-
- __pthread_map_stacks_exec;
};
FBSD_1.1 {
diff --git a/lib/libthr/thread/thr_private.h b/lib/libthr/thread/thr_private.h
index 0ba123d..6020e07 100644
--- a/lib/libthr/thread/thr_private.h
+++ b/lib/libthr/thread/thr_private.h
@@ -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);
diff --git a/lib/libthr/thread/thr_stack.c b/lib/libthr/thread/thr_stack.c
index e5d149e..74e1329 100644
--- a/lib/libthr/thread/thr_stack.c
+++ b/lib/libthr/thread/thr_stack.c
@@ -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;
diff --git a/lib/libthr/thread/thr_syscalls.c b/lib/libthr/thread/thr_syscalls.c
index 7c05697..712249b 100644
--- a/lib/libthr/thread/thr_syscalls.c
+++ b/lib/libthr/thread/thr_syscalls.c
@@ -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)) =
diff --git a/share/examples/jails/jib b/share/examples/jails/jib
index 540df09..237db12 100755
--- a/share/examples/jails/jib
+++ b/share/examples/jails/jib
@@ -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()
{
diff --git a/share/examples/jails/jng b/share/examples/jails/jng
index 605db90..7a9710f 100755
--- a/share/examples/jails/jng
+++ b/share/examples/jails/jng
@@ -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
diff --git a/sys/boot/Makefile.inc b/sys/boot/Makefile.inc
index 3545446..17088d7 100644
--- a/sys/boot/Makefile.inc
+++ b/sys/boot/Makefile.inc
@@ -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
diff --git a/sys/boot/efi/loader/arch/arm/ldscript.arm b/sys/boot/efi/loader/arch/arm/ldscript.arm
index 4dcf302..8b4a6dc 100644
--- a/sys/boot/efi/loader/arch/arm/ldscript.arm
+++ b/sys/boot/efi/loader/arch/arm/ldscript.arm
@@ -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
diff --git a/sys/boot/efi/loader/main.c b/sys/boot/efi/loader/main.c
index 4c3bc7a..361d3bb 100644
--- a/sys/boot/efi/loader/main.c
+++ b/sys/boot/efi/loader/main.c
@@ -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;
diff --git a/sys/boot/ficl/words.c b/sys/boot/ficl/words.c
index c32e352..0e8f2c4 100644
--- a/sys/boot/ficl/words.c
+++ b/sys/boot/ficl/words.c
@@ -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
diff --git a/sys/boot/i386/Makefile b/sys/boot/i386/Makefile
index d812d54..0c3daed 100644
--- a/sys/boot/i386/Makefile
+++ b/sys/boot/i386/Makefile
@@ -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
diff --git a/sys/cam/scsi/scsi_xpt.c b/sys/cam/scsi/scsi_xpt.c
index 7cffd67..c0cc310 100644
--- a/sys/cam/scsi/scsi_xpt.c
+++ b/sys/cam/scsi/scsi_xpt.c
@@ -1518,7 +1518,7 @@ out:
} 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,
diff --git a/sys/conf/kmod.mk b/sys/conf/kmod.mk
index a79fe96..c0f034e 100644
--- a/sys/conf/kmod.mk
+++ b/sys/conf/kmod.mk
@@ -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.
diff --git a/sys/kern/init_main.c b/sys/kern/init_main.c
index d5f8f4d..d157d24 100644
--- a/sys/kern/init_main.c
+++ b/sys/kern/init_main.c
@@ -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);
diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c
index 9abe08c..34af264 100644
--- a/sys/kern/kern_fork.c
+++ b/sys/kern/kern_fork.c
@@ -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);
diff --git a/targets/pseudo/userland/misc/Makefile.depend b/targets/pseudo/userland/misc/Makefile.depend
index 6d46af1..c186f6d 100644
--- a/targets/pseudo/userland/misc/Makefile.depend
+++ b/targets/pseudo/userland/misc/Makefile.depend
@@ -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 \
OpenPOWER on IntegriCloud