Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
/macos/_examples/pomodoro/pomodoro
/macos/_examples/subclass/subclass
/macos/_examples/tabview/tabview
/macos/_examples/virtualization/virtualization
/macos/_examples/webshot/webshot
/macos/_examples/webview/webview
/macos/_examples/widgets/widgets
Expand Down
2 changes: 2 additions & 0 deletions generate/declparse/ast_enum.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ const (
TypeAnnotNullUnspecified
TypeAnnotStruct
TypeAnnotUnavailable
TypeAnnotExtern
)

var typeAnnots = map[TypeAnnotation]string{
Expand All @@ -103,6 +104,7 @@ var typeAnnots = map[TypeAnnotation]string{
TypeAnnotNonnull: "%s _Nonnull",
TypeAnnotNullUnspecified: "%s _Null_unspecified",
TypeAnnotStruct: "struct %s",
TypeAnnotExtern: "extern %s",
}

func (annot TypeAnnotation) Format() string {
Expand Down
2 changes: 2 additions & 0 deletions generate/declparse/keywords/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ const (
CONST
TYPEDEF
STRUCT
EXTERN

endKeywords
)
Expand All @@ -33,6 +34,7 @@ var tokenMap = map[lexer.Token]string{
CONST: "const",
TYPEDEF: "typedef",
STRUCT: "struct",
EXTERN: "extern",
}

// IsKeyword returns true if the token is a keyword.
Expand Down
41 changes: 41 additions & 0 deletions generate/modules/enums/macos/virtualization
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
VZDiskImageCachingModeAutomatic 0
VZDiskImageCachingModeCached 2
VZDiskImageCachingModeUncached 1
VZDiskImageSynchronizationModeFsync 2
VZDiskImageSynchronizationModeFull 1
VZDiskImageSynchronizationModeNone 3
VZDiskSynchronizationModeFull 0
VZDiskSynchronizationModeNone 1
VZEFIVariableStoreInitializationOptionAllowOverwrite 1
VZErrorInstallationFailed 10007
VZErrorInstallationRequiresUpdate 10006
VZErrorInternal 1
VZErrorInvalidDiskImage 5
VZErrorInvalidRestoreImage 10005
VZErrorInvalidRestoreImageCatalog 10002
VZErrorInvalidVirtualMachineConfiguration 2
VZErrorInvalidVirtualMachineState 3
VZErrorInvalidVirtualMachineStateTransition 4
VZErrorNetworkBlockDeviceDisconnected 20002
VZErrorNetworkBlockDeviceNegotiationFailed 20001
VZErrorNetworkError 7
VZErrorNoSupportedRestoreImagesInCatalog 10003
VZErrorNotSupported 10
VZErrorOperationCancelled 9
VZErrorOutOfDiskSpace 8
VZErrorRestore 12
VZErrorRestoreImageCatalogLoadFailed 10001
VZErrorRestoreImageLoadFailed 10004
VZErrorSave 11
VZErrorVirtualMachineLimitExceeded 6
VZVirtualMachineStateError 3
VZVirtualMachineStatePaused 2
VZVirtualMachineStatePausing 5
VZVirtualMachineStateRestoring 9
VZVirtualMachineStateResuming 6
VZVirtualMachineStateRunning 1
VZVirtualMachineStateSaving 8
VZVirtualMachineStateStarting 4
VZVirtualMachineStateStopped 0
VZVirtualMachineStateStopping 7
VZErrorDomain VZErrorDomain
1 change: 1 addition & 0 deletions generate/modules/modules.go
Original file line number Diff line number Diff line change
Expand Up @@ -159,4 +159,5 @@ var All = []Module{
{"MetalPerformanceShadersGraph", "Metal Performance Shaders Graph", "mpsgraph", "MetalPerformanceShadersGraph/MetalPerformanceShadersGraph.h", []string{"MPSGraph"}},
{"MetalPerformanceShaders", "Metal Performance Shaders", "mps", "MetalPerformanceShaders/MetalPerformanceShaders.h", []string{"MPS"}},
{"MediaPlayer", "Media Player", "mediaplayer", "MediaPlayer/MediaPlayer.h", []string{"MP"}},
{"Virtualization", "Virtualization", "virtualization", "Virtualization/Virtualization.h", []string{"VZ"}},
}
7 changes: 7 additions & 0 deletions generate/tools/enumexport.go
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,10 @@ func exportConstants(db *generate.SymbolCache, framework *modules.Module, platfo
"kBluetoothKeyboardISOReturn",
"kBluetoothKeyboardANSIReturn",
"MTLGPUFamilyApple8", // prob not on my platform
"VZLinuxRosettaAvailabilityInstalled",
"VZLinuxRosettaAvailabilityNotInstalled",
"VZLinuxRosettaAvailabilityNotSupported",
"VZMacAuxiliaryStorageInitializationOptionAllowOverwrite",
}, s.Name) {
continue
}
Expand Down Expand Up @@ -270,6 +274,9 @@ func exportConstants(db *generate.SymbolCache, framework *modules.Module, platfo
if framework.Package == "coremediaio" {
extraInclude = "#import <CoreMediaIO/CMIOExtension.h>"
}
if framework.Package == "virtualization" {
extraLoad = "-framework CoreFoundation"
}
source := fmt.Sprintf(`package main

/*
Expand Down
2 changes: 1 addition & 1 deletion generate/tools/genmod.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import (
const TargetPlatform = "macos"

// TODO: replace with autodetect+env var
const TargetVersion = 12
const TargetVersion = 14

func main() {
cwd, err := os.Getwd()
Expand Down
1 change: 1 addition & 0 deletions generate/typing/kernel_type.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ func GetKernelType(typeName string) (Type, bool) {
"pid_t",
"gid_t",
"uid_t",
"ether_addr_t",
} {
if typeName == name {
return &KernelType{ObjcName_: typeName}, true
Expand Down
2 changes: 2 additions & 0 deletions kernel/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ type Matrix_float4x4 unsafe.Pointer
type Matrix_float4x3 unsafe.Pointer
type Matrix_double4x4 unsafe.Pointer

type Ether_addr unsafe.Pointer // need to be tested

// https://developer.apple.com/documentation/kernel/kernel_data_types?language=objc
// https://github.com/apple/darwin-xnu/blob/main/bsd/sys/_types.h
type Pid = int32
Expand Down
2 changes: 2 additions & 0 deletions macos/_examples/virtualization/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
initrd.img
vmlinuz
8 changes: 8 additions & 0 deletions macos/_examples/virtualization/entitlements
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.virtualization</key>
<true/>
</dict>
</plist>
95 changes: 95 additions & 0 deletions macos/_examples/virtualization/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
package main

import (
"fmt"
"os"
"strings"
"syscall"
"unsafe"

"github.com/pkg/term/termios"
"github.com/progrium/darwinkit/macos/foundation"
"github.com/progrium/darwinkit/macos/virtualization"
"golang.org/x/sys/unix"
)

func setRawMode(f *os.File) {
var attr unix.Termios

// Get settings for terminal
termios.Tcgetattr(f.Fd(), &attr)

// Put stdin into raw mode, disabling local echo, input canonicalization,
// and CR-NL mapping.
attr.Iflag &^= syscall.ICRNL
attr.Lflag &^= syscall.ICANON | syscall.ECHO

// Set minimum characters when reading = 1 char
attr.Cc[syscall.VMIN] = 1

// set timeout when reading as non-canonical mode
attr.Cc[syscall.VTIME] = 0

// reflects the changed settings
termios.Tcsetattr(f.Fd(), termios.TCSANOW, &attr)
}

func serialConsole() virtualization.VirtioConsoleDeviceSerialPortConfiguration {
console := virtualization.NewVirtioConsoleDeviceSerialPortConfiguration()

stdin := os.Stdin
stdout := os.Stdout

// // Put stdin into raw mode, disabling local echo, input canonicalization,
// // and CR-NL mapping.
setRawMode(stdin)

stdioAttachment := virtualization.NewFileHandleSerialPortAttachment()
stdioAttachment.InitWithFileHandleForReadingFileHandleForWriting(
foundation.NewFileHandleWithFileDescriptor(int(stdin.Fd())),
foundation.NewFileHandleWithFileDescriptor(int(stdout.Fd())),
)

console.SetAttachment(stdioAttachment)
return console
}

func bootLoader(kernelURL, initrdURL foundation.URL) virtualization.IBootLoader {
bootLoader := virtualization.NewLinuxBootLoaderWithKernelURL(kernelURL)
bootLoader.SetInitialRamdiskURL(initrdURL)
kernelCommandLineArguments := []string{
"console=hvc0",
}

bootLoader.SetCommandLine(strings.Join(kernelCommandLineArguments, " "))
return bootLoader
}

func main() {
configuration := virtualization.NewVirtualMachineConfiguration()
configuration.SetCPUCount(1)
configuration.SetMemorySize(2 * 1024 * 1024 * 1024)
configuration.SetSerialPorts([]virtualization.ISerialPortConfiguration{serialConsole()})
configuration.SetBootLoader(bootLoader(
foundation.NewURLFileURLWithPath("./macos/_examples/virtualmachine/vmlinuz"),
foundation.NewURLFileURLWithPath("./macos/_examples/virtualmachine/initrd.img"),
))

var nserr foundation.Error
if !configuration.ValidateWithError(unsafe.Pointer(&nserr)) {
fmt.Printf("Failed to validate the virtual machine configuration. %v\n", foundation.ToGoError(nserr))
os.Exit(1)
}

virtualMachine := virtualization.NewVirtualMachineWithConfiguration(configuration)
delegate := new(virtualization.VirtualMachineDelegate)
virtualMachine.SetDelegate(delegate)

virtualMachine.StartWithCompletionHandler(func(nserr foundation.Error) {
if !nserr.IsNil() {
fmt.Printf("Failed to start the virtual machine. %v", foundation.ToGoError(nserr))
}
})

foundation.RunLoop_MainRunLoop().RunUntilDate(foundation.Date_DistantFuture())
}
54 changes: 54 additions & 0 deletions macos/virtualization/audio_device_configuration.gen.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

54 changes: 54 additions & 0 deletions macos/virtualization/audio_input_stream_source.gen.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading