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