packages feed

haskus-system-build-1.0: src/apps/Haskus/Apps/System/Build/QEMU.hs

{-# LANGUAGE OverloadedStrings #-}

module Haskus.Apps.System.Build.QEMU
   ( qemuExecRamdisk
   , qemuExecISO
   , qemuGetProfileConfig
   , qemuExec
   )
where

import Haskus.Apps.System.Build.Config
import Haskus.Apps.System.Build.Utils
import Haskus.Apps.System.Build.Ramdisk
import Haskus.Apps.System.Build.Linux

import Data.List
import qualified Data.Text as Text

-- | Execute (ramdisk + kernel)
qemuExecRamdisk :: SystemConfig -> IO ()
qemuExecRamdisk config = do
   
   (args,kargs) <- qemuGetProfileConfig (qemuConfig config)

   kernel  <- linuxKernelFile (linuxConfig config)
   ramdisk <- ramdiskGetPath (ramdiskConfig config)
   let rdinit = Text.unpack (ramdiskInit (ramdiskConfig config))

   let kerRdArgs = concat $ intersperse " "
         [ "-kernel", kernel
         , "-initrd", ramdisk
         , "-append", ("\"rdinit=/" ++ rdinit ++ " " ++ kargs ++ "\"")
         ]

   qemuExec (args ++ " " ++ kerRdArgs)

-- | Execute ISO
qemuExecISO :: SystemConfig -> FilePath -> IO ()
qemuExecISO config isoPath = do
   
   (args,_) <- qemuGetProfileConfig (qemuConfig config)

   let kerRdArgs = concat $ intersperse " "
         [ "-cdrom", isoPath
         ]

   qemuExec (args ++ " " ++ kerRdArgs)


qemuExec :: String -> IO ()
qemuExec args = do
   let cmd = "qemu-system-x86_64 " ++ args

   showStep "Launching QEMU..."
   shellWaitErr cmd $ failWith "Cannot execute QEMU"


qemuGetProfileConfig :: QEMUConfig -> IO (String,String)
qemuGetProfileConfig config =
   case qemuProfile config of
      "vanilla" -> return ( Text.unpack (qemuOptions config)
                          , Text.unpack (qemuKernelArgs config)
                          )
      "default" -> return $
         (concat $ intersperse " "
            [ "-enable-kvm"
            , "-machine q35"
            , "-serial stdio"
            , "-vga std"
            --, "-show-cursor"
            , "-usb"
            , "-device usb-ehci,id=ehci"
            , "-device usb-tablet,bus=usb-bus.0"
            , "-device intel-hda -device hda-duplex"
            , Text.unpack (qemuOptions config)
            ]
         , concat $ intersperse " "
            [ "console=ttyS0 atkbd.softraw=0 quiet"
            , Text.unpack (qemuKernelArgs config)
            ]
         )
      p         -> failWith $ "Invalid QEMU profile: " ++ Text.unpack p