From 91cd5f837d06ac9b7d8ecd19b3aa62b10d24fe35 Mon Sep 17 00:00:00 2001 From: mehendarkarprajwal Date: Wed, 7 Oct 2026 03:27:08 -0500 Subject: [PATCH] initial port to AIX --- discover/cpu_aix.go | 30 ++++++++++++++++++++++++++++++ fs/gguf/gguf.go | 21 ++++++++++++++++----- llm/llama_server.go | 2 ++ llm/llm_aix.go | 7 +++++++ readline/term_aix.go | 21 +++++++++++++++++++++ 5 files changed, 76 insertions(+), 5 deletions(-) create mode 100644 discover/cpu_aix.go create mode 100644 llm/llm_aix.go create mode 100644 readline/term_aix.go diff --git a/discover/cpu_aix.go b/discover/cpu_aix.go new file mode 100644 index 000000000..4c037440d --- /dev/null +++ b/discover/cpu_aix.go @@ -0,0 +1,30 @@ +//go:build aix + +package discover + +/* +#include +#include +#include +*/ +import "C" +import ( + "fmt" + "unsafe" +) + +func GetCPUMem() (memInfo, error) { + var mem memInfo + var vmi C.struct_vminfo + if ret := C.vmgetinfo(unsafe.Pointer(&vmi), C.VMINFO, C.sizeof_struct_vminfo); ret != 0 { + return mem, fmt.Errorf("vmgetinfo failed: %d", ret) + } + pageSize := uint64(C.sysconf(C._SC_PAGE_SIZE)) + mem.TotalMemory = uint64(vmi.memsizepgs) * pageSize + mem.FreeMemory = uint64(vmi.numfrb) * pageSize + return mem, nil +} + +func IsNUMA() bool { + return false +} diff --git a/fs/gguf/gguf.go b/fs/gguf/gguf.go index 2ac903b80..eea0a5794 100644 --- a/fs/gguf/gguf.go +++ b/fs/gguf/gguf.go @@ -79,17 +79,28 @@ func open(path string, maxArraySize int) (_ *File, err error) { switch { case bytes.Equal(f.Magic[:], []byte("GGUF")): - f.byteOrder = binary.LittleEndian + var version uint32 + if err := binary.Read(f.reader, binary.LittleEndian, &version); err != nil { + return nil, err + } + // In a Big-Endian GGUF starting with ASCII "GGUF", version 3 is encoded as 0x00000003, + // which binary.LittleEndian reads as 0x03000000 (50331648). + if version > 0x0000FFFF && (version&0x0000FFFF) == 0 { + f.byteOrder = binary.BigEndian + f.Version = (version >> 24) | ((version >> 8) & 0x0000FF00) | ((version << 8) & 0x00FF0000) | (version << 24) + } else { + f.byteOrder = binary.LittleEndian + f.Version = version + } case bytes.Equal(f.Magic[:], []byte("FUGG")): f.byteOrder = binary.BigEndian + if err := binary.Read(f.reader, f.byteOrder, &f.Version); err != nil { + return nil, err + } default: return nil, fmt.Errorf("%w file type %v", ErrUnsupported, f.Magic) } - if err := binary.Read(f.reader, f.byteOrder, &f.Version); err != nil { - return nil, err - } - if f.Version < 1 { return nil, fmt.Errorf("%w version %v", ErrUnsupported, f.Version) } diff --git a/llm/llama_server.go b/llm/llama_server.go index c7cd91518..649811a10 100644 --- a/llm/llama_server.go +++ b/llm/llama_server.go @@ -483,6 +483,8 @@ func llamaServerLibraryPathEnv() string { return "PATH" case "darwin": return "DYLD_LIBRARY_PATH" + case "aix": + return "LIBPATH" default: return "LD_LIBRARY_PATH" } diff --git a/llm/llm_aix.go b/llm/llm_aix.go new file mode 100644 index 000000000..60837ed06 --- /dev/null +++ b/llm/llm_aix.go @@ -0,0 +1,7 @@ +package llm + +import ( + "syscall" +) + +var LlamaServerSysProcAttr = &syscall.SysProcAttr{} diff --git a/readline/term_aix.go b/readline/term_aix.go new file mode 100644 index 000000000..566567706 --- /dev/null +++ b/readline/term_aix.go @@ -0,0 +1,21 @@ +//go:build aix + +package readline + +import ( + "golang.org/x/sys/unix" +) + +func getTermios(fd uintptr) (*Termios, error) { + t, err := unix.IoctlGetTermios(int(fd), unix.TCGETS) + if err != nil { + return nil, err + } + termios := Termios(*t) + return &termios, nil +} + +func setTermios(fd uintptr, termios *Termios) error { + t := unix.Termios(*termios) + return unix.IoctlSetTermios(int(fd), unix.TCSETS, &t) +}