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