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/3] 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/3] 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` } From 22158099b5cc5f8e2d7a7e3e498695e07b7ec4c6 Mon Sep 17 00:00:00 2001 From: Manish Ranjan Mahanta Date: Sun, 8 Mar 2026 14:19:23 +0530 Subject: [PATCH 3/3] Enabling Kernel Direct support for ARM64 Signed-off-by: Manish Ranjan Mahanta --- internal/uvm/create.go | 3 --- internal/uvm/create_lcow.go | 3 +++ 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/internal/uvm/create.go b/internal/uvm/create.go index e43b0880ea..e4c1903560 100644 --- a/internal/uvm/create.go +++ b/internal/uvm/create.go @@ -194,9 +194,6 @@ func verifyOptions(_ context.Context, options interface{}) error { 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 { diff --git a/internal/uvm/create_lcow.go b/internal/uvm/create_lcow.go index a6be8caf78..7a54ad7b06 100644 --- a/internal/uvm/create_lcow.go +++ b/internal/uvm/create_lcow.go @@ -155,6 +155,9 @@ func NewDefaultOptionsLCOW(id, owner string) *OptionsLCOW { kernelDirectSupported := osversion.Build() >= 18286 var vPmemCount uint32 = DefaultVPMEMCount if runtime.GOARCH == "arm64" { + // Todo: Add a conditional check for osversion once KernelDirect + // becomes available on ARM64, and enable it for supported versions. + // This is used by create-scratch and cannot be overriden by annotations kernelDirectSupported = false vPmemCount = 0 }