blob: 6ca32e1093459b426e151feda53f93242964ca18 [file] [log] [blame]
Tim Windelschmidt6d33a432025-02-04 14:34:25 +01001// Copyright The Monogon Project Authors.
2// SPDX-License-Identifier: Apache-2.0
3
Lorenz Brunc7b036b2023-06-01 12:23:57 +02004package kmod
5
6import (
7 "errors"
8 "fmt"
9 "syscall"
10 "unsafe"
11
12 "golang.org/x/sys/unix"
13)
14
15// LoadModule loads a kernel module into the kernel.
16func LoadModule(file syscall.Conn, params string, flags uintptr) error {
17 sc, err := file.SyscallConn()
18 if err != nil {
19 return fmt.Errorf("failed getting SyscallConn handle: %w", err)
20 }
21 paramsRaw, err := unix.BytePtrFromString(params)
22 if err != nil {
23 return errors.New("invalid null byte in params")
24 }
Tim Windelschmidt06c19642024-04-23 15:07:40 +020025 var errNo unix.Errno
Lorenz Brunc7b036b2023-06-01 12:23:57 +020026 ctrlErr := sc.Control(func(fd uintptr) {
Tim Windelschmidt06c19642024-04-23 15:07:40 +020027 _, _, errNo = unix.Syscall(unix.SYS_FINIT_MODULE, fd, uintptr(unsafe.Pointer(paramsRaw)), flags)
Lorenz Brunc7b036b2023-06-01 12:23:57 +020028 })
29 if ctrlErr != nil {
30 return fmt.Errorf("unable to get control handle: %w", ctrlErr)
31 }
Tim Windelschmidt06c19642024-04-23 15:07:40 +020032 if errNo != unix.Errno(0) {
33 return errNo
Lorenz Brunc7b036b2023-06-01 12:23:57 +020034 }
35 return nil
36}
37
38// UnloadModule unloads a kernel module from the kernel.
39func UnloadModule(name string, flags uintptr) error {
40 nameRaw, err := unix.BytePtrFromString(name)
41 if err != nil {
42 return errors.New("invalid null byte in name")
43 }
Tim Windelschmidt06c19642024-04-23 15:07:40 +020044 _, _, errNo := unix.Syscall(unix.SYS_DELETE_MODULE, uintptr(unsafe.Pointer(nameRaw)), flags, 0)
45 if errNo != unix.Errno(0) {
46 return errNo
Lorenz Brunc7b036b2023-06-01 12:23:57 +020047 }
Tim Windelschmidt06c19642024-04-23 15:07:40 +020048 return nil
Lorenz Brunc7b036b2023-06-01 12:23:57 +020049}