xref: /OK3568_Linux_fs/kernel/tools/testing/selftests/rcutorture/bin/mkinitrd.sh (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun#!/bin/bash
2*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0+
3*4882a593Smuzhiyun#
4*4882a593Smuzhiyun# Create an initrd directory if one does not already exist.
5*4882a593Smuzhiyun#
6*4882a593Smuzhiyun# Copyright (C) IBM Corporation, 2013
7*4882a593Smuzhiyun#
8*4882a593Smuzhiyun# Author: Connor Shu <Connor.Shu@ibm.com>
9*4882a593Smuzhiyun
10*4882a593SmuzhiyunD=tools/testing/selftests/rcutorture
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun# Prerequisite checks
13*4882a593Smuzhiyun[ -z "$D" ] && echo >&2 "No argument supplied" && exit 1
14*4882a593Smuzhiyunif [ ! -d "$D" ]; then
15*4882a593Smuzhiyun    echo >&2 "$D does not exist: Malformed kernel source tree?"
16*4882a593Smuzhiyun    exit 1
17*4882a593Smuzhiyunfi
18*4882a593Smuzhiyunif [ -s "$D/initrd/init" ]; then
19*4882a593Smuzhiyun    echo "$D/initrd/init already exists, no need to create it"
20*4882a593Smuzhiyun    exit 0
21*4882a593Smuzhiyunfi
22*4882a593Smuzhiyun
23*4882a593Smuzhiyun# Create a C-language initrd/init infinite-loop program and statically
24*4882a593Smuzhiyun# link it.  This results in a very small initrd.
25*4882a593Smuzhiyunecho "Creating a statically linked C-language initrd"
26*4882a593Smuzhiyuncd $D
27*4882a593Smuzhiyunmkdir -p initrd
28*4882a593Smuzhiyuncd initrd
29*4882a593Smuzhiyuncat > init.c << '___EOF___'
30*4882a593Smuzhiyun#ifndef NOLIBC
31*4882a593Smuzhiyun#include <unistd.h>
32*4882a593Smuzhiyun#include <sys/time.h>
33*4882a593Smuzhiyun#endif
34*4882a593Smuzhiyun
35*4882a593Smuzhiyunvolatile unsigned long delaycount;
36*4882a593Smuzhiyun
37*4882a593Smuzhiyunint main(int argc, int argv[])
38*4882a593Smuzhiyun{
39*4882a593Smuzhiyun	int i;
40*4882a593Smuzhiyun	struct timeval tv;
41*4882a593Smuzhiyun	struct timeval tvb;
42*4882a593Smuzhiyun
43*4882a593Smuzhiyun	for (;;) {
44*4882a593Smuzhiyun		sleep(1);
45*4882a593Smuzhiyun		/* Need some userspace time. */
46*4882a593Smuzhiyun		if (gettimeofday(&tvb, NULL))
47*4882a593Smuzhiyun			continue;
48*4882a593Smuzhiyun		do {
49*4882a593Smuzhiyun			for (i = 0; i < 1000 * 100; i++)
50*4882a593Smuzhiyun				delaycount = i * i;
51*4882a593Smuzhiyun			if (gettimeofday(&tv, NULL))
52*4882a593Smuzhiyun				break;
53*4882a593Smuzhiyun			tv.tv_sec -= tvb.tv_sec;
54*4882a593Smuzhiyun			if (tv.tv_sec > 1)
55*4882a593Smuzhiyun				break;
56*4882a593Smuzhiyun			tv.tv_usec += tv.tv_sec * 1000 * 1000;
57*4882a593Smuzhiyun			tv.tv_usec -= tvb.tv_usec;
58*4882a593Smuzhiyun		} while (tv.tv_usec < 1000);
59*4882a593Smuzhiyun	}
60*4882a593Smuzhiyun	return 0;
61*4882a593Smuzhiyun}
62*4882a593Smuzhiyun___EOF___
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun# build using nolibc on supported archs (smaller executable) and fall
65*4882a593Smuzhiyun# back to regular glibc on other ones.
66*4882a593Smuzhiyunif echo -e "#if __x86_64__||__i386__||__i486__||__i586__||__i686__" \
67*4882a593Smuzhiyun           "||__ARM_EABI__||__aarch64__\nyes\n#endif" \
68*4882a593Smuzhiyun   | ${CROSS_COMPILE}gcc -E -nostdlib -xc - \
69*4882a593Smuzhiyun   | grep -q '^yes'; then
70*4882a593Smuzhiyun	# architecture supported by nolibc
71*4882a593Smuzhiyun        ${CROSS_COMPILE}gcc -fno-asynchronous-unwind-tables -fno-ident \
72*4882a593Smuzhiyun		-nostdlib -include ../../../../include/nolibc/nolibc.h \
73*4882a593Smuzhiyun		-lgcc -s -static -Os -o init init.c
74*4882a593Smuzhiyunelse
75*4882a593Smuzhiyun	${CROSS_COMPILE}gcc -s -static -Os -o init init.c
76*4882a593Smuzhiyunfi
77*4882a593Smuzhiyun
78*4882a593Smuzhiyunrm init.c
79*4882a593Smuzhiyunecho "Done creating a statically linked C-language initrd"
80*4882a593Smuzhiyun
81*4882a593Smuzhiyunexit 0
82