summarylogtreecommitdiffstats
diff options
context:
space:
mode:
authorFranc[e]sco2020-10-11 23:17:19 +0200
committerFranc[e]sco2020-10-11 23:34:32 +0200
commit484001f2d17ebdcf3d66e2e07f912d75e95eb7a5 (patch)
tree545df89934b0b52b9407944b675ba61cc8fadfee
downloadaur-484001f2d17ebdcf3d66e2e07f912d75e95eb7a5.tar.gz
first commit
-rw-r--r--.SRCINFO118
-rw-r--r--.gitignore3
-rw-r--r--0001-hw-audio-pcspk-Use-a-semicircle-wave-rather-than-a-p.patch54
-rw-r--r--0002-hw-audio-pcspk-Insert-small-pauses-to-distinguish-re.patch60
-rw-r--r--0003-ui-Change-refresh-interval-to-60fps.patch25
-rw-r--r--65-kvm.rules1
-rw-r--r--PKGBUILD223
-rw-r--r--qemu-ga.service9
-rw-r--r--qemu.install8
9 files changed, 501 insertions, 0 deletions
diff --git a/.SRCINFO b/.SRCINFO
new file mode 100644
index 000000000000..e9547a6fb011
--- /dev/null
+++ b/.SRCINFO
@@ -0,0 +1,118 @@
+pkgbase = qemu-templeos
+ pkgdesc = QEMU with better pc speaker audio for TempleOS
+ pkgver = 5.1.0
+ pkgrel = 1
+ url = https://wiki.qemu.org/
+ arch = x86_64
+ license = GPL2
+ license = LGPL2.1
+ makedepends = spice-protocol
+ makedepends = python
+ makedepends = ceph
+ makedepends = libiscsi
+ makedepends = glusterfs
+ makedepends = python-sphinx
+ makedepends = xfsprogs
+ depends = virglrenderer
+ depends = sdl2
+ depends = vte3
+ depends = libpulse
+ depends = libjack.so
+ depends = brltty
+ depends = seabios
+ depends = gnutls
+ depends = libpng
+ depends = libaio
+ depends = numactl
+ depends = libnfs
+ depends = lzo
+ depends = snappy
+ depends = curl
+ depends = vde2
+ depends = libcap-ng
+ depends = spice
+ depends = libcacard
+ depends = usbredir
+ depends = libslirp
+ depends = libssh
+ depends = zstd
+ depends = liburing
+ provides = qemu
+ provides = qemu-headless
+ provides = qemu-arch-extra
+ provides = qemu-headless-arch-extra
+ provides = qemu-block-iscsi
+ provides = qemu-block-rbd
+ provides = qemu-block-gluster
+ provides = qemu-guest-agent
+ source = https://download.qemu.org/qemu-5.1.0.tar.xz
+ source = https://download.qemu.org/qemu-5.1.0.tar.xz.sig
+ source = qemu-ga.service
+ source = 65-kvm.rules
+ validpgpkeys = CEACC9E15534EBABB82D3FA03353C9CEF108B584
+ sha512sums = e213edb71d93d5167ddce7546220ecb7b52a7778586a4f476f65bd1e510c9cfc6d1876238a7b501d9cc3fd31cc2ae4b7fb9e753bc3f12cc17cd16dfce2a96ba3
+ sha512sums = SKIP
+ sha512sums = 269c0f0bacbd06a3d817fde02dce26c99d9f55c9e3b74bb710bd7e5cdde7a66b904d2eb794c8a605bf9305e4e3dee261a6e7d4ec9d9134144754914039f176e4
+ sha512sums = bdf05f99407491e27a03aaf845b7cc8acfa2e0e59968236f10ffc905e5e3d5e8569df496fd71c887da2b5b8d1902494520c7da2d3a8258f7fd93a881dd610c99
+
+pkgname = qemu-templeos
+ optdepends = qemu-arch-extra-templeos: extra architectures support
+ provides = qemu-headless
+ conflicts = qemu-headless
+ replaces = qemu-kvm
+
+pkgname = qemu-headless-templeos
+ pkgdesc = QEMU without GUI
+ depends = seabios
+ depends = gnutls
+ depends = libpng
+ depends = libaio
+ depends = numactl
+ depends = libnfs
+ depends = lzo
+ depends = snappy
+ depends = curl
+ depends = vde2
+ depends = libcap-ng
+ depends = spice
+ depends = libcacard
+ depends = usbredir
+ depends = libslirp
+ depends = libssh
+ depends = zstd
+ depends = liburing
+ optdepends = qemu-headless-arch-extra-templeos: extra architectures support
+
+pkgname = qemu-arch-extra-templeos
+ pkgdesc = QEMU for foreign architectures
+ depends = qemu
+ provides = qemu-headless-arch-extra
+ conflicts = qemu-headless-arch-extra
+ options = !strip
+
+pkgname = qemu-headless-arch-extra-templeos
+ pkgdesc = QEMU without GUI, for foreign architectures
+ depends = qemu-headless
+ options = !strip
+
+pkgname = qemu-block-iscsi-templeos
+ pkgdesc = QEMU iSCSI block module
+ depends = glib2
+ depends = libiscsi
+
+pkgname = qemu-block-rbd-templeos
+ pkgdesc = QEMU RBD block module
+ depends = glib2
+ depends = ceph-libs
+
+pkgname = qemu-block-gluster-templeos
+ pkgdesc = QEMU GlusterFS block module
+ depends = glib2
+ depends = glusterfs
+
+pkgname = qemu-guest-agent-templeos
+ pkgdesc = QEMU Guest Agent
+ depends = gcc-libs
+ depends = glib2
+ depends = libudev.so
+
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 000000000000..68eba2849535
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
+*.tar.zst
+/pkg
+/src
diff --git a/0001-hw-audio-pcspk-Use-a-semicircle-wave-rather-than-a-p.patch b/0001-hw-audio-pcspk-Use-a-semicircle-wave-rather-than-a-p.patch
new file mode 100644
index 000000000000..ca939aab35a9
--- /dev/null
+++ b/0001-hw-audio-pcspk-Use-a-semicircle-wave-rather-than-a-p.patch
@@ -0,0 +1,54 @@
+From 0ddb31675a8ba2fef40340034b0371b7fb63a8b9 Mon Sep 17 00:00:00 2001
+From: "Franc[e]sco" <lolisamurai@tfwno.gf>
+Date: Sun, 11 Oct 2020 15:25:28 +0200
+Subject: [PATCH 1/2] hw/audio/pcspk: Use a semicircle wave rather than a pure
+ square wave
+
+---
+ hw/audio/pcspk.c | 13 +++++++++++--
+ 1 file changed, 11 insertions(+), 2 deletions(-)
+
+diff --git a/hw/audio/pcspk.c b/hw/audio/pcspk.c
+index ea539e7605..1545b3c90a 100644
+--- a/hw/audio/pcspk.c
++++ b/hw/audio/pcspk.c
+@@ -23,6 +23,7 @@
+ */
+
+ #include "qemu/osdep.h"
++#include <math.h>
+ #include "hw/isa/isa.h"
+ #include "hw/audio/soundhw.h"
+ #include "audio/audio.h"
+@@ -61,18 +62,26 @@ typedef struct {
+ static const char *s_spk = "pcspk";
+ static PCSpkState *pcspk_state;
+
++/* a lot less harsh on the ears than a perfect square wave, while still sounding square-ish */
++static inline float circle_wave(float x)
++{
++ int s = (x > 0) - (x < 0);
++ float t = (x * 2 - (s - 1) / 2) * 2 - 1;
++ return -s * sqrtf(1 - t * t);
++}
++
+ static inline void generate_samples(PCSpkState *s)
+ {
+ unsigned int i;
+
+ if (s->pit_count) {
+ const uint32_t m = PCSPK_SAMPLE_RATE * s->pit_count;
+- const uint32_t n = ((uint64_t)PIT_FREQ << 32) / m;
++ const float n = (float)PIT_FREQ / m;
+
+ /* multiple of wavelength for gapless looping */
+ s->samples = (QEMU_ALIGN_DOWN(PCSPK_BUF_LEN * PIT_FREQ, m) / (PIT_FREQ >> 1) + 1) >> 1;
+ for (i = 0; i < s->samples; ++i)
+- s->sample_buf[i] = (64 & (n * i >> 25)) - 32;
++ s->sample_buf[i] = 128 + circle_wave(fmod(n * i, 1.f) - .5f) * 16;
+ } else {
+ s->samples = PCSPK_BUF_LEN;
+ for (i = 0; i < PCSPK_BUF_LEN; ++i)
+--
+2.28.0
+
diff --git a/0002-hw-audio-pcspk-Insert-small-pauses-to-distinguish-re.patch b/0002-hw-audio-pcspk-Insert-small-pauses-to-distinguish-re.patch
new file mode 100644
index 000000000000..e2ab0a3b981b
--- /dev/null
+++ b/0002-hw-audio-pcspk-Insert-small-pauses-to-distinguish-re.patch
@@ -0,0 +1,60 @@
+From 2c26487bd00d6b834a3f204d60b425b2564b14f8 Mon Sep 17 00:00:00 2001
+From: "Franc[e]sco" <lolisamurai@tfwno.gf>
+Date: Sun, 11 Oct 2020 21:49:40 +0200
+Subject: [PATCH 2/2] hw/audio/pcspk: Insert small pauses to distinguish
+ repeated notes
+
+---
+ hw/audio/pcspk.c | 14 +++++++++++---
+ 1 file changed, 11 insertions(+), 3 deletions(-)
+
+diff --git a/hw/audio/pcspk.c b/hw/audio/pcspk.c
+index 1545b3c90a..2a672e77d5 100644
+--- a/hw/audio/pcspk.c
++++ b/hw/audio/pcspk.c
+@@ -52,6 +52,7 @@ typedef struct {
+ SWVoiceOut *voice;
+ void *pit;
+ unsigned int pit_count;
++ unsigned int last_pit_count;
+ unsigned int samples;
+ unsigned int play_pos;
+ uint8_t data_on;
+@@ -74,7 +75,9 @@ static inline void generate_samples(PCSpkState *s)
+ {
+ unsigned int i;
+
+- if (s->pit_count) {
++ /* add 1 tick of silence when frequency changes or speaker gets reset to distinguish
++ * repeated frequencies */
++ if (s->pit_count && s->last_pit_count == s->pit_count) {
+ const uint32_t m = PCSPK_SAMPLE_RATE * s->pit_count;
+ const float n = (float)PIT_FREQ / m;
+
+@@ -106,7 +109,9 @@ static void pcspk_callback(void *opaque, int free)
+ if (n < PCSPK_MIN_COUNT)
+ n = 0;
+
+- if (s->pit_count != n) {
++ if (s->pit_count != n || s->last_pit_count != s->pit_count) {
++ /* generate twice for each freq change. first the pause, then the steady frequence */
++ s->last_pit_count = s->pit_count;
+ s->pit_count = n;
+ s->play_pos = 0;
+ generate_samples(s);
+@@ -165,8 +170,11 @@ static void pcspk_io_write(void *opaque, hwaddr addr, uint64_t val,
+ s->data_on = (val >> 1) & 1;
+ pit_set_gate(s->pit, 2, gate);
+ if (s->voice) {
+- if (gate) /* restart */
++ if (gate) { /* restart */
+ s->play_pos = 0;
++ s->last_pit_count = 0;
++ s->pit_count = 0;
++ }
+ AUD_set_active_out(s->voice, gate & s->data_on);
+ }
+ }
+--
+2.28.0
+
diff --git a/0003-ui-Change-refresh-interval-to-60fps.patch b/0003-ui-Change-refresh-interval-to-60fps.patch
new file mode 100644
index 000000000000..6fcfcb9513a6
--- /dev/null
+++ b/0003-ui-Change-refresh-interval-to-60fps.patch
@@ -0,0 +1,25 @@
+From cc12b35e77953a196479237b00f2d44707481d28 Mon Sep 17 00:00:00 2001
+From: "Franc[e]sco" <lolisamurai@tfwno.gf>
+Date: Sun, 11 Oct 2020 23:30:20 +0200
+Subject: [PATCH] ui: Change refresh intervcal to 60fps
+
+---
+ include/ui/console.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/include/ui/console.h b/include/ui/console.h
+index f35b4fc082..fb5485d38b 100644
+--- a/include/ui/console.h
++++ b/include/ui/console.h
+@@ -26,7 +26,7 @@
+ #define QEMU_CAPS_LOCK_LED (1 << 2)
+
+ /* in ms */
+-#define GUI_REFRESH_INTERVAL_DEFAULT 30
++#define GUI_REFRESH_INTERVAL_DEFAULT 16
+ #define GUI_REFRESH_INTERVAL_IDLE 3000
+
+ /* Color number is match to standard vga palette */
+--
+2.28.0
+
diff --git a/65-kvm.rules b/65-kvm.rules
new file mode 100644
index 000000000000..fbb0ebb69c9e
--- /dev/null
+++ b/65-kvm.rules
@@ -0,0 +1 @@
+KERNEL=="vhost-net", GROUP="kvm", MODE="0660", TAG+="uaccess", OPTIONS+="static_node=vhost-net"
diff --git a/PKGBUILD b/PKGBUILD
new file mode 100644
index 000000000000..4dcca6d65f2d
--- /dev/null
+++ b/PKGBUILD
@@ -0,0 +1,223 @@
+# Maintainer: Franc[e]sco <lolisamurai@tfwno.gf>
+
+pkgbase=qemu-templeos
+pkgname=(qemu-templeos qemu-headless-templeos qemu-arch-extra-templeos
+ qemu-headless-arch-extra-templeos qemu-block-{iscsi,rbd,gluster}-templeos
+ qemu-guest-agent-templeos)
+provides=(qemu qemu-headless qemu-arch-extra qemu-headless-arch-extra
+ qemu-block-{iscsi,rbd,gluster} qemu-guest-agent)
+pkgdesc="QEMU with better pc speaker audio for TempleOS"
+pkgver=5.1.0
+pkgrel=1
+arch=(x86_64)
+license=(GPL2 LGPL2.1)
+url="https://wiki.qemu.org/"
+_headlessdeps=(seabios gnutls libpng libaio numactl libnfs
+ lzo snappy curl vde2 libcap-ng spice libcacard usbredir libslirp
+ libssh zstd liburing)
+depends=(virglrenderer sdl2 vte3 libpulse libjack.so brltty "${_headlessdeps[@]}")
+makedepends=(spice-protocol python ceph libiscsi glusterfs python-sphinx xfsprogs)
+source=(https://download.qemu.org/qemu-$pkgver.tar.xz{,.sig}
+ qemu-ga.service
+ 65-kvm.rules)
+sha512sums=('e213edb71d93d5167ddce7546220ecb7b52a7778586a4f476f65bd1e510c9cfc6d1876238a7b501d9cc3fd31cc2ae4b7fb9e753bc3f12cc17cd16dfce2a96ba3'
+ 'SKIP'
+ '269c0f0bacbd06a3d817fde02dce26c99d9f55c9e3b74bb710bd7e5cdde7a66b904d2eb794c8a605bf9305e4e3dee261a6e7d4ec9d9134144754914039f176e4'
+ 'bdf05f99407491e27a03aaf845b7cc8acfa2e0e59968236f10ffc905e5e3d5e8569df496fd71c887da2b5b8d1902494520c7da2d3a8258f7fd93a881dd610c99')
+validpgpkeys=('CEACC9E15534EBABB82D3FA03353C9CEF108B584')
+patches="0001-hw-audio-pcspk-Use-a-semicircle-wave-rather-than-a-p
+ 0002-hw-audio-pcspk-Insert-small-pauses-to-distinguish-re
+ 0003-ui-Change-refresh-interval-to-60fps"
+
+case $CARCH in
+ i?86) _corearch=i386 ;;
+ x86_64) _corearch=x86_64 ;;
+esac
+
+prepare() {
+ mkdir -p build-{full,headless}
+ mkdir -p extra-arch-{full,headless}/usr/{bin,share/qemu}
+ cd "$pkgname-$pkgver"
+ for p in $patches; do
+ patch --forward --strip=1 --input="${startdir}/$p.patch"
+ done
+}
+
+build() {
+ _build full \
+ --audio-drv-list="pa alsa sdl jack"
+
+ _build headless \
+ --audio-drv-list= \
+ --disable-sdl \
+ --disable-gtk \
+ --disable-vte \
+ --disable-brlapi \
+ --disable-opengl \
+ --disable-virglrenderer
+}
+
+_build() (
+ cd build-$1
+
+ ../${pkgname}-${pkgver}/configure \
+ --prefix=/usr \
+ --sysconfdir=/etc \
+ --localstatedir=/var \
+ --libexecdir=/usr/lib/qemu \
+ --extra-ldflags="$LDFLAGS" \
+ --smbd=/usr/bin/smbd \
+ --enable-modules \
+ --enable-sdl \
+ --enable-slirp=system \
+ --enable-xfsctl \
+ "${@:2}"
+
+ make
+)
+
+package_qemu-templeos() {
+ optdepends=('qemu-arch-extra-templeos: extra architectures support')
+ provides=(qemu-headless)
+ conflicts=(qemu-headless)
+ replaces=(qemu-kvm)
+
+ _package full
+}
+
+package_qemu-headless-templeos() {
+ pkgdesc="QEMU without GUI"
+ depends=("${_headlessdeps[@]}")
+ optdepends=('qemu-headless-arch-extra-templeos: extra architectures support')
+
+ _package headless
+}
+
+_package() {
+ optdepends+=('samba: SMB/CIFS server support'
+ 'qemu-block-iscsi: iSCSI block support'
+ 'qemu-block-rbd: RBD block support'
+ 'qemu-block-gluster: glusterfs block support')
+ install=qemu.install
+ options=(!strip !emptydirs)
+
+ make -C build-$1 DESTDIR="$pkgdir" install "${@:2}"
+
+ # systemd stuff
+ install -Dm644 65-kvm.rules "$pkgdir/usr/lib/udev/rules.d/65-kvm.rules"
+
+ # remove conflicting /var/run directory
+ cd "$pkgdir"
+ rm -r var
+
+ cd usr/lib
+
+ # bridge_helper needs suid
+ # https://bugs.archlinux.org/task/32565
+ chmod u+s qemu/qemu-bridge-helper
+
+ # remove split block modules
+ rm qemu/block-{iscsi,rbd,gluster}.so
+
+ cd ../bin
+
+ # remove extra arch
+ for _bin in qemu-*; do
+ [[ -f $_bin ]] || continue
+
+ case ${_bin#qemu-} in
+ # guest agent
+ ga) rm "$_bin"; continue ;;
+
+ # tools
+ edid|img|io|keymap|nbd|pr-helper|storage-daemon) continue ;;
+
+ # core emu
+ system-${_corearch}) continue ;;
+ esac
+
+ mv "$_bin" "$srcdir/extra-arch-$1/usr/bin"
+ done
+
+ cd ../share/qemu
+ for _blob in *; do
+ [[ -f $_blob ]] || continue
+
+ case $_blob in
+ # provided by seabios package
+ bios.bin|bios-256k.bin|vgabios-cirrus.bin|vgabios-qxl.bin|\
+ vgabios-stdvga.bin|vgabios-vmware.bin|vgabios-virtio.bin|vgabios-bochs-display.bin|\
+ vgabios-ramfb.bin) rm "$_blob"; continue ;;
+
+ # provided by edk2-ovmf package
+ edk2-*) rm "$_blob"; continue ;;
+
+ # iPXE ROMs
+ efi-*|pxe-*) continue ;;
+
+ # core blobs
+ bios-microvm.bin|kvmvapic.bin|linuxboot*|multiboot.bin|sgabios.bin|vgabios*) continue ;;
+
+ # Trace events definitions
+ trace-events*) continue ;;
+ esac
+
+ mv "$_blob" "$srcdir/extra-arch-$1/usr/share/qemu"
+ done
+
+ # provided by edk2-ovmf package
+ rm -r firmware
+
+ cd ..
+ if [ "$1" = headless ]; then rm -r {applications,icons}; fi
+}
+
+package_qemu-arch-extra-templeos() {
+ pkgdesc="QEMU for foreign architectures"
+ depends=(qemu)
+ provides=(qemu-headless-arch-extra)
+ conflicts=(qemu-headless-arch-extra)
+ options=(!strip)
+
+ mv extra-arch-full/usr "$pkgdir"
+}
+
+package_qemu-headless-arch-extra-templeos() {
+ pkgdesc="QEMU without GUI, for foreign architectures"
+ depends=(qemu-headless)
+ options=(!strip)
+
+ mv extra-arch-headless/usr "$pkgdir"
+}
+
+package_qemu-block-iscsi-templeos() {
+ pkgdesc="QEMU iSCSI block module"
+ depends=(glib2 libiscsi)
+
+ install -D build-full/block-iscsi.so "$pkgdir/usr/lib/qemu/block-iscsi.so"
+}
+
+package_qemu-block-rbd-templeos() {
+ pkgdesc="QEMU RBD block module"
+ depends=(glib2 ceph-libs)
+
+ install -D build-full/block-rbd.so "$pkgdir/usr/lib/qemu/block-rbd.so"
+}
+
+package_qemu-block-gluster-templeos() {
+ pkgdesc="QEMU GlusterFS block module"
+ depends=(glib2 glusterfs)
+
+ install -D build-full/block-gluster.so "$pkgdir/usr/lib/qemu/block-gluster.so"
+}
+
+package_qemu-guest-agent-templeos() {
+ pkgdesc="QEMU Guest Agent"
+ depends=(gcc-libs glib2 libudev.so)
+
+ install -D build-full/qemu-ga "$pkgdir/usr/bin/qemu-ga"
+ install -Dm644 qemu-ga.service "$pkgdir/usr/lib/systemd/system/qemu-ga.service"
+ install -Dm755 "$srcdir/qemu-$pkgver/scripts/qemu-guest-agent/fsfreeze-hook" "$pkgdir/etc/qemu/fsfreeze-hook"
+}
+
+# vim:set ts=2 sw=2 et:
diff --git a/qemu-ga.service b/qemu-ga.service
new file mode 100644
index 000000000000..abbb6ab9dfe2
--- /dev/null
+++ b/qemu-ga.service
@@ -0,0 +1,9 @@
+[Unit]
+Description=QEMU Guest Agent
+ConditionPathExists=/dev/virtio-ports/org.qemu.guest_agent.0
+
+[Service]
+ExecStart=/usr/bin/qemu-ga
+
+[Install]
+WantedBy=multi-user.target
diff --git a/qemu.install b/qemu.install
new file mode 100644
index 000000000000..d90269ecfecd
--- /dev/null
+++ b/qemu.install
@@ -0,0 +1,8 @@
+# Arg 1: the new package version
+post_install() {
+ # trigger events on modules files when already loaded
+ for _f in /sys/devices/virtual/misc/vhost-net; do
+ [[ -e "$_f" ]] && udevadm trigger "$_f"
+ done
+ :
+}