86 lines
2.1 KiB
Go
86 lines
2.1 KiB
Go
package internal
|
|
|
|
import (
|
|
"bufio"
|
|
"bytes"
|
|
"fmt"
|
|
"io"
|
|
"os/exec"
|
|
"regexp"
|
|
"strings"
|
|
|
|
"github.com/HikariKnight/ls-iommu/pkg/errorcheck"
|
|
"github.com/HikariKnight/quickpassthrough/internal/logger"
|
|
"github.com/charmbracelet/bubbles/list"
|
|
"github.com/klauspost/cpuid/v2"
|
|
)
|
|
|
|
func getIOMMU(args ...string) []string {
|
|
var stdout, stderr bytes.Buffer
|
|
// Write to logger
|
|
logger.Printf("Executing: utils/ls-iommu %s\n", strings.Join(args, " "))
|
|
|
|
// Configure the ls-iommu command
|
|
cmd := exec.Command("utils/ls-iommu", args...)
|
|
cmd.Stderr = &stderr
|
|
cmd.Stdout = &stdout
|
|
|
|
// Execute the command
|
|
err := cmd.Run()
|
|
|
|
// Generate the correct iommu string for the system
|
|
var iommu_args string
|
|
cpuinfo := cpuid.CPU
|
|
// Write the argument based on which cpu the user got
|
|
switch cpuinfo.VendorString {
|
|
case "AuthenticAMD":
|
|
iommu_args = "iommu=pt amd_iommu=on"
|
|
case "GenuineIntel":
|
|
iommu_args = "iommu=pt intel_iommu=on"
|
|
}
|
|
|
|
// If ls-iommu returns an error then IOMMU is disabled
|
|
errorcheck.ErrorCheck(err,
|
|
fmt.Sprintf(
|
|
"IOMMU disabled in either UEFI/BIOS or in bootloader!\n"+
|
|
"For your bootloader, make sure you have added the kernel arguments:\n"+
|
|
"%s",
|
|
iommu_args,
|
|
),
|
|
)
|
|
|
|
// Read the output
|
|
var items []string
|
|
output, _ := io.ReadAll(&stdout)
|
|
|
|
// Write to logger
|
|
logger.Printf("ls-iommu query returned\n%s", string(output))
|
|
|
|
// Parse the output line by line
|
|
scanner := bufio.NewScanner(strings.NewReader(string(output)))
|
|
for scanner.Scan() {
|
|
// Write the objects into the list
|
|
items = append(items, scanner.Text())
|
|
}
|
|
|
|
// Return our list of items
|
|
return items
|
|
}
|
|
|
|
func iommuList2ListItem(stringList []string) []list.Item {
|
|
// Make the []list.Item struct
|
|
items := []list.Item{}
|
|
|
|
deviceID := regexp.MustCompile(`\[[a-f0-9]{4}:[a-f0-9]{4}\]\s+`)
|
|
// Parse the output line by line
|
|
for _, v := range stringList {
|
|
// Get the current line and split by :
|
|
objects := strings.Split(v, ": ")
|
|
|
|
// Write the objects into the list
|
|
items = append(items, item{title: deviceID.ReplaceAllString(objects[2], ""), desc: fmt.Sprintf("%s: %s: DeviceID: %s", objects[0], objects[1], objects[3])})
|
|
}
|
|
|
|
// Return our list of items
|
|
return items
|
|
}
|