This provides a simple interface to trigger the firmware_class loader to test built-in, filesystem, and user helper modes. Additionally adds tests via the new interface to the selftests tree. Signed-off-by: Kees Cook <keescook@chromium.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
		
			
				
	
	
		
			62 lines
		
	
	
	
		
			1.7 KiB
			
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			62 lines
		
	
	
	
		
			1.7 KiB
			
		
	
	
	
		
			Bash
		
	
	
	
	
	
#!/bin/sh
 | 
						|
# This validates that the kernel will load firmware out of its list of
 | 
						|
# firmware locations on disk. Since the user helper does similar work,
 | 
						|
# we reset the custom load directory to a location the user helper doesn't
 | 
						|
# know so we can be sure we're not accidentally testing the user helper.
 | 
						|
set -e
 | 
						|
 | 
						|
modprobe test_firmware
 | 
						|
 | 
						|
DIR=/sys/devices/virtual/misc/test_firmware
 | 
						|
 | 
						|
OLD_TIMEOUT=$(cat /sys/class/firmware/timeout)
 | 
						|
OLD_FWPATH=$(cat /sys/module/firmware_class/parameters/path)
 | 
						|
 | 
						|
FWPATH=$(mktemp -d)
 | 
						|
FW="$FWPATH/test-firmware.bin"
 | 
						|
 | 
						|
test_finish()
 | 
						|
{
 | 
						|
	echo "$OLD_TIMEOUT" >/sys/class/firmware/timeout
 | 
						|
	echo -n "$OLD_PATH" >/sys/module/firmware_class/parameters/path
 | 
						|
	rm -f "$FW"
 | 
						|
	rmdir "$FWPATH"
 | 
						|
}
 | 
						|
 | 
						|
trap "test_finish" EXIT
 | 
						|
 | 
						|
# Turn down the timeout so failures don't take so long.
 | 
						|
echo 1 >/sys/class/firmware/timeout
 | 
						|
# Set the kernel search path.
 | 
						|
echo -n "$FWPATH" >/sys/module/firmware_class/parameters/path
 | 
						|
 | 
						|
# This is an unlikely real-world firmware content. :)
 | 
						|
echo "ABCD0123" >"$FW"
 | 
						|
 | 
						|
NAME=$(basename "$FW")
 | 
						|
 | 
						|
# Request a firmware that doesn't exist, it should fail.
 | 
						|
echo -n "nope-$NAME" >"$DIR"/trigger_request
 | 
						|
if diff -q "$FW" /dev/test_firmware >/dev/null ; then
 | 
						|
	echo "$0: firmware was not expected to match" >&2
 | 
						|
	exit 1
 | 
						|
else
 | 
						|
	echo "$0: timeout works"
 | 
						|
fi
 | 
						|
 | 
						|
# This should succeed via kernel load or will fail after 1 second after
 | 
						|
# being handed over to the user helper, which won't find the fw either.
 | 
						|
if ! echo -n "$NAME" >"$DIR"/trigger_request ; then
 | 
						|
	echo "$0: could not trigger request" >&2
 | 
						|
	exit 1
 | 
						|
fi
 | 
						|
 | 
						|
# Verify the contents are what we expect.
 | 
						|
if ! diff -q "$FW" /dev/test_firmware >/dev/null ; then
 | 
						|
	echo "$0: firmware was not loaded" >&2
 | 
						|
	exit 1
 | 
						|
else
 | 
						|
	echo "$0: filesystem loading works"
 | 
						|
fi
 | 
						|
 | 
						|
exit 0
 |