From ae98597ed91d11061edea1fbc30fd105aa37b587 Mon Sep 17 00:00:00 2001 From: Manish Ranjan Mahanta Date: Fri, 20 Feb 2026 21:27:02 +0530 Subject: [PATCH 1/2] Adding support for ARM64 LCOW Signed-off-by: Manish Ranjan Mahanta --- internal/uvm/create_lcow.go | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/internal/uvm/create_lcow.go b/internal/uvm/create_lcow.go index 5ac388b181..6eb686a99a 100644 --- a/internal/uvm/create_lcow.go +++ b/internal/uvm/create_lcow.go @@ -10,6 +10,7 @@ import ( "net" "os" "path/filepath" + "runtime" "strings" "github.com/Microsoft/go-winio" @@ -152,6 +153,11 @@ func defaultLCOWOSBootFilesPath() string { func NewDefaultOptionsLCOW(id, owner string) *OptionsLCOW { // Use KernelDirect boot by default on all builds that support it. kernelDirectSupported := osversion.Build() >= 18286 + var vPmemCount uint32 = DefaultVPMEMCount + if runtime.GOARCH == "arm64" { + kernelDirectSupported = false + vPmemCount = 0 + } opts := &OptionsLCOW{ Options: newDefaultOptions(id, owner), KernelFile: KernelFile, @@ -163,7 +169,7 @@ func NewDefaultOptionsLCOW(id, owner string) *OptionsLCOW { ForwardStdout: false, ForwardStderr: true, OutputHandlerCreator: parseLogrus, - VPMemDeviceCount: DefaultVPMEMCount, + VPMemDeviceCount: vPmemCount, VPMemSizeBytes: DefaultVPMemSizeBytes, VPMemNoMultiMapping: osversion.Get().Build < osversion.V19H1, PreferredRootFSType: PreferredRootFSTypeInitRd, @@ -180,7 +186,6 @@ func NewDefaultOptionsLCOW(id, owner string) *OptionsLCOW { } opts.UpdateBootFilesPath(context.TODO(), defaultLCOWOSBootFilesPath()) - return opts } @@ -807,14 +812,20 @@ func makeLCOWDoc(ctx context.Context, opts *OptionsLCOW, uvm *UtilityVM) (_ *hcs vmDebugging := false if opts.ConsolePipe != "" { vmDebugging = true - kernelArgs += " 8250_core.nr_uarts=1 8250_core.skip_txen_test=1 console=ttyS0,115200" + if runtime.GOARCH == "arm64" { + kernelArgs += " console=ttyAMA0,115200" + } else { + kernelArgs += " 8250_core.nr_uarts=1 8250_core.skip_txen_test=1 console=ttyS0,115200" + } doc.VirtualMachine.Devices.ComPorts = map[string]hcsschema.ComPort{ "0": { // Which is actually COM1 NamedPipe: opts.ConsolePipe, }, } } else { - kernelArgs += " 8250_core.nr_uarts=0" + if runtime.GOARCH != "arm64" { + kernelArgs += " 8250_core.nr_uarts=0" + } } if opts.EnableGraphicsConsole { @@ -835,7 +846,7 @@ func makeLCOWDoc(ctx context.Context, opts *OptionsLCOW, uvm *UtilityVM) (_ *hcs kernelArgs += " " + opts.KernelBootOptions } - if !opts.VPCIEnabled { + if runtime.GOARCH != "arm64" && !opts.VPCIEnabled { kernelArgs += ` pci=off` } From 757c31fc191a4dc5bef8e8f82a1c4ba50c39af55 Mon Sep 17 00:00:00 2001 From: Manish Ranjan Mahanta Date: Mon, 2 Mar 2026 14:30:30 +0530 Subject: [PATCH 2/2] Address Review Comments Signed-off-by: Manish Ranjan Mahanta --- internal/uvm/create.go | 9 +++++++++ internal/uvm/create_lcow.go | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/internal/uvm/create.go b/internal/uvm/create.go index 8d6c8c839a..e43b0880ea 100644 --- a/internal/uvm/create.go +++ b/internal/uvm/create.go @@ -189,6 +189,15 @@ func verifyOptions(_ context.Context, options interface{}) error { return errors.New("resource partition ID and CPU group ID cannot be set at the same time") } } + if runtime.GOARCH == "arm64" { + // ARM64 specific checks for currently unsupported features. These can be removed when the features are supported on ARM64. + if opts.VPMemDeviceCount > 0 { + return errors.New("VPMem devices are not supported on ARM64") + } + if opts.KernelDirect { + return errors.New("KernelDirectBoot is not supported on ARM64") + } + } case *OptionsWCOW: if opts.EnableDeferredCommit && !opts.AllowOvercommit { return errors.New("EnableDeferredCommit is not supported on physically backed VMs") diff --git a/internal/uvm/create_lcow.go b/internal/uvm/create_lcow.go index 6eb686a99a..a6be8caf78 100644 --- a/internal/uvm/create_lcow.go +++ b/internal/uvm/create_lcow.go @@ -846,7 +846,7 @@ func makeLCOWDoc(ctx context.Context, opts *OptionsLCOW, uvm *UtilityVM) (_ *hcs kernelArgs += " " + opts.KernelBootOptions } - if runtime.GOARCH != "arm64" && !opts.VPCIEnabled { + if !opts.VPCIEnabled { kernelArgs += ` pci=off` }