#!/bin/bash
set -e

# 容错陷阱：出错时提示行号并退出
trap 'echo "Error: $0 Line: $LINENO"; exit 1' ERR

# ====================== 全局变量配置 ======================
IGPU_VALID_MODEL_KEYWORD="UHD Graphics 630"
IGPU_ROM_FILE="/etc/vmdeploy/CFL_CML_GOPv9.1_igd.rom"
VM_XML_FILE="/etc/vmdeploy/Windows_11.xml"

# ====================== 参数校验 ======================
if [ $# -ne 1 ]; then
    echo "Usage: $0 <UHD Graphics 630 BDF> (e.g. 00:02.0)"
    exit 1
fi
IGPU_BDF="$1"

# ====================== ROM文件存在性检查 ======================
if [ ! -f "$IGPU_ROM_FILE" ]; then
    echo "CFL_CML_GOPv9.1_igd.rom does not exist, please place this file in /etc/vmdeploy"
    exit 1
fi

# ====================== 设备验证 ======================
if ! echo "$IGPU_BDF" | grep -qE '^[0-9a-fA-F]{2}:[0-9a-fA-F]{2}\.[0-9]$'; then
    echo "Error: Invalid BDF format"
    exit 1
fi
if ! lspci -s "$IGPU_BDF" >/dev/null 2>&1; then
    echo "Error: BDF not exist"
    exit 1
fi
if ! lspci -nn -s "$IGPU_BDF" | grep -qi "$IGPU_VALID_MODEL_KEYWORD"; then
    echo "Error: Not UHD Graphics 630"
    exit 1
fi

# ====================== 生成核显XML内容 ======================
BDF_BUS=$(echo $IGPU_BDF | cut -d: -f1 | sed 's/^/0x/')
BDF_SLOT=$(echo $IGPU_BDF | cut -d: -f2 | cut -d. -f1 | sed 's/^/0x/')
BDF_FUNC=$(echo $IGPU_BDF | cut -d. -f2 | sed 's/^/0x/')

# 构造核显XML
IGPU_XML=$(cat <<EOF
    <!-- UHD Graphics 630 Passthrough (BDF=$IGPU_BDF) -->
    <hostdev mode='subsystem' type='pci' managed='yes'>
      <driver name='vfio'/>
      <source>
        <address domain='0x0000' bus='$BDF_BUS' slot='$BDF_SLOT' function='$BDF_FUNC'/>
      </source>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
      <rom file='$IGPU_ROM_FILE'/>
    </hostdev>
EOF
)

echo "$IGPU_XML" > /tmp/tmp_igpu.xml

sed -i "/^[[:space:]]*<\/vsock>/r /tmp/tmp_igpu.xml" "$VM_XML_FILE"
rm -f /tmp/tmp_igpu.xml

echo "Done. VM XML updated: $VM_XML_FILE"
