embox

Форк
0
/
auto_qemu 
408 строк · 9.8 Кб
1
#!/usr/bin/env bash
2

3
# Check associative arrays support
4
[ "${BASH_VERSION:0:1}" -ge 4 ] || { echo "Bash 4.0 or later is required"; exit 1; }
5

6
DATADIR="$(dirname "$0")"
7
CONFDIR=./conf
8

9
MODS_CONF=$CONFDIR/mods.conf
10
LDS_CONF=$CONFDIR/lds.conf
11
BUILD_CONF=$CONFDIR/build.conf
12

13
info() {
14
	echo -e "$@" >&2
15
}
16

17
error() {
18
	echo -e "$@" >&2
19
	exit 1
20
}
21

22
guessed_info() {
23
	info "$1": "${!1}" "$2"
24
}
25

26
error_empty() {
27
	if [ -z "${!1}" ]; then
28
		error "$1" is empty
29
	fi
30
}
31

32
get_user_undef_guess() {
33
	label="(got)"
34
	if [ -z "${!1+defined}" ]; then
35
		eval "$1=\"$($2)\""
36
		label="(guessed)"
37
	fi
38
	guessed_info "$1" $label
39
}
40

41
get_user_empty_guess() {
42
	get_user_undef_guess "$@"
43
	error_empty "$1"
44
}
45

46
guess_arch() {
47
	cat $BUILD_CONF | gcc -P -E - | sed -n 's/ARCH *= *//p';
48
}
49
get_user_empty_guess AUTOQEMU_ARCH guess_arch
50

51
guess_mem() {
52
	ram=$(cat $LDS_CONF | gcc -P -E - | sed -n 's/^RAM *([0-9x]*, *\([0-9]*\)M)/\1/p')
53
	if [ "$ram" ]; then
54
		echo "$ram"
55
	else
56
		echo 128
57
	fi
58
}
59
get_user_empty_guess AUTOQEMU_MEM guess_mem
60

61
guess_nics() {
62
	cat $MODS_CONF | gcc -P -E - | sed -n 's#.*include\ embox.driver.net.\([a-z0-9_]\+\)\((.*)\|\)$#\1#p' | grep -v loopback | head -n 1;
63
}
64
get_user_undef_guess AUTOQEMU_NICS guess_nics
65

66
guessed_info AUTOQEMU_NICS_CONFIG "(got)"
67

68
guess_sound() {
69
	cat $MODS_CONF | gcc -P -E - | sed -n 's#.*include\ embox.driver.audio.\([a-z0-9_]\+\)\((.*)\|\)$#\1#p' | \
70
	grep -v "portaudio_stub\|portaudio_lib" | head -n 1;
71
}
72
get_user_undef_guess AUTOQEMU_AUDIO guess_sound
73

74
guessed_info AUTOQEMU_AUDIO_CONFIG "(got)"
75

76
guess_usb() {
77
	cat $MODS_CONF | gcc -P -E - | sed -n 's#.*include\ embox.driver.usb.hc.\([a-z0-9_]\+\)\((.*)\|\)$#\1#p' | head -n 1;
78
}
79
get_user_undef_guess AUTOQEMU_USB guess_usb
80

81
guessed_info AUTOQEMU_USB_CONFIG "(got)"
82

83
guess_graphic() {
84
	cat $MODS_CONF | gcc -P -E - | sed -n 's#.*include\ embox.driver.video.\([a-z0-9_]\+\)\((.*)\|\)$#\1#p' | head -n 3;
85
}
86
get_user_undef_guess AUTOQEMU_GRAPHIC guess_graphic
87

88
guessed_info AUTOQEMU_GRAPHIC_CONFIG "(got)"
89

90
guess_diag() {
91
	cat $MODS_CONF | gcc -P -E - | sed -n 's/.*embox.driver.diag*[^"]*"\([^"]*\).*/\1/p' | head -n 1;
92
}
93
get_user_undef_guess AUTOQEMU_DIAG guess_diag
94

95
guessed_info AUTOQEMU_DIAG_CONFIG "(got)"
96

97

98
guess_kvm() {
99
	ret=""
100
	# Build kvm argument
101
	if [ "$AUTOQEMU_ARCH" = "x86" ] && [ "$OSTYPE" = "linux-gnu" ]; then
102
		if grep -q -E '(vmx|svm)' /proc/cpuinfo; then
103
			ret="-enable-kvm"
104
		else
105
			info VT is not supported by CPU
106
		fi
107

108
		if dmesg | tail | grep -q "kvm: disabled by bios"; then
109
			info "kvm disabled by bios. You can enable VT in bios"
110
			ret=
111
		fi
112

113
		if ! lsmod | grep -q -E '(kvm_intel|kvm_amd)'; then
114
			info no kvm kernel module loaded
115
			ret=
116
		fi
117
	fi
118
	echo "$ret";
119
}
120
get_user_undef_guess AUTOQEMU_KVM_ARG guess_kvm
121

122
guess_load_arg() {
123
	NAND_SIZE=$(cat $LDS_CONF | gcc -P -E - | sed -n 's/.*\<AUTOQEMU_UIMAGE_SIZE_MB=\([0-9]\+\).*$/\1/p')
124
	if [ ! "$NAND_SIZE" ]; then
125
		if [ "$AUTOQEMU_ARCH" = "riscv" ] || [ "$AUTOQEMU_ARCH" = "riscv64" ]; then
126
			echo "-bios ${KERNEL:-./build/base/bin/embox}"
127
		else
128
			echo "-kernel ${KERNEL:-./build/base/bin/embox}"
129
		fi
130
	else
131
		if [ ! "$AUTOQEMU_NAND_BUILD_SKIP" ];  then
132
			echo "Making uImage..." >&2
133
			OMAP_UBOOT_IMAGE_BOARD=overo ./scripts/uboot-uimage >/dev/null
134
			if [ 0 -ne $? ]; then
135
			    exit 1
136
			fi
137
			echo "Making nand image..." >&2
138
			./scripts/qemu/beagle/run.sh beagle_nand.img ./uImage "$NAND_SIZE" >/dev/null 2>/dev/null
139
			rm ./uImage
140
		fi
141
		echo "-mtdblock beagle_nand.img"
142
	fi
143
}
144
get_user_empty_guess AUTOQEMU_LOAD_ARG guess_load_arg
145

146
guess_machine() {
147
	case $AUTOQEMU_ARCH in
148
		arm)
149
			if cat $BUILD_CONF | gcc -P -E - | grep "overo" >/dev/null; then
150
				echo "-M overo"
151
			elif cat $BUILD_CONF | gcc -P -E - | grep "SECO-Q7-796" >/dev/null; then
152
				echo "-M overo"
153
			elif cat $BUILD_CONF | gcc -P -E - | grep "integratorcp" >/dev/null; then
154
				echo "-M integratorcp"
155
			elif cat $BUILD_CONF | gcc -P -E - | grep "vexpress-a9" > /dev/null; then
156
				echo "-M vexpress-a9"
157
			elif cat $BUILD_CONF | gcc -P -E - | grep "sabrelite" > /dev/null; then
158
				echo "-M sabrelite"
159
			elif cat $BUILD_CONF | gcc -P -E - | grep "lm3s811evb" > /dev/null; then
160
				echo "-M lm3s811evb"
161
			elif cat $BUILD_CONF | gcc -P -E - | grep "raspberry" > /dev/null; then
162
				echo "-M raspi1ap"
163
			elif cat $BUILD_CONF | gcc -P -E - | grep "raspberry2" > /dev/null; then
164
				echo "-M raspi2"
165
			fi
166
			;;
167
		aarch64)
168
			echo "-M virt,gic_version=3 -cpu cortex-a53"
169
			;;
170
		microblaze)
171
			echo "-M petalogix-s3adsp1800"
172
			;;
173
		mips)
174
			if cat $BUILD_CONF | gcc -P -E - | grep "baikal-t" >/dev/null; then
175
				echo "-M baikal-t"
176
			elif cat $BUILD_CONF | gcc -P -E - | grep "mipssim" >/dev/null; then
177
				echo "-M mipssim"
178
			fi
179
			;;
180
		mips64)
181
			echo "-M mipssim"
182
			;;
183
		ppc)
184
			echo "-M virtex-ml507"
185
			;;
186
		sparc)
187
			echo "-M leon3_generic -cpu LEON3"
188
			;;
189
		riscv)
190
			if cat $BUILD_CONF | gcc -P -E - | grep "sifive_e" >/dev/null; then
191
				echo "-M sifive_e"
192
			elif cat $BUILD_CONF | gcc -P -E - | grep "sifive_u" >/dev/null; then
193
				echo "-M sifive_u"
194
			else
195
				echo "-M virt"
196
			fi
197
			;;
198
		riscv64)
199
			echo "-M virt"
200
			;;
201
		x86)
202
			;;
203
	esac
204
}
205
get_user_undef_guess AUTOQEMU_MACHINE guess_machine
206

207
declare -A ARCH2QEMU
208
ARCH2QEMU=(
209
	[x86]="i386"
210
	[riscv]="riscv32"
211
)
212

213
QEMU=${AUTOQEMU_PREFIX}qemu-system-${ARCH2QEMU[$AUTOQEMU_ARCH]:-$AUTOQEMU_ARCH}
214
AWK=$(which gawk >/dev/null && echo gawk || echo awk)
215
QEMU_VER=$($QEMU --version | $AWK -f "$DATADIR"/qemuver.awk)
216

217
if [ "$QEMU_VER" -gt 010200 ]; then
218
	MB_XEMACLINE="xlnx.xps-ethernetlite"
219
else
220
	MB_XEMACLINE="xilinx-ethlite"
221
fi
222

223
declare -A NIC2QEMU
224
NIC2QEMU=(
225
	[e1000]="e1000"
226
	[ne2k_pci]="ne2k_pci"
227
	[rtl8139]="rtl8139"
228
	[virtio]="virtio"
229
	[xemaclite]=$MB_XEMACLINE
230
	[lan9118]="lan9118"
231
	[lan91c111]="smc91c111"
232
	[mipsnet]="mipsnet"
233
	[fec]="imx.enet"
234
	[dwc_gmac]="dwgmac"
235
	[usbnet]="usb-net"
236
	[cadence_gem]="cadence_gem"
237
)
238

239
IFS=" " read -r -a qemu_nics <<< "$AUTOQEMU_NICS"
240
IFS=" " read -r -a qemu_nics_config <<< "$AUTOQEMU_NICS_CONFIG"
241
sudo=""
242
nic_lines=""
243
nic_n=${#qemu_nics[*]}
244
if [ "$nic_n" -gt 0 ]; then
245
	sudo='sudo -E'
246
	for ni in "${!qemu_nics[@]}"; do
247

248
		nic_model=${NIC2QEMU[${qemu_nics[$ni]}]}
249
		echo
250
		if [ ! "$nic_model" ]; then
251
			error "nic model ${qemu_nics[$ni]} is not supported"
252
		fi
253

254
		if [ "${qemu_nics_config[$ni]}" ] && [ "${qemu_nics_config[$ni]}" != "-" ]; then
255
			host_nic_config=${qemu_nics_config[$ni]}
256
		else
257
			host_nic_config="tap,script=$DATADIR/start_script,downscript=$DATADIR/stop_script"
258
			if [ "$nic_model" = "virtio" ]; then
259
				host_nic_config="$host_nic_config,vnet_hdr=no"
260
			fi
261
		fi
262

263
		nic_macaddr="AA:BB:CC:DD:EE:0$(($ni + 2))"
264

265
		if [ "$nic_model" = "usb-net" ]; then
266
			nic_lines="$nic_lines \
267
				-device usb-net,netdev=n$ni,mac=$nic_macaddr"
268
		else
269
			nic_lines="$nic_lines \
270
				-net nic,netdev=n$ni,model=$nic_model,macaddr=$nic_macaddr"
271
		fi
272

273
		# For new version of QEMU it should be in future:
274
		# -nic $host_nic_config,model=$nic_model,mac=$nic_macaddr
275
		#
276
		nic_lines="$nic_lines \
277
			-netdev $host_nic_config,id=n$ni"
278
	done
279
fi
280

281
#############################################
282
# AUDIO
283
#############################################
284
declare -A AUDIO2QEMU
285
AUDIO2QEMU=(
286
	[intel_ac_pa]="ac97"
287
	[es1370]="es1370"
288
	[aaci_pl041]="default"
289
)
290

291
AUDIO_DEV=" " read -r -a qemu_sound <<< "$AUTOQEMU_AUDIO"
292

293
sound_lines=""
294
sound_n=${#qemu_sound[*]}
295
if [ "$sound_n" -gt 0 ]; then
296

297
	for so in "${!qemu_sound[@]}"; do
298
		sound_model=${AUDIO2QEMU[${qemu_sound[$so]}]}
299
		echo
300
		if [ "$sound_model" != "default" ]; then
301
			if [ ! "$sound_model" ]; then
302
				error "sound model ${qemu_sound[$ni]} is not supported"
303
			fi
304
			sound_lines="$sound_lines -soundhw $sound_model"
305
		fi
306
	done
307
	if [[ -z "${QEMU_AUDIO_DRV}" ]]; then
308
		# Use ALSA by default
309
		export QEMU_AUDIO_DRV=alsa
310
		info 'Using host ALSA subsystem. You can change it by setting QEMU_AUDIO_DRV'
311
		info 'For example, "export QEMU_AUDIO_DRV=oss"\n'
312
	fi
313
	info 'QEMU_AUDIO_DRV is now' "${QEMU_AUDIO_DRV}" '\n'
314
fi
315
#############################################
316
# END AUDIO
317
#############################################
318

319
#############################################
320
# USB
321
#############################################
322
declare -A USB2QEMU
323
USB2QEMU=(
324
	[ehci_pci]="usb-ehci"
325
	[ohci_pci]="pci-ohci"
326
	[uhci_pci]="piix3-usb-uhci"
327
)
328
declare -A USB2QEMUID
329
USB2QEMUID=(
330
	[ehci_pci]="ehci"
331
	[ohci_pci]="ohci"
332
	[uhci_pci]="uhci"
333
)
334

335
USB_DEV=" " read -r -a qemu_usb <<< "$AUTOQEMU_USB"
336

337
usb_lines=""
338
usb_n=${#qemu_usb[*]}
339
if [ "$usb_n" -gt 0 ]; then
340

341
	for so in "${!qemu_usb[@]}"; do
342
		usb_model=${USB2QEMU[${qemu_usb[$so]}]}
343
		hci_id=${USB2QEMUID[${qemu_usb[$so]}]}
344
		echo
345
		if [ ! "$usb_model" ]; then
346
			error "usb model ${qemu_usb[$ni]} is not supported"
347
		else
348
			usb_lines="$usb_lines -device $usb_model,id=$hci_id"
349
		fi
350
	done
351
fi
352
#############################################
353
# END USB
354
#############################################
355

356
#-vga [std|cirrus|vmware|qxl|xenfb|tcx|cg3|none]
357
declare -A GRAPHIC2QEMU
358
GRAPHIC2QEMU=(
359
	[bochs]="std"
360
	[cirrus_logic]="cirrus"
361
	[pl110]="pl110"
362
)
363

364
qemu_graphic=$(guess_graphic)
365
graphic_lines="-nographic"
366
graphic_n=${#qemu_graphic[*]}
367
if [ "$graphic_n" -gt 0 ]; then
368
	if [ -z "${AUTOQEMU_NOGRAPHIC_ARG+defined}" ]; then
369
		for so in $qemu_graphic; do
370
			graphic_model=${GRAPHIC2QEMU[$so]}
371
			if [ ! "$graphic_model" ]; then
372
				graphic_lines="-nographic"
373
			else
374
				if [ "$graphic_model" = "pl110" ]; then
375
					graphic_lines="-serial mon:stdio"
376
				else
377
					graphic_lines="-vga $graphic_model -serial mon:stdio"
378
				fi
379
				break
380
			fi
381
		done
382
		if [ "$graphic_lines" = "-nographic" ]; then
383
			if [ "$(guess_diag)" = "embox__driver__console__vc__vga" ]; then
384
				graphic_lines="-vga std"
385
			fi
386
		fi
387

388
	else
389
		graphic_lines=$AUTOQEMU_NOGRAPHIC_ARG
390
	fi
391

392
fi
393

394
RUNAS=""
395
# Don't try to drop privileges for root user; qemu fails otherwise
396
if [[ "$(id -u)" -ne 0 ]] ; then
397
	RUNAS="-runas $(whoami)"
398
	sudo='sudo -E'
399
fi
400

401
ARG_LINE="$sudo $QEMU $RUNAS $AUTOQEMU_MACHINE $AUTOQEMU_LOAD_ARG $AUTOQEMU_KVM_ARG -m $AUTOQEMU_MEM $usb_lines $nic_lines $sound_lines $graphic_lines $@"
402

403
info $ARG_LINE
404
$ARG_LINE
405

406
if [ -f beagle_nand.img ]; then
407
	rm beagle_nand.img
408
fi
409

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.