aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal
diff options
context:
space:
mode:
Diffstat (limited to 'internal')
-rw-r--r--internal/outcome/process.go2
-rw-r--r--internal/pkg/archive.go411
-rw-r--r--internal/pkg/archive_test.go240
-rw-r--r--internal/pkg/clean.go161
-rw-r--r--internal/pkg/clean_test.go293
-rw-r--r--internal/pkg/compress.go151
-rw-r--r--internal/pkg/compress_test.go72
-rw-r--r--internal/pkg/exec.go808
-rw-r--r--internal/pkg/exec_test.go670
-rw-r--r--internal/pkg/file.go100
-rw-r--r--internal/pkg/file_test.go56
-rw-r--r--internal/pkg/internal/testtool/expected/expected.go9
-rw-r--r--internal/pkg/internal/testtool/expected/sum_amd64.go11
-rw-r--r--internal/pkg/internal/testtool/expected/sum_arm64.go11
-rw-r--r--internal/pkg/internal/testtool/expected/sum_riscv64.go11
-rw-r--r--internal/pkg/internal/testtool/main.go277
-rw-r--r--internal/pkg/ir.go865
-rw-r--r--internal/pkg/ir_test.go170
-rw-r--r--internal/pkg/net.go109
-rw-r--r--internal/pkg/net_test.go168
-rw-r--r--internal/pkg/pkg.go2947
-rw-r--r--internal/pkg/pkg_test.go2375
-rw-r--r--internal/pkg/tar.go226
-rw-r--r--internal/pkg/tar_test.go225
-rw-r--r--internal/rosa/builtins.go2
-rw-r--r--internal/rosa/etc.go2
-rw-r--r--internal/rosa/gentoo.go2
-rw-r--r--internal/rosa/git.go2
-rw-r--r--internal/rosa/go.go2
-rw-r--r--internal/rosa/llvm.go2
-rw-r--r--internal/rosa/llvm_test.go2
-rw-r--r--internal/rosa/mirror.go2
-rw-r--r--internal/rosa/mirror_test.go2
-rw-r--r--internal/rosa/package/hakurei.az4
-rw-r--r--internal/rosa/package/kernel/package.az2
-rw-r--r--internal/rosa/package/kernel/riscv64.config11969
-rw-r--r--internal/rosa/report.go2
-rw-r--r--internal/rosa/report_test.go2
-rw-r--r--internal/rosa/rosa.go2
-rw-r--r--internal/rosa/rosa_test.go2
-rw-r--r--internal/rosa/state.go2
-rw-r--r--internal/store/data.go10
-rw-r--r--internal/store/header.go3
-rw-r--r--internal/store/segment.go66
-rw-r--r--internal/store/segment_test.go78
-rw-r--r--internal/store/store.go80
-rw-r--r--internal/uevent/coldboot_test.go2
47 files changed, 212 insertions, 22398 deletions
diff --git a/internal/outcome/process.go b/internal/outcome/process.go
index 614b22fc..599af8f2 100644
--- a/internal/outcome/process.go
+++ b/internal/outcome/process.go
@@ -303,7 +303,7 @@ func (k *outcome) main(msg message.Msg, identifierFd int) {
)
for eh := range entries {
var et hst.Enablements
- if et, err = eh.Load(nil); err != nil {
+ if et, err = eh.Load(nil, syscall.Kill); err != nil {
perror(err, "read state header of instance "+eh.ID.String())
} else {
rt |= et
diff --git a/internal/pkg/archive.go b/internal/pkg/archive.go
deleted file mode 100644
index ea4017d9..00000000
--- a/internal/pkg/archive.go
+++ /dev/null
@@ -1,411 +0,0 @@
-package pkg
-
-import (
- "crypto/sha512"
- "encoding/binary"
- "errors"
- "fmt"
- "io"
- "io/fs"
- "os"
- "path/filepath"
- "unsafe"
-
- "hakurei.app/check"
-)
-
-/*
-| mode uint32 | path_sz uint32 |
-| data_sz uint64 |
-| path string |
-| data []byte |
-*/
-
-// An ArchiveHeader represents a single header in an archive.
-type ArchiveHeader struct {
- Mode fs.FileMode // file mode bits
- Path string // pathname of the file
- Size uint64 // size of data segment
-}
-
-// Writer implements sequential writing of an archive. [Writer.WriteHeader]
-// begins a new file with the provided [ArchiveHeader], and then Writer can be
-// treated as an [io.Writer] to supply that file's data.
-//
-// It is the caller's responsibility to write entries in lexical order.
-type Writer struct {
- // Underlying writer.
- w io.Writer
- // Current header.
- h ArchiveHeader
- // Fixed-size header segment.
- buf [wordSize * 2]byte
- // Current position in data segment.
- n uint64
-}
-
-// NewWriter returns the address of a new [Writer] writing to w.
-func NewWriter(w io.Writer) *Writer { return &Writer{w: w} }
-
-var zero [wordSize]byte
-
-// padSize returns the padding size for aligning sz.
-func padSize[T int | uint64](sz T) T {
- return (wordSize - (sz)%wordSize) % wordSize
-}
-
-// flush concludes writing to the current file and writes padding.
-func (aw *Writer) flush() error {
- if aw.h.Size > aw.n {
- return fmt.Errorf("missed writing %d bytes", aw.h.Size-aw.n)
- } else if aw.h.Size < aw.n {
- return fmt.Errorf("wrote %d bytes beyond end of file", aw.n-aw.h.Size)
- }
-
- if psz := padSize(aw.h.Size); psz != 0 {
- if _, err := aw.w.Write(zero[:psz]); err != nil {
- return err
- }
- }
-
- aw.n = 0
- return nil
-}
-
-// WriteHeader writes h and begins accepting its corresponding file.
-func (aw *Writer) WriteHeader(h *ArchiveHeader) error {
- if err := aw.flush(); err != nil {
- return err
- }
-
- aw.h = *h
- binary.LittleEndian.PutUint32(aw.buf[:], uint32(aw.h.Mode))
- binary.LittleEndian.PutUint32(aw.buf[wordSize/2:], uint32(len(aw.h.Path)))
- binary.LittleEndian.PutUint64(aw.buf[wordSize:], aw.h.Size)
- if _, err := aw.w.Write(aw.buf[:]); err != nil {
- return err
- } else if _, err = aw.w.Write(
- unsafe.Slice(unsafe.StringData(aw.h.Path), len(aw.h.Path)),
- ); err != nil {
- return err
- } else if psz := padSize(len(aw.h.Path)); psz != 0 {
- if _, err = aw.w.Write(zero[:psz]); err != nil {
- return err
- }
- }
- return nil
-}
-
-// Write writes p to the underlying writer and records the new position. Invalid
-// positions are reported by WriteHeader and Close.
-func (aw *Writer) Write(p []byte) (n int, err error) {
- n, err = aw.w.Write(p)
- aw.n += uint64(n)
- return
-}
-
-// Close concludes writing to the archive stream.
-func (aw *Writer) Close() (err error) {
- err = aw.flush()
- aw.w = nil
- return
-}
-
-// ErrInsecurePath is returned by [FlatEntry.Decode] if validation is requested
-// and a nonlocal path is encountered in the stream.
-var ErrInsecurePath = errors.New("insecure file path")
-
-// Reader implements sequential reading of an archive. [Reader.Next] advances to
-// the next file in the archive (including the first), and then Reader can be
-// treated as an [io.Reader] to access the file's data.
-type Reader struct {
- // Underlying reader.
- r io.Reader
- // Fixed-size header segment.
- buf [wordSize * 2]byte
- // Remaining bytes in current data segment.
- n, pad uint64
-}
-
-// NewReader returns the address of a new [Reader] reading from r.
-func NewReader(r io.Reader) *Reader { return &Reader{r: r} }
-
-// Next advances ar to the next entry. Remaining bytes of the current data
-// segment are discarded. Advancing beyond the final entry returns [io.EOF].
-func (ar *Reader) Next() (*ArchiveHeader, error) {
- if dsz := int64(ar.n + ar.pad); dsz > 0 {
- if n, err := io.CopyN(io.Discard, ar.r, dsz); err != nil {
- if errors.Is(err, io.EOF) && n != dsz {
- err = io.ErrUnexpectedEOF
- }
- return nil, err
- }
- }
-
- if _, err := io.ReadFull(ar.r, ar.buf[:]); err != nil {
- return nil, err
- }
-
- h := ArchiveHeader{
- Mode: fs.FileMode(binary.LittleEndian.Uint32(ar.buf[:])),
- Size: binary.LittleEndian.Uint64(ar.buf[wordSize:]),
- }
- pathSize := int(binary.LittleEndian.Uint32(ar.buf[wordSize/2:]))
- pPathSize := alignSize(pathSize)
-
- buf := make([]byte, pPathSize)
- if _, err := io.ReadFull(ar.r, buf); err != nil {
- if errors.Is(err, io.EOF) {
- err = io.ErrUnexpectedEOF
- }
- return nil, err
- }
-
- h.Path = unsafe.String(unsafe.SliceData(buf), pathSize)
- if !filepath.IsLocal(h.Path) {
- return &h, ErrInsecurePath
- }
-
- ar.n = h.Size
- ar.pad = padSize(h.Size)
- return &h, nil
-}
-
-// Read implements [io.Reader] for the data segment of the current entry.
-func (ar *Reader) Read(p []byte) (n int, err error) {
- if uint64(len(p)) > ar.n {
- p = p[:ar.n]
- }
-
- if len(p) > 0 {
- n, err = ar.r.Read(p)
- ar.n -= uint64(n)
- }
-
- switch err {
- case io.EOF:
- if ar.n > 0 {
- return n, io.ErrUnexpectedEOF
- }
-
- case nil:
- if ar.n == 0 {
- return n, io.EOF
- }
- }
- return
-}
-
-// Write writes a deterministic representation of the contents of fsys to w.
-// The resulting data can be hashed to produce a deterministic checksum for the
-// directory.
-func Write(fsys fs.FS, root string, w io.Writer) error {
- aw := NewWriter(w)
- if err := fs.WalkDir(fsys, root, func(path string, d fs.DirEntry, err error) error {
- if err != nil {
- return err
- }
-
- var fi fs.FileInfo
- fi, err = d.Info()
- if err != nil {
- return err
- }
-
- h := ArchiveHeader{
- Path: path,
- Mode: fi.Mode(),
- }
- if h.Mode.IsRegular() {
- h.Size = uint64(fi.Size())
- if err = aw.WriteHeader(&h); err != nil {
- return err
- }
-
- var r fs.File
- r, err = fsys.Open(path)
- if err != nil {
- return err
- }
- _, err = io.Copy(aw, r)
- if _err := r.Close(); err == nil {
- err = _err
- }
- return err
- } else if h.Mode&fs.ModeSymlink != 0 {
- var newpath string
- if newpath, err = fs.ReadLink(fsys, path); err != nil {
- return err
- }
-
- h.Size = uint64(len(newpath))
- if err = aw.WriteHeader(&h); err != nil {
- return err
- }
-
- _, err = aw.Write(unsafe.Slice(unsafe.StringData(newpath), len(newpath)))
- return err
- } else if !h.Mode.IsDir() {
- return InvalidFileModeError(h.Mode)
- }
- return aw.WriteHeader(&h)
- }); err != nil {
- return err
- }
- return aw.Close()
-}
-
-// SumFS saves checksum of the archive of fsys to the value pointed to by buf.
-func SumFS(buf *Checksum, fsys fs.FS, root string) error {
- h := sha512.New384()
- if err := Write(fsys, root, h); err != nil {
- return err
- }
- h.Sum(buf[:0])
- return nil
-}
-
-// SumDir saves checksum of the archive of directory at pathname to the value
-// pointed to by buf.
-func SumDir(buf *Checksum, pathname *check.Absolute) error {
- return SumFS(buf, os.DirFS(pathname.String()), ".")
-}
-
-// archiveArtifact is an [Artifact] unpacking an archive supported by [Reader]
-// backed by a [FileArtifact].
-type archiveArtifact struct {
- // Caller-supplied backing archive.
- f Artifact
-}
-
-var _ CuresExempt = archiveArtifact{}
-
-// NewArchive returns a new [Artifact] backed by the supplied [Artifact]. The
-// source [Artifact] must be a [FileArtifact] and produce a stream compatible
-// with [Reader].
-func NewArchive(a Artifact) Artifact {
- return archiveArtifact{a}
-}
-
-// Kind returns the hardcoded [Kind] constant.
-func (archiveArtifact) Kind() Kind { return KindArchive }
-
-// Params is a noop.
-func (archiveArtifact) Params(*IContext) {}
-
-func init() {
- register(KindArchive, func(r *IRReader) Artifact {
- a := NewArchive(r.Next())
- if _, ok := r.Finalise(); ok {
- panic(ErrUnexpectedChecksum)
- }
- return a
- })
-}
-
-// Inputs returns a slice containing the backing file.
-func (a archiveArtifact) Inputs() []Artifact {
- return []Artifact{a.f}
-}
-
-// IsExclusive returns false: [Reader] is fully sequential.
-func (archiveArtifact) IsExclusive() bool { return false }
-
-// Cure cures the [Artifact], producing a directory located at work.
-func (a archiveArtifact) Cure(t *TContext) (err error) {
- var r io.ReadCloser
- if r, err = t.Open(a.f); err != nil {
- return
- }
-
- defer func() {
- closeErr := r.Close()
- if err == nil {
- err = closeErr
- }
- }()
-
- type dirTargetPerm struct {
- path string
- mode fs.FileMode
- }
- var madeDirectories []dirTargetPerm
-
- if err = os.MkdirAll(t.GetWorkDir().String(), 0700); err != nil {
- return
- }
- var root *os.Root
- if root, err = os.OpenRoot(t.GetWorkDir().String()); err != nil {
- return
- }
- defer func() {
- closeErr := root.Close()
- if err == nil {
- err = closeErr
- }
- }()
-
- var header *ArchiveHeader
- ar := NewReader(r)
- for header, err = ar.Next(); err == nil; header, err = ar.Next() {
- if header.Mode.IsRegular() {
- var f *os.File
- if f, err = root.OpenFile(
- header.Path,
- os.O_CREATE|os.O_EXCL|os.O_WRONLY,
- header.Mode.Perm(),
- ); err != nil {
- return
- }
- if _, err = io.Copy(f, ar); err != nil {
- _ = f.Close()
- return
- } else if err = f.Close(); err != nil {
- return
- }
- } else if header.Mode&fs.ModeSymlink != 0 {
- var p []byte
- if p, err = io.ReadAll(ar); err != nil {
- return
- }
-
- if err = root.Symlink(
- unsafe.String(unsafe.SliceData(p), len(p)),
- header.Path,
- ); err != nil {
- return
- }
- } else if header.Mode.IsDir() {
- if header.Path == "." {
- continue
- }
-
- madeDirectories = append(madeDirectories, dirTargetPerm{
- path: header.Path,
- mode: header.Mode,
- })
- if err = root.Mkdir(header.Path, 0700); err != nil {
- return
- }
- } else {
- return InvalidFileModeError(header.Mode)
- }
- }
- if errors.Is(err, io.EOF) {
- err = nil
- }
- if err == nil {
- for _, e := range madeDirectories {
- if err = root.Chmod(e.path, e.mode.Perm()); err != nil {
- return
- }
- }
- } else {
- return
- }
- return
-}
-
-// CuresExempt exempts the cheap [KindArchive] implementation often found at
-// the end of a [FileArtifact] pipeline.
-func (archiveArtifact) CuresExempt() {}
diff --git a/internal/pkg/archive_test.go b/internal/pkg/archive_test.go
deleted file mode 100644
index 1cb4bea9..00000000
--- a/internal/pkg/archive_test.go
+++ /dev/null
@@ -1,240 +0,0 @@
-package pkg_test
-
-import (
- "bytes"
- "io"
- "io/fs"
- "maps"
- "reflect"
- "testing"
- "testing/fstest"
- "unsafe"
-
- "hakurei.app/check"
- "hakurei.app/internal/pkg"
-)
-
-func TestArchive(t *testing.T) {
- t.Parallel()
-
- type entry struct {
- path string
- mode fs.FileMode
- data string
- }
- testCases := []struct {
- name string
- fsys fs.FS
- entries []entry
- sum pkg.Checksum
- err error
- }{
- {"bad type", fstest.MapFS{
- ".": {Mode: fs.ModeDir | 0700},
- "invalid": {Mode: fs.ModeCharDevice | 0400},
- }, nil, pkg.Checksum{}, pkg.InvalidFileModeError(
- fs.ModeCharDevice | 0400,
- )},
-
- {"coldboot", fstest.MapFS{
- ".": {Mode: fs.ModeDir | 0700},
-
- "devices": {Mode: fs.ModeDir | 0700},
- "devices/uevent": {Mode: 0600, Data: []byte("add")},
- "devices/empty": {Mode: fs.ModeDir | 0700},
-
- "devices/sub": {Mode: fs.ModeDir | 0700},
- "devices/sub/uevent": {Mode: 0600, Data: []byte("add")},
-
- "block": {Mode: fs.ModeDir | 0700},
- "block/uevent": {Mode: 0600},
- }, []entry{
- {".", fs.ModeDir | 0700, ""},
-
- {"block", fs.ModeDir | 0700, ""},
- {"block/uevent", 0600, ""},
-
- {"devices", fs.ModeDir | 0700, ""},
- {"devices/empty", fs.ModeDir | 0700, ""},
- {"devices/sub", fs.ModeDir | 0700, ""},
- {"devices/sub/uevent", 0600, "add"},
- {"devices/uevent", 0600, "add"},
- }, pkg.MustDecode("mEy_Lf5KotThm7OwMx7yTKZh5HCCyaB41pVAvI9uDMgVQFM91iosBLYsRm8bDsX8"), nil},
-
- {"empty", fstest.MapFS{
- ".": {Mode: fs.ModeDir | 0700},
- "checksum": {Mode: fs.ModeDir | 0700},
- "identifier": {Mode: fs.ModeDir | 0700},
- "work": {Mode: fs.ModeDir | 0700},
- }, []entry{
- {".", fs.ModeDir | 0700, ""},
- {"checksum", fs.ModeDir | 0700, ""},
- {"identifier", fs.ModeDir | 0700, ""},
- {"work", fs.ModeDir | 0700, ""},
- }, pkg.MustDecode("E4vEZKhCcL2gPZ2Tt59FS3lDng-d_2SKa2i5G_RbDfwGn6EemptFaGLPUDiOa94C"), nil},
-
- {"sample directory step garbage", fstest.MapFS{
- ".": {Mode: fs.ModeDir | 0500},
-
- "lib": {Mode: fs.ModeDir | 0500},
- "lib/check": {Mode: 0400},
-
- "lib/pkgconfig": {Mode: fs.ModeDir | 0500},
- }, []entry{
- {".", fs.ModeDir | 0500, ""},
-
- {"lib", fs.ModeDir | 0500, ""},
- {"lib/check", 0400, ""},
-
- {"lib/pkgconfig", fs.ModeDir | 0500, ""},
- }, pkg.MustDecode("CUx-3hSbTWPsbMfDhgalG4Ni_GmR9TnVX8F99tY_P5GtkYvczg9RrF5zO0jX9XYT"), nil},
- }
- for _, tc := range testCases {
- t.Run(tc.name, func(t *testing.T) {
- t.Parallel()
-
- t.Run("roundtrip", func(t *testing.T) {
- t.Parallel()
-
- var buf bytes.Buffer
- if err := pkg.Write(
- tc.fsys,
- ".",
- &buf,
- ); !reflect.DeepEqual(err, tc.err) {
- t.Fatalf("Flatten: error = %v, want %v", err, tc.err)
- } else if tc.err != nil {
- return
- }
-
- r := pkg.NewReader(bytes.NewReader(buf.Bytes()))
- var got []entry
- for {
- h, err := r.Next()
- if err != nil {
- if err == io.EOF {
- break
- }
- t.Fatalf("Next: error = %v", err)
- }
-
- var data []byte
- if data, err = io.ReadAll(r); err != nil {
- t.Fatalf("Read: error = %v", err)
- }
-
- got = append(got, entry{
- path: h.Path,
- mode: h.Mode,
- data: unsafe.String(unsafe.SliceData(data), len(data)),
- })
- }
-
- if !reflect.DeepEqual(got, tc.entries) {
- t.Fatalf("Reader: %#v, want %#v", got, tc.entries)
- }
- })
-
- if tc.err != nil {
- return
- }
-
- t.Run("hash", func(t *testing.T) {
- t.Parallel()
-
- var got pkg.Checksum
- if err := pkg.SumFS(&got, tc.fsys, "."); err != nil {
- t.Fatalf("SumFS: error = %v", err)
- } else if got != tc.sum {
- t.Fatalf("SumFS: %v", &pkg.ChecksumMismatchError{
- Got: got,
- Want: tc.sum,
- })
- }
- })
- })
- }
-}
-
-var archiveTestdata = fstest.MapFS{
- ".": {Mode: fs.ModeDir | 0700},
-
- "devices": {Mode: fs.ModeDir | 0700},
- "devices/uevent": {Mode: 0600, Data: []byte("add")},
- "devices/empty": {Mode: fs.ModeDir | 0700},
-
- "devices/sub": {Mode: fs.ModeDir | 0700},
- "devices/sub/uevent": {Mode: 0600, Data: []byte("add")},
-
- "block": {Mode: fs.ModeDir | 0700},
- "block/uevent": {Mode: 0600},
-}
-
-func TestArchiveArtifact(t *testing.T) {
- t.Parallel()
-
- want := maps.Clone(archiveTestdata)
- want["."].Mode = fs.ModeDir | 0500
-
- checkWithCache(t, []cacheTestCase{
- {"unpack", 0, nil, func(t *testing.T, base *check.Absolute, c *pkg.Cache) {
- var buf bytes.Buffer
- if err := pkg.Write(archiveTestdata, ".", &buf); err != nil {
- t.Fatal(err)
- }
-
- cureMany(t, c, []cureStep{
- {"sample", pkg.NewArchive(
- pkg.NewFile("", buf.Bytes()),
- ), ignorePathname, expectsFS(want), pkg.WNew, nil},
- })
- }, expectsFS{
- ".": {Mode: fs.ModeDir | 0700},
-
- "checksum": {Mode: fs.ModeDir | 0700},
- "checksum/CBPcoVHuVUTVRCMbRl8J30RSSzm_tyfuXaZ-HlZsanY1sY50meOVmgaWDrGKbx9F": {Mode: fs.ModeDir | 0500},
- "checksum/CBPcoVHuVUTVRCMbRl8J30RSSzm_tyfuXaZ-HlZsanY1sY50meOVmgaWDrGKbx9F/block": {Mode: fs.ModeDir | 0700},
- "checksum/CBPcoVHuVUTVRCMbRl8J30RSSzm_tyfuXaZ-HlZsanY1sY50meOVmgaWDrGKbx9F/block/uevent": {Mode: 0600},
- "checksum/CBPcoVHuVUTVRCMbRl8J30RSSzm_tyfuXaZ-HlZsanY1sY50meOVmgaWDrGKbx9F/devices": {Mode: fs.ModeDir | 0700},
- "checksum/CBPcoVHuVUTVRCMbRl8J30RSSzm_tyfuXaZ-HlZsanY1sY50meOVmgaWDrGKbx9F/devices/empty": {Mode: fs.ModeDir | 0700},
- "checksum/CBPcoVHuVUTVRCMbRl8J30RSSzm_tyfuXaZ-HlZsanY1sY50meOVmgaWDrGKbx9F/devices/sub": {Mode: fs.ModeDir | 0700},
- "checksum/CBPcoVHuVUTVRCMbRl8J30RSSzm_tyfuXaZ-HlZsanY1sY50meOVmgaWDrGKbx9F/devices/sub/uevent": {Mode: 0600, Data: []byte("add")},
- "checksum/CBPcoVHuVUTVRCMbRl8J30RSSzm_tyfuXaZ-HlZsanY1sY50meOVmgaWDrGKbx9F/devices/uevent": {Mode: 0600, Data: []byte("add")},
-
- "identifier": {Mode: fs.ModeDir | 0700},
- "identifier/-zXKfphyWM2Ko7VMVURaEMSuixNokFSe0xFbnwR2RtRtvMrcPGWalV0LIn45PXTY": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/CBPcoVHuVUTVRCMbRl8J30RSSzm_tyfuXaZ-HlZsanY1sY50meOVmgaWDrGKbx9F")},
-
- "substitute": {Mode: fs.ModeDir | 0700},
- "work": {Mode: fs.ModeDir | 0700},
- }},
- })
-}
-
-func BenchmarkArchiveRead(b *testing.B) {
- var buf bytes.Buffer
- if err := pkg.Write(archiveTestdata, ".", &buf); err != nil {
- b.Fatal(err)
- }
- testdata := buf.Bytes()
-
- for b.Loop() {
- r := pkg.NewReader(bytes.NewReader(testdata))
- for {
- _, err := r.Next()
- if err != nil {
- if err == io.EOF {
- break
- }
- b.Fatal(err)
- }
- }
- }
-}
-
-func BenchmarkArchiveWrite(b *testing.B) {
- for b.Loop() {
- if err := pkg.Write(archiveTestdata, ".", io.Discard); err != nil {
- b.Fatal(err)
- }
- }
-}
diff --git a/internal/pkg/clean.go b/internal/pkg/clean.go
deleted file mode 100644
index f07706cf..00000000
--- a/internal/pkg/clean.go
+++ /dev/null
@@ -1,161 +0,0 @@
-package pkg
-
-import (
- "errors"
- "os"
- "unique"
-)
-
-// Clean destroys checksum backing entries without any identifier or substitute
-// entry referring to it. If at least one keep [Artifact] is specified,
-// identifier and substitute entries not kept alive by them are destroyed first.
-func (c *Cache) Clean(dry, inputs bool, keep ...Artifact) (
- []unique.Handle[ID],
- []unique.Handle[Checksum],
- error,
-) {
- c.identMu.Lock()
- defer c.identMu.Unlock()
-
- c.checksumMu.Lock()
- defer c.checksumMu.Unlock()
-
- dents, err := os.ReadDir(c.base.Append(dirChecksum).String())
- if err != nil {
- return nil, nil, err
- }
- checksums := make(map[unique.Handle[Checksum]]string, len(dents))
- var buf Checksum
- for _, dent := range dents {
- name := dent.Name()
- if err = Decode(&buf, name); err != nil {
- return nil, nil, err
- }
- checksums[unique.Make(buf)] = name
- }
-
- type identPair struct {
- id unique.Handle[ID]
- name string
- }
- dents, err = os.ReadDir(c.base.Append(dirIdentifier).String())
- if err != nil {
- return nil, nil, err
- }
-
- keepIdents := make(map[unique.Handle[ID]]struct{})
- if inputs {
- for _, id := range Inputs((*Collect)(&keep)) {
- keepIdents[id] = struct{}{}
- }
- } else {
- for _, a := range keep {
- keepIdents[c.Ident(a)] = struct{}{}
- }
- }
-
- idents := make([]identPair, 0, len(dents))
- for _, dent := range dents {
- name := dent.Name()
- if err = Decode(&buf, name); err != nil {
- return nil, nil, err
- }
- id := unique.Make(ID(buf))
-
- if _, ok := keepIdents[id]; len(keep) == 0 || ok {
- if err = readlinkChecksum(c.base.Append(
- dirIdentifier,
- name,
- ), &buf); err != nil {
- return nil, nil, err
- }
- delete(checksums, unique.Make(buf))
- continue
- }
-
- c.msg.Verbosef(
- "arranging for destruction of %s%s%s...",
- c.sgrIdent, name, c.sgrRes,
- )
- idents = append(idents, identPair{id, name})
- }
-
- destroyedIdents := make([]unique.Handle[ID], 0, len(idents))
- for _, pair := range idents {
- if !dry {
- if err = os.Remove(c.base.Append(
- dirStatus,
- pair.name,
- ).String()); err != nil && !errors.Is(err, os.ErrNotExist) {
- return destroyedIdents, nil, err
- }
-
- if err = os.Remove(c.base.Append(
- dirIdentifier,
- pair.name,
- ).String()); err != nil {
- return destroyedIdents, nil, err
- }
- }
- destroyedIdents = append(destroyedIdents, pair.id)
- }
-
- destroyedChecksums := make([]unique.Handle[Checksum], 0, len(checksums))
- for checksum, name := range checksums {
- if err = c.parent.Err(); err != nil {
- return destroyedIdents, destroyedChecksums, err
- }
- c.msg.Verbosef(
- "destroying checksum %s%s%s...",
- c.sgrIdent, name, c.sgrRes,
- )
- if !dry {
- if err = errors.Join(removeAll(c.base.Append(
- dirChecksum,
- name,
- ))); err != nil {
- return destroyedIdents, destroyedChecksums, err
- }
- }
- destroyedChecksums = append(destroyedChecksums, checksum)
- }
-
- dents, err = os.ReadDir(c.base.Append(dirSubstitute).String())
- if err != nil {
- return destroyedIdents, destroyedChecksums, err
- }
- for _, dent := range dents {
- name := dent.Name()
- if err = readlinkChecksum(c.base.Append(
- dirSubstitute,
- name,
- ), &buf); err != nil {
- return destroyedIdents, destroyedChecksums, err
- }
- if _, ok := checksums[unique.Make(buf)]; !ok {
- continue
- }
-
- c.msg.Verbosef(
- "destroying substitute %s%s%s...",
- c.sgrIdent, name, c.sgrRes,
- )
- if !dry {
- if err = os.Remove(c.base.Append(
- dirStatus,
- name,
- ).String()); err != nil && !errors.Is(err, os.ErrNotExist) {
- return destroyedIdents, nil, err
- }
-
- if err = os.Remove(c.base.Append(
- dirSubstitute,
- name,
- ).String()); err != nil {
- return destroyedIdents, destroyedChecksums, err
- }
- }
- }
-
- return destroyedIdents, destroyedChecksums, nil
-}
diff --git a/internal/pkg/clean_test.go b/internal/pkg/clean_test.go
deleted file mode 100644
index 67dceb09..00000000
--- a/internal/pkg/clean_test.go
+++ /dev/null
@@ -1,293 +0,0 @@
-package pkg_test
-
-import (
- "bytes"
- "crypto/sha512"
- "io/fs"
- "log"
- "os"
- "slices"
- "strings"
- "testing"
- "unique"
-
- "hakurei.app/internal/pkg"
- "hakurei.app/message"
-)
-
-// formatHandles returns a user-facing string representing h.
-func formatHandles[T pkg.ID | pkg.Checksum](handles ...unique.Handle[T]) string {
- var buf strings.Builder
- for _, h := range handles {
- buf.WriteString(pkg.Encode(pkg.Checksum(h.Value())))
- buf.WriteString(", ")
- }
- return strings.TrimSuffix(buf.String(), ", ")
-}
-
-func TestClean(t *testing.T) {
- t.Parallel()
- ic := pkg.NewIR()
-
- testCases := []struct {
- name string
- a []pkg.Artifact
- keep []pkg.Artifact
- inputs bool
- want expectsFS
-
- wantIdents []unique.Handle[pkg.ID]
- wantChecksums []unique.Handle[pkg.Checksum]
- }{
- {"simple", []pkg.Artifact{
- pkg.NewFile("file", nil),
- }, nil, false, expectsFS{
- ".": {Mode: fs.ModeDir | 0700},
-
- "checksum": {Mode: fs.ModeDir | 0700},
- "checksum/OLBgp1GsljhM2TJ-sbHjaiH9txEUvgdDTAzHv2P24donTt6_529l-9Ua0vFImLlb": {Mode: 0400},
-
- "identifier": {Mode: fs.ModeDir | 0700},
- "identifier/h6qx7m0vsyhO6oLEJgY2rKa1c6RZuIZ4QXxZSh__NZJ9VU0MIj5bFB-KuaPcsfpE": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/OLBgp1GsljhM2TJ-sbHjaiH9txEUvgdDTAzHv2P24donTt6_529l-9Ua0vFImLlb")},
-
- "lock": {Mode: 0644},
- "variant": {Mode: 0400},
- "status": {Mode: fs.ModeDir | 0700},
- "substitute": {Mode: fs.ModeDir | 0700},
- "fault": {Mode: fs.ModeDir | 0700},
- "work": {Mode: fs.ModeDir | 0700},
- }, nil, nil},
-
- {"keep", []pkg.Artifact{
- pkg.NewFile("removed-file", []byte("removed file")),
- }, []pkg.Artifact{
- pkg.NewFile("file", []byte("\xfd")),
- }, false, expectsFS{
- ".": {Mode: fs.ModeDir | 0700},
-
- "checksum": {Mode: fs.ModeDir | 0700},
- "checksum/KgZ-FjbGuU-XP2QEHInpgv-2Zn0cTH5NqFMgTU0XrSdKmSwyC-3baVs1BMCP5spk": {Mode: 0400, Data: []byte("\xfd")},
-
- "identifier": {Mode: fs.ModeDir | 0700},
- "identifier/tkrOYhQfTRaArk4nNYNjTmHQUmuJMVIoDeAKIQBm3I4uuMimBKXKMIY2gGZqwQg4": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/KgZ-FjbGuU-XP2QEHInpgv-2Zn0cTH5NqFMgTU0XrSdKmSwyC-3baVs1BMCP5spk")},
-
- "lock": {Mode: 0644},
- "variant": {Mode: 0400},
- "status": {Mode: fs.ModeDir | 0700},
- "substitute": {Mode: fs.ModeDir | 0700},
- "fault": {Mode: fs.ModeDir | 0700},
- "work": {Mode: fs.ModeDir | 0700},
- }, []unique.Handle[pkg.ID]{
- ic.Ident(pkg.NewFile("removed-file", []byte("removed file"))),
- }, []unique.Handle[pkg.Checksum]{
- unique.Make(sha512.Sum384([]byte("removed file"))),
- }},
-
- {"inputs anchored substitute", []pkg.Artifact{
- &stubArtifactF{
- kind: pkg.KindExec,
- params: []byte("destroyed"),
- deps: []pkg.Artifact{
- pkg.NewFile("destroyed-input", []byte("destroyed")),
- },
- cure: func(f *pkg.FContext) error {
- p := f.GetWorkDir()
- if err := os.MkdirAll(p.String(), 0755); err != nil {
- return err
- }
- return os.WriteFile(p.Append("result").String(), nil, 0444)
- },
- },
- }, []pkg.Artifact{
- &stubArtifactF{
- kind: pkg.KindExec,
- params: []byte("kept"),
- deps: []pkg.Artifact{
- pkg.NewFile("kept-input", []byte("kept")),
- },
- cure: func(f *pkg.FContext) error {
- p := f.GetWorkDir()
- if err := os.MkdirAll(p.String(), 0755); err != nil {
- return err
- }
- return os.WriteFile(p.Append("result").String(), nil, 0444)
- },
- },
- }, true, expectsFS{
- ".": {Mode: fs.ModeDir | 0700},
-
- "checksum": {Mode: fs.ModeDir | 0700},
- "checksum/H-eSiCo227-xdqyNl2R-5G3eqXPtbb8XegAB70I5OQb2majeZXJoCxTq9wJy5qqv": {Mode: 0400, Data: []byte("kept")},
- "checksum/UjZSrgz7_B7XMd9fHU7jM33UZhWlFgX0rz7JZbCBYR28bCS7jr_CAJdcDhi52ruE": {Mode: fs.ModeDir | 0500},
- "checksum/UjZSrgz7_B7XMd9fHU7jM33UZhWlFgX0rz7JZbCBYR28bCS7jr_CAJdcDhi52ruE/result": {Mode: 0444},
-
- "identifier": {Mode: fs.ModeDir | 0700},
- "identifier/KpxTUsUfGbsX6C6HU2j9cd9He3_tt2o2m2MgH4m0zial8lmoqSWY-Gc3KrS0k-UK": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/H-eSiCo227-xdqyNl2R-5G3eqXPtbb8XegAB70I5OQb2majeZXJoCxTq9wJy5qqv")},
- "identifier/xxQ43VMIS1WHMSEFnUdBNd6pulbtgiTorP_mtJpEsZENYhGBiDEL6Y2D8yqn0Sra": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/UjZSrgz7_B7XMd9fHU7jM33UZhWlFgX0rz7JZbCBYR28bCS7jr_CAJdcDhi52ruE")},
-
- "lock": {Mode: 0644},
- "variant": {Mode: 0400},
- "status": {Mode: fs.ModeDir | 0700},
-
- "substitute": {Mode: fs.ModeDir | 0700},
- "substitute/dP-6_wIDRRouOaOF-nkBy-IaUbLdYHbOUTrptu7j_qfW01mnHSjYJ0oykUmvUd2x": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/UjZSrgz7_B7XMd9fHU7jM33UZhWlFgX0rz7JZbCBYR28bCS7jr_CAJdcDhi52ruE")},
- "substitute/td1tf1kb3z8iUFg2k1xlHeTTEz3xR4e77WSWdv2JhjmZyY6iuvodhdT8BblDOi0E": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/UjZSrgz7_B7XMd9fHU7jM33UZhWlFgX0rz7JZbCBYR28bCS7jr_CAJdcDhi52ruE")},
-
- "fault": {Mode: fs.ModeDir | 0700},
- "work": {Mode: fs.ModeDir | 0700},
- }, []unique.Handle[pkg.ID]{
- ic.Ident(pkg.NewFile("destroyed-input", []byte("destroyed"))),
- ic.Ident(&stubArtifactF{
- kind: pkg.KindExec,
- params: []byte("destroyed"),
- deps: []pkg.Artifact{
- pkg.NewFile("destroyed-input", []byte("destroyed")),
- },
- }),
- }, []unique.Handle[pkg.Checksum]{
- unique.Make(sha512.Sum384([]byte("destroyed"))),
- }},
-
- {"inputs", []pkg.Artifact{
- &stubArtifactF{
- kind: pkg.KindExec,
- params: []byte("destroyed"),
- deps: []pkg.Artifact{
- pkg.NewFile("destroyed-input", []byte("destroyed")),
- },
- cure: func(f *pkg.FContext) error {
- if w, err := f.GetStatusWriter(); err != nil {
- return err
- } else if _, err = w.Write([]byte("destroyed")); err != nil {
- return err
- }
-
- p := f.GetWorkDir()
- if err := os.MkdirAll(p.String(), 0755); err != nil {
- return err
- }
- return os.WriteFile(p.Append("result").String(), nil, 0444)
- },
- },
- }, []pkg.Artifact{
- &stubArtifactF{
- kind: pkg.KindExec,
- params: []byte("kept"),
- deps: []pkg.Artifact{
- pkg.NewFile("kept-input", []byte("kept")),
- },
- cure: func(f *pkg.FContext) error {
- if w, err := f.GetStatusWriter(); err != nil {
- return err
- } else if _, err = w.Write([]byte("kept")); err != nil {
- return err
- }
-
- p := f.GetWorkDir()
- if err := os.MkdirAll(p.String(), 0755); err != nil {
- return err
- }
- return os.WriteFile(p.Append("result").String(), []byte{0}, 0444)
- },
- },
- }, true, expectsFS{
- ".": {Mode: fs.ModeDir | 0700},
-
- "checksum": {Mode: fs.ModeDir | 0700},
- "checksum/CyDnDvF-LaeGPcSW70tPosNCoclByWkTjznUUF1DcgzlIwkN9yzz1ZFME1TlPj6W": {Mode: fs.ModeDir | 0500},
- "checksum/CyDnDvF-LaeGPcSW70tPosNCoclByWkTjznUUF1DcgzlIwkN9yzz1ZFME1TlPj6W/result": {Mode: 0444, Data: []byte("\x00")},
- "checksum/H-eSiCo227-xdqyNl2R-5G3eqXPtbb8XegAB70I5OQb2majeZXJoCxTq9wJy5qqv": {Mode: 0400, Data: []byte("kept")},
-
- "identifier": {Mode: fs.ModeDir | 0700},
- "identifier/KpxTUsUfGbsX6C6HU2j9cd9He3_tt2o2m2MgH4m0zial8lmoqSWY-Gc3KrS0k-UK": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/H-eSiCo227-xdqyNl2R-5G3eqXPtbb8XegAB70I5OQb2majeZXJoCxTq9wJy5qqv")},
- "identifier/xxQ43VMIS1WHMSEFnUdBNd6pulbtgiTorP_mtJpEsZENYhGBiDEL6Y2D8yqn0Sra": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/CyDnDvF-LaeGPcSW70tPosNCoclByWkTjznUUF1DcgzlIwkN9yzz1ZFME1TlPj6W")},
-
- "lock": {Mode: 0644},
- "variant": {Mode: 0400},
-
- "status": {Mode: fs.ModeDir | 0700},
- "status/xxQ43VMIS1WHMSEFnUdBNd6pulbtgiTorP_mtJpEsZENYhGBiDEL6Y2D8yqn0Sra": {Mode: 0400, Data: []byte(statusHeader + "kept")},
- "status/td1tf1kb3z8iUFg2k1xlHeTTEz3xR4e77WSWdv2JhjmZyY6iuvodhdT8BblDOi0E": {Mode: 0400, Data: []byte(statusHeader + "kept")},
-
- "substitute": {Mode: fs.ModeDir | 0700},
- "substitute/td1tf1kb3z8iUFg2k1xlHeTTEz3xR4e77WSWdv2JhjmZyY6iuvodhdT8BblDOi0E": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/CyDnDvF-LaeGPcSW70tPosNCoclByWkTjznUUF1DcgzlIwkN9yzz1ZFME1TlPj6W")},
-
- "fault": {Mode: fs.ModeDir | 0700},
- "work": {Mode: fs.ModeDir | 0700},
- }, []unique.Handle[pkg.ID]{
- ic.Ident(pkg.NewFile("destroyed-input", []byte("destroyed"))),
- ic.Ident(&stubArtifactF{
- kind: pkg.KindExec,
- params: []byte("destroyed"),
- deps: []pkg.Artifact{
- pkg.NewFile("destroyed-input", []byte("destroyed")),
- },
- }),
- }, []unique.Handle[pkg.Checksum]{
- unique.Make(expectsFS{
- ".": {Mode: fs.ModeDir | 0500},
- "result": {Mode: 0444},
- }.hash()),
- unique.Make(sha512.Sum384([]byte("destroyed"))),
- }},
- }
- for _, tc := range testCases {
- t.Run(tc.name, func(t *testing.T) {
- t.Parallel()
-
- base := makeBase(t)
- msg := message.New(log.New(os.Stderr, "clean: ", 0))
- msg.SwapVerbose(testing.Verbose())
- c, err := pkg.Open(t.Context(), msg, base, nil)
- if err != nil {
- t.Fatal(err)
- }
- t.Cleanup(c.Close)
-
- all := pkg.Collect(slices.Concat(tc.a, tc.keep))
- if _, _, err = c.Cure(&all); !pkg.IsCollected(err) {
- t.Fatal(err)
- }
-
- var (
- idents []unique.Handle[pkg.ID]
- checksums []unique.Handle[pkg.Checksum]
- )
- idents, checksums, err = c.Clean(false, tc.inputs, tc.keep...)
- if err != nil {
- t.Fatalf("Clean: error = %v", err)
- }
- var buf [2]pkg.Checksum
-
- slices.SortFunc(idents, func(a, b unique.Handle[pkg.ID]) int {
- buf[0], buf[1] = a.Value(), b.Value()
- return bytes.Compare(buf[0][:], buf[1][:])
- })
- slices.SortFunc(checksums, func(a, b unique.Handle[pkg.Checksum]) int {
- buf[0], buf[1] = a.Value(), b.Value()
- return bytes.Compare(buf[0][:], buf[1][:])
- })
-
- if !slices.Equal(idents, tc.wantIdents) {
- t.Errorf(
- "Clean: idents = %s, want %s",
- formatHandles(idents...), formatHandles(tc.wantIdents...),
- )
- }
- if !slices.Equal(checksums, tc.wantChecksums) {
- t.Errorf(
- "Clean: checksums = %s, want %s",
- formatHandles(checksums...), formatHandles(tc.wantChecksums...),
- )
- }
-
- want := tc.want.hash()
- var checksum pkg.Checksum
- if err = pkg.SumDir(&checksum, base); err != nil {
- t.Fatalf("SumDir: error = %v", err)
- } else if checksum != want {
- t.Error(expectsFrom(base.String()))
- }
- })
- }
-}
diff --git a/internal/pkg/compress.go b/internal/pkg/compress.go
deleted file mode 100644
index 22f990f1..00000000
--- a/internal/pkg/compress.go
+++ /dev/null
@@ -1,151 +0,0 @@
-package pkg
-
-import (
- "compress/bzip2"
- "compress/gzip"
- "fmt"
- "io"
- "os"
-
- "hakurei.app/internal/xz"
- "hakurei.app/internal/zstd"
-)
-
-const (
- // Gzip denotes a stream compressed via [gzip].
- Gzip = iota
- // Bzip2 denotes a stream compressed via [bzip2].
- Bzip2
- // Zstd denotes a stream compressed via [zstd].
- Zstd
- // XZ denotes a stream compressed via [xz].
- XZ
-)
-
-// A decompressArtifact is a [FileArtifact] decompressing a backing
-// [FileArtifact] stream.
-type decompressArtifact struct {
- // Caller-supplied backing stream.
- f Artifact
- // Compression on top of the stream.
- compress uint32
-}
-
-var _ FileArtifact = new(decompressArtifact)
-var _ CuresExempt = new(decompressArtifact)
-
-// decompressArtifactNamed embeds decompressArtifact for a [fmt.Stringer] stream.
-type decompressArtifactNamed struct {
- decompressArtifact
- // Copied from decompressArtifact.f.
- name string
-}
-
-var _ fmt.Stringer = new(decompressArtifactNamed)
-
-// NewDecompress returns a [FileArtifact] decompressing the supplied [Artifact].
-func NewDecompress(a Artifact, compress uint32) FileArtifact {
- da := decompressArtifact{a, compress}
- if s, ok := a.(fmt.Stringer); ok {
- if name := s.String(); name != "" {
- return &decompressArtifactNamed{da, name}
- }
- }
- return &da
-}
-
-// String returns the name of the underlying [Artifact] prefixed with decompress.
-func (a *decompressArtifactNamed) String() string { return "decompress-" + a.name }
-
-// Kind returns the hardcoded [Kind] constant.
-func (a *decompressArtifact) Kind() Kind { return KindDecompress }
-
-// Params writes value of compression enum.
-func (a *decompressArtifact) Params(ctx *IContext) { ctx.WriteUint32(a.compress) }
-
-func init() {
- register(KindDecompress, func(r *IRReader) Artifact {
- a := NewDecompress(r.Next(), r.ReadUint32())
- if _, ok := r.Finalise(); ok {
- panic(ErrUnexpectedChecksum)
- }
- return a
- })
-}
-
-// Inputs returns a slice containing the backing file.
-func (a *decompressArtifact) Inputs() []Artifact {
- return []Artifact{a.f}
-}
-
-// IsExclusive returns false: decompressor is fully sequential.
-func (a *decompressArtifact) IsExclusive() bool { return false }
-
-// compoundCloser is an [io.ReadCloser] with an additional [io.Closer] attached.
-type compoundCloser struct {
- io.ReadCloser
- c io.Closer
-}
-
-// Close closes [io.ReadCloser] and the additional [io.Closer]. It returns the
-// non-nil error returned by the underlying [io.ReadCloser], otherwise it
-// returns the error returned by the additional [io.Closer].
-func (c compoundCloser) Close() error {
- err := c.ReadCloser.Close()
- if _err := c.c.Close(); err == nil {
- err = _err
- }
- return err
-}
-
-// IsExecutable returns false.
-func (*decompressArtifact) IsExecutable() bool { return false }
-
-// Cure returns a decompressor [io.ReadCloser].
-func (a *decompressArtifact) Cure(r *RContext) (io.ReadCloser, error) {
- sr, err := r.Open(a.f)
- if err != nil {
- return nil, err
- }
- br := r.cache.getReaderRC(sr)
-
- var dr io.ReadCloser
- switch a.compress {
- case Gzip:
- if dr, err = gzip.NewReader(br); err != nil {
- _ = br.Close()
- return nil, err
- }
- return compoundCloser{dr, br}, nil
-
- case Bzip2:
- return struct {
- io.Reader
- io.Closer
- }{bzip2.NewReader(br), br}, nil
-
- case Zstd:
- return struct {
- io.Reader
- io.Closer
- }{zstd.NewReader(br), br}, nil
-
- case XZ:
- var _dr io.Reader
- if _dr, err = xz.NewReader(br, 0); err != nil {
- _ = br.Close()
- return nil, err
- }
- return struct {
- io.Reader
- io.Closer
- }{_dr, br}, nil
-
- default:
- return nil, os.ErrInvalid
- }
-}
-
-// CuresExempt exempts the cheap [KindDecompress] implementation often part of
-// a [FileArtifact] pipeline.
-func (*decompressArtifact) CuresExempt() {}
diff --git a/internal/pkg/compress_test.go b/internal/pkg/compress_test.go
deleted file mode 100644
index 7ce00edf..00000000
--- a/internal/pkg/compress_test.go
+++ /dev/null
@@ -1,72 +0,0 @@
-package pkg_test
-
-import (
- "bytes"
- "compress/gzip"
- "crypto/sha512"
- "io/fs"
- "net/http"
- "testing"
- "testing/fstest"
-
- "hakurei.app/check"
- "hakurei.app/internal/pkg"
-)
-
-func TestDecompress(t *testing.T) {
- t.Parallel()
-
- var buf bytes.Buffer
- gw := gzip.NewWriter(&buf)
- if _, err := gw.Write([]byte{0}); err != nil {
- t.Fatal(err)
- } else if err = gw.Close(); err != nil {
- t.Fatal(err)
- }
- testdata := buf.String()
-
- var transport http.Transport
- client := http.Client{Transport: &transport}
- transport.RegisterProtocol("file", http.NewFileTransportFS(fstest.MapFS{
- "testdata": {Data: []byte(testdata), Mode: 0400},
- }))
- testdataChecksum := func() pkg.Checksum {
- h := sha512.New384()
- h.Write([]byte(testdata))
- return (pkg.Checksum)(h.Sum(nil))
- }()
-
- gh := pkg.NewDecompress(pkg.NewHTTPGet(
- &client,
- "file:///testdata",
- testdataChecksum,
- ), pkg.Gzip)
-
- checkWithCache(t, []cacheTestCase{
- {"decompress", 0, nil, func(t *testing.T, base *check.Absolute, c *pkg.Cache) {
- cureMany(t, c, []cureStep{
- {"close", pkg.NewDecompress(pkg.NewHTTPGet(
- &client,
- "file:///testdata",
- pkg.Checksum{0xfd},
- ), pkg.Gzip), nil, nil, pkg.WNew, &pkg.ChecksumMismatchError{
- Got: testdataChecksum,
- Want: pkg.Checksum{0xfd},
- }},
-
- {"gzip", gh, ignorePathname, expectsChecksum(sha512.Sum384([]byte{0})), pkg.WNew, nil},
- })
- }, expectsFS{
- ".": {Mode: fs.ModeDir | 0700},
-
- "checksum": {Mode: fs.ModeDir | 0700},
- "checksum/" + pkg.Encode(sha512.Sum384([]byte{0})): {Mode: 0400, Data: []byte{0}},
-
- "identifier": {Mode: fs.ModeDir | 0700},
- "identifier/" + pkg.Encode(pkg.NewIR().Ident(gh).Value()): {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/vsAhtPNo4waRNOASwrQwcIPTqb3SBuJOXw2G4T1mNmVZM-wrQTRllmgXqcIIoRcX")},
-
- "substitute": {Mode: fs.ModeDir | 0700},
- "work": {Mode: fs.ModeDir | 0700},
- }},
- })
-}
diff --git a/internal/pkg/exec.go b/internal/pkg/exec.go
deleted file mode 100644
index b40ae84b..00000000
--- a/internal/pkg/exec.go
+++ /dev/null
@@ -1,808 +0,0 @@
-package pkg
-
-import (
- "bufio"
- "bytes"
- "context"
- "errors"
- "fmt"
- "io"
- "os"
- "os/exec"
- "path/filepath"
- "runtime"
- "slices"
- "strconv"
- "sync"
- "syscall"
- "time"
- "unique"
-
- "hakurei.app/check"
- "hakurei.app/container"
- "hakurei.app/container/seccomp"
- "hakurei.app/container/std"
- "hakurei.app/ext"
- "hakurei.app/fhs"
- "hakurei.app/message"
-)
-
-// AbsWork is the container pathname [TContext.GetWorkDir] is mounted on.
-var AbsWork = fhs.AbsRoot.Append("work/")
-
-const (
- // EnvJobs is the name of the environment variable holding a decimal
- // representation of the preferred job count. Its value must not affect cure
- // outcome.
- EnvJobs = "CURE_JOBS"
- // EnvLoad is the name of the environment variable holding a decimal
- // representation of the preferred loadavg target. Its value must not affect
- // cure outcome.
- EnvLoad = "CURE_LOAD"
-)
-
-// ExecPath is a slice of [Artifact] and the [check.Absolute] pathname to make
-// it available at under in the container.
-type ExecPath struct {
- // Pathname in the container mount namespace.
- P *check.Absolute
- // Artifacts to mount on the pathname, must contain at least one [Artifact].
- // If there are multiple entries or W is true, P is set up as an overlay
- // mount, and entries of A must not implement [FileArtifact].
- A []Artifact
- // Whether to make the mount point writable via the temp directory.
- W bool
-}
-
-// GetArtifactFunc is the function signature of [FContext.GetArtifact].
-type GetArtifactFunc func(Artifact) (*check.Absolute, unique.Handle[Checksum])
-
-// PromoteLayers returns artifacts with identical-by-content layers promoted to
-// the highest priority instance, as if mounted via [ExecPath].
-func PromoteLayers(
- artifacts []Artifact,
- getArtifact GetArtifactFunc,
- report func(i int, d Artifact),
-) []*check.Absolute {
- layers := make([]*check.Absolute, 0, len(artifacts))
- checksums := make(map[unique.Handle[Checksum]]struct{}, len(artifacts))
- for i := range artifacts {
- d := artifacts[len(artifacts)-1-i]
- pathname, checksum := getArtifact(d)
- if _, ok := checksums[checksum]; ok {
- report(len(artifacts)-1-i, d)
- continue
- }
- checksums[checksum] = struct{}{}
- layers = append(layers, pathname)
- }
- slices.Reverse(layers)
- return layers
-}
-
-// layers returns pathnames collected from A deduplicated via [PromoteLayers].
-func (p *ExecPath) layers(
- msg message.Msg,
- getArtifact GetArtifactFunc,
- ident func(a Artifact) unique.Handle[ID],
-) []*check.Absolute {
- return PromoteLayers(p.A, getArtifact, func(i int, d Artifact) {
- if msg.IsVerbose() {
- msg.Verbosef("promoted layer %d as %s", i, reportName(d, ident(d)))
- }
- })
-}
-
-// Path returns a populated [ExecPath].
-func Path(pathname *check.Absolute, writable bool, a ...Artifact) ExecPath {
- return ExecPath{pathname, a, writable}
-}
-
-// MustPath is like [Path], but takes a string pathname via [check.MustAbs].
-func MustPath(pathname string, writable bool, a ...Artifact) ExecPath {
- return ExecPath{check.MustAbs(pathname), a, writable}
-}
-
-var (
- binfmt map[string]container.BinfmtEntry
- binfmtMu sync.RWMutex
-)
-
-// RegisterArch arranges for [KindExec] and [KindExecNet] to support a new
-// architecture via a binfmt_misc entry. Each architecture must be registered
-// at most once.
-func RegisterArch(arch string, e container.BinfmtEntry) {
- if arch == "" {
- panic(UnsupportedArchError(arch))
- }
-
- binfmtMu.Lock()
- defer binfmtMu.Unlock()
-
- if binfmt == nil {
- binfmt = make(map[string]container.BinfmtEntry)
- }
-
- if _, ok := binfmt[arch]; ok {
- panic("attempting to register " + strconv.Quote(arch) + " twice")
- }
- binfmt[arch] = e
-}
-
-const (
- // ExecTimeoutDefault replaces out of range [NewExec] timeout values.
- ExecTimeoutDefault = 15 * time.Minute
- // ExecTimeoutMax is the arbitrary upper bound of [NewExec] timeout.
- ExecTimeoutMax = 48 * time.Hour
-)
-
-// An execArtifact is an [Artifact] that produces output by running a program
-// part of another [Artifact] in a [container] to produce its output.
-//
-// Methods of execArtifact does not modify any struct field or underlying arrays
-// referred to by slices.
-type execArtifact struct {
- // Caller-supplied user-facing reporting name, guaranteed to be nonzero
- // during initialisation.
- name string
- // Target architecture.
- arch string
- // Caller-supplied inner mount points.
- paths []ExecPath
-
- // Passed through to [container.Params].
- dir *check.Absolute
- // Passed through to [container.Params].
- env []string
- // Passed through to [container.Params].
- path *check.Absolute
- // Passed through to [container.Params].
- args []string
-
- // Duration the initial process is allowed to run. The zero value is
- // equivalent to [ExecTimeoutDefault].
- timeout time.Duration
-
- // Caller-supplied exclusivity value, returned as is by IsExclusive.
- exclusive bool
-}
-
-var _ fmt.Stringer = new(execArtifact)
-
-// execMeasuredArtifact is like execArtifact but implements [KnownChecksum] and
-// has its resulting container optionally keep the host net namespace.
-type execMeasuredArtifact struct {
- checksum Checksum
-
- // Whether to keep host net namespace.
- hostNet bool
-
- execArtifact
-}
-
-var _ KnownChecksum = new(execMeasuredArtifact)
-
-// Checksum returns the caller-supplied checksum.
-func (a *execMeasuredArtifact) Checksum() Checksum { return a.checksum }
-
-// Kind returns [KindExecNet], or [KindExec] if hostNet is false.
-func (a *execMeasuredArtifact) Kind() Kind {
- if a == nil || a.hostNet {
- return KindExecNet
- }
- return KindExec
-}
-
-// Cure cures the [Artifact] in the container described by the caller. The
-// container optionally retains host networking.
-func (a *execMeasuredArtifact) Cure(f *FContext) error {
- return a.cure(f, a.hostNet)
-}
-
-// ErrNetChecksum is panicked by [NewExec] if host net namespace is requested
-// with a nil checksum.
-var ErrNetChecksum = errors.New("attempting to keep net namespace without checksum")
-
-// NewExec returns a new [Artifact] that executes the program path in a
-// container with specified paths bind mounted read-only in order. A private
-// instance of /proc and /dev is made available to the container.
-//
-// The working and temporary directories are both created and mounted writable
-// on [AbsWork] and [fhs.AbsTmp] respectively. If one or more paths target
-// [AbsWork], the final entry is set up as a writable overlay mount on /work for
-// which the upperdir is the host side work directory. In this configuration,
-// the W field is ignored, and the program must avoid causing whiteout files to
-// be created. Cure fails if upperdir ends up with entries other than directory,
-// regular or symlink.
-//
-// If checksum is non-nil, the resulting [Artifact] implements [KnownChecksum]
-// and its container optionally runs in the host net namespace.
-//
-// The container is allowed to run for the specified duration before the initial
-// process and all processes originating from it is terminated. A zero or
-// negative timeout value is equivalent tp [ExecTimeoutDefault], a timeout value
-// greater than [ExecTimeoutMax] is equivalent to [ExecTimeoutMax].
-//
-// The user-facing name and exclusivity value are not accessible from the
-// container and does not affect curing outcome. Because of this, it is omitted
-// from parameter data for computing identifier.
-func NewExec(
- name, arch string,
- checksum *Checksum,
- timeout time.Duration,
- hostNet, exclusive bool,
-
- dir *check.Absolute,
- env []string,
- pathname *check.Absolute,
- args []string,
-
- paths ...ExecPath,
-) Artifact {
- if name == "" {
- name = "exec-" + filepath.Base(pathname.String())
- }
- if arch == "" {
- arch = runtime.GOARCH
- }
- if timeout <= 0 {
- timeout = ExecTimeoutDefault
- }
- if timeout > ExecTimeoutMax {
- timeout = ExecTimeoutMax
- }
- a := execArtifact{name, arch, paths, dir, env, pathname, args, timeout, exclusive}
- if checksum == nil {
- if hostNet {
- panic(ErrNetChecksum)
- }
- return &a
- }
- return &execMeasuredArtifact{*checksum, hostNet, a}
-}
-
-// Kind returns the hardcoded [Kind] constant.
-func (*execArtifact) Kind() Kind { return KindExec }
-
-// Params writes paths, executable pathname and args.
-func (a *execArtifact) Params(ctx *IContext) {
- ctx.WriteString(a.arch)
- ctx.WriteString(a.name)
-
- ctx.WriteUint32(uint32(len(a.paths)))
- for _, p := range a.paths {
- if p.P != nil {
- ctx.WriteString(p.P.String())
- } else {
- ctx.WriteString("invalid P\x00")
- }
-
- ctx.WriteUint32(uint32(len(p.A)))
- for _, d := range p.A {
- ctx.WriteIdent(d)
- }
-
- if p.W {
- ctx.WriteUint32(1)
- } else {
- ctx.WriteUint32(0)
- }
- }
-
- ctx.WriteString(a.dir.String())
-
- ctx.WriteUint32(uint32(len(a.env)))
- for _, e := range a.env {
- ctx.WriteString(e)
- }
-
- ctx.WriteString(a.path.String())
-
- ctx.WriteUint32(uint32(len(a.args)))
- for _, arg := range a.args {
- ctx.WriteString(arg)
- }
-
- ctx.WriteUint32(uint32(a.timeout & 0xffffffff))
- ctx.WriteUint32(uint32(a.timeout >> 32))
-
- if a.exclusive {
- ctx.WriteUint32(1)
- } else {
- ctx.WriteUint32(0)
- }
-}
-
-// UnsupportedArchError describes an unsupported or invalid architecture.
-type UnsupportedArchError string
-
-func (e UnsupportedArchError) Error() string {
- if e == "" {
- return "invalid architecture name"
- }
- return "unsupported architecture " + string(e)
-}
-
-// readExecArtifact interprets IR values and returns the address of execArtifact
-// or execNetArtifact.
-func readExecArtifact(r *IRReader, net bool) Artifact {
- r.DiscardAll()
-
- arch := r.ReadString()
- if arch == "" {
- panic(UnsupportedArchError(arch))
- }
-
- name := r.ReadString()
-
- sz := r.ReadUint32()
- if sz > irMaxDeps {
- panic(ErrIRDepend)
- }
- paths := make([]ExecPath, sz)
- for i := range paths {
- paths[i].P = check.MustAbs(r.ReadString())
-
- sz = r.ReadUint32()
- if sz > irMaxDeps {
- panic(ErrIRDepend)
- }
- paths[i].A = make([]Artifact, sz)
- for j := range paths[i].A {
- paths[i].A[j] = r.ReadIdent()
- }
-
- paths[i].W = r.ReadUint32() != 0
- }
-
- dir := check.MustAbs(r.ReadString())
-
- sz = r.ReadUint32()
- if sz > irMaxValues {
- panic(ErrIRValues)
- }
- env := make([]string, sz)
- for i := range env {
- env[i] = r.ReadString()
- }
-
- pathname := check.MustAbs(r.ReadString())
-
- sz = r.ReadUint32()
- if sz > irMaxValues {
- panic(ErrIRValues)
- }
- args := make([]string, sz)
- for i := range args {
- args[i] = r.ReadString()
- }
-
- timeout := time.Duration(r.ReadUint32())
- timeout |= time.Duration(r.ReadUint32()) << 32
-
- exclusive := r.ReadUint32() != 0
-
- checksum, ok := r.Finalise()
- var checksumP *Checksum
- if ok {
- checksumP = new(checksum.Value())
- }
-
- if net && !ok {
- panic(ErrExpectedChecksum)
- }
-
- return NewExec(
- name, arch, checksumP, timeout, net, exclusive, dir, env, pathname, args, paths...,
- )
-}
-
-func init() {
- register(KindExec,
- func(r *IRReader) Artifact { return readExecArtifact(r, false) })
- register(KindExecNet,
- func(r *IRReader) Artifact { return readExecArtifact(r, true) })
-}
-
-// Inputs returns a slice of all artifacts collected from caller-supplied
-// [ExecPath].
-func (a *execArtifact) Inputs() []Artifact {
- artifacts := make([][]Artifact, 0, len(a.paths))
- for _, p := range a.paths {
- artifacts = append(artifacts, p.A)
- }
- return slices.Concat(artifacts...)
-}
-
-// IsExclusive returns the caller-supplied exclusivity value.
-func (a *execArtifact) IsExclusive() bool { return a.exclusive }
-
-// String returns the caller-supplied reporting name.
-func (a *execArtifact) String() string { return a.name }
-
-// Cure cures the [Artifact] in the container described by the caller.
-func (a *execArtifact) Cure(f *FContext) (err error) {
- return a.cure(f, false)
-}
-
-const (
- // execWaitDelay is passed through to [container.Params].
- execWaitDelay = time.Nanosecond
-)
-
-// scanLinesCR is like [bufio.ScanLines], but also treats a bare \r as an
-// end-of-line marker.
-func scanLinesCR(data []byte, atEOF bool) (advance int, token []byte, err error) {
- if atEOF && len(data) == 0 {
- return 0, nil, nil
- }
- ri, ni := bytes.IndexByte(data, '\r'), bytes.IndexByte(data, '\n')
-
- if ri >= 0 && (ni < 0 || ri < ni) {
- if ri+1 == ni {
- // We have a full \r\n-terminated line.
- return ri + 2, data[:ri], nil
- }
- // We have a bare \r, probably some kind of progress indicator.
- return ri + 1, data[:ri], nil
- }
- if ni >= 0 && (ri < 0 || ni < ri) {
- // We have a full newline-terminated line.
- return ni + 1, data[:ni], nil
- }
- // If we're at EOF, we have a final, non-terminated line. Return it.
- if atEOF {
- return len(data), data, nil
- }
- // Request more data.
- return 0, nil, nil
-}
-
-// scanVerbose prefixes program output for a verbose [message.Msg].
-func scanVerbose(
- msg message.Msg,
- cancel context.CancelFunc,
- done chan<- struct{},
- prefix, suffix string,
- r io.Reader,
-) {
- defer close(done)
- s := bufio.NewScanner(r)
- s.Split(scanLinesCR)
- s.Buffer(
- make([]byte, bufio.MaxScanTokenSize),
- bufio.MaxScanTokenSize<<12,
- )
- for s.Scan() {
- msg.Verbose(prefix, s.Text()+suffix)
- }
- if err := s.Err(); err != nil && !errors.Is(err, os.ErrClosed) {
- cancel()
- msg.Verbose("*"+prefix, err.Error()+suffix)
- }
-}
-
-var (
- // ErrInvalidPaths is returned for an [Artifact] of [KindExec] or
- // [KindExecNet] specified with invalid paths.
- ErrInvalidPaths = errors.New("invalid mount point")
-)
-
-// SeccompPresets is the [seccomp] presets used by exec artifacts.
-const SeccompPresets = std.PresetStrict &
- ^(std.PresetDenyNS | std.PresetDenyDevel)
-
-// makeContainer sets up the specified temp and work directories and returns the
-// corresponding [container.Container] that would have run for cure.
-func (a *execArtifact) makeContainer(
- ctx context.Context,
- msg message.Msg,
- flags, jobs, load int,
- hostNet bool,
- temp, work *check.Absolute,
- getArtifact GetArtifactFunc,
- ident func(a Artifact) unique.Handle[ID],
-) (z *container.Container, err error) {
- overlayWorkIndex := -1
- for i, p := range a.paths {
- if p.P == nil || len(p.A) == 0 {
- return nil, ErrInvalidPaths
- }
- if p.P.Is(AbsWork) {
- overlayWorkIndex = i
- }
- }
-
- var artifactCount int
- for _, p := range a.paths {
- artifactCount += len(p.A)
- }
-
- z = container.New(ctx, msg)
- z.WaitDelay = execWaitDelay
- z.SeccompPresets = SeccompPresets
- z.SeccompFlags |= seccomp.AllowMultiarch
- z.ParentPerm = 0700
- z.HostNet = hostNet
- z.HostAbstract = flags&CHostAbstract != 0
- z.Hostname = "cure"
- z.SetScheduler = flags&CSchedIdle != 0
- z.SchedPolicy = ext.SCHED_IDLE
- if z.HostNet {
- z.Hostname = "cure-net"
- }
- z.Quiet = flags&CSuppressInit != 0
- z.Uid, z.Gid = (1<<10)-1, (1<<10)-1
- z.Dir, z.Path, z.Args = a.dir, a.path, a.args
- z.Env = slices.Concat(a.env, []string{
- EnvJobs + "=" + strconv.Itoa(jobs),
- EnvLoad + "=" + strconv.Itoa(load),
- })
- z.Grow(len(a.paths) + 4)
-
- if a.arch != runtime.GOARCH {
- binfmtMu.RLock()
- e, ok := binfmt[a.arch]
- binfmtMu.RUnlock()
- if !ok {
- return nil, UnsupportedArchError(a.arch)
- }
- z.Binfmt = []container.BinfmtEntry{e}
- z.InitAsRoot = true
- }
-
- for i, b := range a.paths {
- if i == overlayWorkIndex {
- if err = os.MkdirAll(work.String(), 0700); err != nil {
- return
- }
- tempWork := temp.Append(".work")
- if err = os.MkdirAll(tempWork.String(), 0700); err != nil {
- return
- }
- z.Overlay(
- AbsWork,
- work,
- tempWork,
- b.layers(msg, getArtifact, ident)...,
- )
- continue
- }
-
- if a.paths[i].W {
- tempUpper, tempWork := temp.Append(
- ".upper", strconv.Itoa(i),
- ), temp.Append(
- ".work", strconv.Itoa(i),
- )
- if err = os.MkdirAll(tempUpper.String(), 0700); err != nil {
- return
- }
- if err = os.MkdirAll(tempWork.String(), 0700); err != nil {
- return
- }
- z.Overlay(b.P, tempUpper, tempWork, b.layers(msg, getArtifact, ident)...)
- } else if len(b.A) == 1 {
- pathname, _ := getArtifact(b.A[0])
- z.Bind(pathname, b.P, 0)
- } else {
- z.OverlayReadonly(b.P, b.layers(msg, getArtifact, ident)...)
- }
- }
- if overlayWorkIndex < 0 {
- z.Bind(
- work,
- AbsWork,
- std.BindWritable|std.BindEnsure,
- )
- }
- z.Bind(
- temp,
- fhs.AbsTmp,
- std.BindWritable|std.BindEnsure,
- )
- z.Proc(fhs.AbsProc).Dev(fhs.AbsDev, true)
- return
-}
-
-var (
- // ErrExecBusy is returned entering [Cache.EnterExec] while another
- // goroutine has not yet returned from it.
- ErrExecBusy = errors.New("scratch directories in use")
- // ErrNotExec is returned for unsupported implementations of [Artifact]
- // passed to [Cache.EnterExec].
- ErrNotExec = errors.New("attempting to run a non-exec artifact")
-)
-
-// EnterExec runs the container of an [Artifact] of [KindExec] or [KindExecNet]
-// with its entry point, argument, and standard streams replaced with values
-// supplied by the caller.
-func (c *Cache) EnterExec(
- ctx context.Context,
- a Artifact,
- hostname string,
- retainSession bool,
- stdin io.Reader,
- stdout, stderr io.Writer,
- path *check.Absolute,
- args ...string,
-) (err error) {
- if !c.inExec.CompareAndSwap(false, true) {
- return ErrExecBusy
- }
- defer c.inExec.Store(false)
-
- var hostNet bool
- var e *execArtifact
- switch f := a.(type) {
- case *execArtifact:
- e = f
-
- case *execMeasuredArtifact:
- e = &f.execArtifact
- hostNet = f.hostNet
-
- default:
- return ErrNotExec
- }
-
- deps := Collect(a.Inputs())
- if _, _, err = c.Cure(&deps); err == nil {
- return errors.New("unreachable")
- } else if !IsCollected(err) {
- return
- }
-
- dm := make(map[Artifact]cureRes)
- for i, p := range deps {
- var res cureRes
- res.pathname, res.checksum, err = c.Cure(p)
- if err != nil {
- return
- }
- dm[deps[i]] = res
- }
-
- scratch := c.base.Append(dirExecScratch)
- temp, work := scratch.Append("temp"), scratch.Append("work")
- // work created during makeContainer
- if err = os.MkdirAll(temp.String(), 0700); err != nil {
- return
- }
- defer func() {
- if chmodErr, removeErr := removeAll(scratch); chmodErr != nil || removeErr != nil {
- err = errors.Join(err, chmodErr, removeErr)
- }
- }()
-
- var z *container.Container
- z, err = e.makeContainer(
- ctx, c.msg,
- c.attr.Flags,
- c.attr.Jobs,
- c.attr.Load,
- hostNet,
- temp, work,
- func(a Artifact) (*check.Absolute, unique.Handle[Checksum]) {
- if res, ok := dm[a]; ok {
- return res.pathname, res.checksum
- }
- panic(InvalidLookupError(c.Ident(a).Value()))
- },
- c.Ident,
- )
- if err != nil {
- return
- }
- z.Stdin, z.Stdout, z.Stderr = stdin, stdout, stderr
- z.Path, z.Args = path, args
- z.RetainSession = retainSession
- if stdin == os.Stdin {
- if s, ok := os.LookupEnv("TERM"); ok {
- z.Env = append(z.Env, "TERM="+s)
- }
- }
- if hostname != "" {
- z.Hostname = hostname
- }
-
- if err = z.Start(); err != nil {
- return
- }
- if err = z.Serve(); err != nil {
- return
- }
- return z.Wait()
-}
-
-// cure is like Cure but allows optional host net namespace.
-func (a *execArtifact) cure(f *FContext, hostNet bool) (err error) {
- ctx, cancel := context.WithTimeout(f.Unwrap(), a.timeout)
- defer cancel()
-
- msg := f.GetMessage()
- var z *container.Container
- if z, err = a.makeContainer(
- ctx, msg, f.cache.attr.Flags, f.GetJobs(), f.GetLoad(), hostNet,
- f.GetTempDir(), f.GetWorkDir(),
- f.GetArtifact,
- f.cache.Ident,
- ); err != nil {
- return
- }
-
- var status io.Writer
- if status, err = f.GetStatusWriter(); err != nil {
- return
- }
-
- if msg.IsVerbose() {
- var stdout, stderr io.ReadCloser
- if stdout, err = z.StdoutPipe(); err != nil {
- return
- }
- if stderr, err = z.StderrPipe(); err != nil {
- _ = stdout.Close()
- return
- }
-
- brStdout, brStderr := f.cache.getReader(stdout), f.cache.getReader(stderr)
- stdoutDone, stderrDone := make(chan struct{}), make(chan struct{})
-
- var suffix, prefixO, prefixE string
- if f.cache.attr.Flags&CColourOutput != 0 {
- suffix = "\x1b[0m"
- prefixO = "\x1b[1;37m(" + a.name + ")\x1b[0m"
- prefixE = "\x1b[1;97m(" + a.name + ")\x1b[0m"
- } else {
- prefixO = "(" + a.name + ":1)"
- prefixE = "(" + a.name + ":2)"
- }
-
- go scanVerbose(
- msg, cancel, stdoutDone,
- prefixO, suffix,
- io.TeeReader(brStdout, status),
- )
- go scanVerbose(
- msg, cancel, stderrDone,
- prefixE, suffix,
- io.TeeReader(brStderr, status),
- )
- defer func() {
- if err != nil && !errors.As(err, new(*exec.ExitError)) {
- _ = stdout.Close()
- _ = stderr.Close()
- }
-
- <-stdoutDone
- <-stderrDone
- f.cache.putReader(brStdout)
- f.cache.putReader(brStderr)
- }()
- } else {
- z.Stdout, z.Stderr = status, status
- }
-
- if err = z.Start(); err != nil {
- return
- }
- if err = z.Serve(); err != nil {
- return
- }
- if err = z.Wait(); err != nil {
- return
- }
-
- // do not allow empty directories to succeed
- for {
- err = syscall.Rmdir(f.GetWorkDir().String())
- if err != syscall.EINTR {
- break
- }
- }
- if err != nil && errors.Is(err, syscall.ENOTEMPTY) {
- err = nil
- }
- return
-}
diff --git a/internal/pkg/exec_test.go b/internal/pkg/exec_test.go
deleted file mode 100644
index 408d6257..00000000
--- a/internal/pkg/exec_test.go
+++ /dev/null
@@ -1,670 +0,0 @@
-package pkg_test
-
-import (
- "bufio"
- "bytes"
- _ "embed"
- "encoding/gob"
- "errors"
- "io/fs"
- "net"
- "os"
- "os/exec"
- "path/filepath"
- "slices"
- "strings"
- "testing"
- _ "unsafe" // for go:linkname
-
- "hakurei.app/check"
- "hakurei.app/container"
- "hakurei.app/hst"
- "hakurei.app/internal/info"
- "hakurei.app/internal/pkg"
- "hakurei.app/internal/stub"
-
- "hakurei.app/internal/pkg/internal/testtool/expected"
-)
-
-// testtoolBin is the container test tool binary made available to the
-// execArtifact for testing its curing environment.
-//
-//go:generate env CGO_ENABLED=0 go build -tags testtool -o internal/testtool ./internal/testtool
-//go:embed internal/testtool/testtool
-var testtoolBin []byte
-
-func init() {
- pathname, err := filepath.Abs("internal/testtool/testtool")
- if err != nil {
- panic(err)
- }
- pkg.RegisterArch("cafe", container.BinfmtEntry{
- Magic: expected.Magic,
- Interpreter: check.MustAbs(pathname),
- })
-}
-
-// scanLinesCR is like [bufio.ScanLines], but also treats a bare \r as an
-// end-of-line marker.
-//
-//go:linkname scanLinesCR hakurei.app/internal/pkg.scanLinesCR
-func scanLinesCR(data []byte, atEOF bool) (advance int, token []byte, err error)
-
-func TestScan(t *testing.T) {
- t.Parallel()
-
- testCases := []struct {
- name string
- data string
- want []string
- }{
- {"progress indicator", "Updating files: 76% (8655/11256)\r" +
- "Updating files: 77% (8668/11256)\r" +
- "Updating files: 78% (8780/11256)\r" +
- "Updating files: 79% (8893/11256)\r" +
- "Updating files: 80% (9005/11256)\r" +
- "Updating files: 81% (9118/11256)\r" +
- "Updating files: 82% (9230/11256)\r" +
- "Updating files: 83% (9343/11256)\r" +
- "Updating files: 84% (9456/11256)\r" +
- "Updating files: 85% (9568/11256)\r" +
- "Updating files: 86% (9681/11256)\r" +
- "Updating files: 87% (9793/11256)\r" +
- "Updating files: 88% (9906/11256)\r" +
- "Updating files: 89% (10018/11256)\r" +
- "Updating files: 90% (10131/11256)\r" +
- "Updating files: 91% (10243/11256)\r" +
- "Updating files: 92% (10356/11256)\r" +
- "Updating files: 93% (10469/11256)\r" +
- "Updating files: 94% (10581/11256)\r" +
- "Updating files: 95% (10694/11256)\r" +
- "Updating files: 96% (10806/11256)\r" +
- "Updating files: 97% (10919/11256)\r" +
- "Updating files: 98% (11031/11256)\r" +
- "Updating files: 99% (11144/11256)\r" +
- "Updating files: 100% (11256/11256)\r" +
- "Updating files: 100% (11256/11256), done.\n", []string{
- "Updating files: 76% (8655/11256)",
- "Updating files: 77% (8668/11256)",
- "Updating files: 78% (8780/11256)",
- "Updating files: 79% (8893/11256)",
- "Updating files: 80% (9005/11256)",
- "Updating files: 81% (9118/11256)",
- "Updating files: 82% (9230/11256)",
- "Updating files: 83% (9343/11256)",
- "Updating files: 84% (9456/11256)",
- "Updating files: 85% (9568/11256)",
- "Updating files: 86% (9681/11256)",
- "Updating files: 87% (9793/11256)",
- "Updating files: 88% (9906/11256)",
- "Updating files: 89% (10018/11256)",
- "Updating files: 90% (10131/11256)",
- "Updating files: 91% (10243/11256)",
- "Updating files: 92% (10356/11256)",
- "Updating files: 93% (10469/11256)",
- "Updating files: 94% (10581/11256)",
- "Updating files: 95% (10694/11256)",
- "Updating files: 96% (10806/11256)",
- "Updating files: 97% (10919/11256)",
- "Updating files: 98% (11031/11256)",
- "Updating files: 99% (11144/11256)",
- "Updating files: 100% (11256/11256)",
- "Updating files: 100% (11256/11256), done.",
- }},
-
- {"crlf", "0\r1\n2\n3\r\n4\n5\r6\r\n7\n", []string{
- "0", "1", "2", "3", "4", "5", "6", "7",
- }},
- }
- for _, tc := range testCases {
- t.Run(tc.name, func(t *testing.T) {
- s := bufio.NewScanner(strings.NewReader(tc.data))
- s.Split(scanLinesCR)
- got := make([]string, 0, len(tc.want))
- for s.Scan() {
- got = append(got, s.Text())
- }
- if err := s.Err(); err != nil {
- t.Fatal(err)
- }
- if !slices.Equal(got, tc.want) {
- t.Fatalf("Scan: %q, want %q", got, tc.want)
- }
- })
- }
-}
-
-func TestExec(t *testing.T) {
- t.Parallel()
-
- wantOffline := expectsFS{
- ".": {Mode: fs.ModeDir | 0500},
-
- "check": {Mode: 0400, Data: []byte{0}},
- }
- wantOfflineEncode := pkg.Encode(wantOffline.hash())
- failingArtifact := &stubArtifact{
- kind: pkg.KindTar,
- params: []byte("doomed artifact"),
- cure: func(t *pkg.TContext) error {
- return stub.UniqueError(0xcafe)
- },
- }
-
- checkWithCache(t, []cacheTestCase{
- {"offline", pkg.CValidateKnown | checkDestroySubstitutes, nil, func(t *testing.T, base *check.Absolute, c *pkg.Cache) {
- testtool, testtoolDestroy := newTesttool()
-
- cureMany(t, c, []cureStep{
- {"container", pkg.NewExec(
- "exec-offline", "", new(wantOffline.hash()), 0, false, false,
- pkg.AbsWork,
- []string{"HAKUREI_TEST=1"},
- check.MustAbs("/opt/bin/testtool"),
- []string{"testtool"},
-
- pkg.MustPath("/file", false, newStubFile(
- pkg.KindHTTPGet,
- pkg.ID{0xfe, 0},
- nil,
- nil, nil,
- )),
- pkg.MustPath("/.hakurei", false, &stubArtifact{
- kind: pkg.KindTar,
- params: []byte("empty directory"),
- cure: func(t *pkg.TContext) error {
- return os.MkdirAll(t.GetWorkDir().String(), 0700)
- },
- }),
- pkg.MustPath("/opt", false, testtool),
- ), ignorePathname, wantOffline, pkg.WNew, nil},
-
- {"substitution", pkg.NewExec(
- "exec-offline", "", new(wantOffline.hash()), 0, false, false,
- pkg.AbsWork,
- []string{"HAKUREI_TEST=1"},
- check.MustAbs("/opt/bin/testtool"),
- []string{"testtool"},
-
- pkg.MustPath("/file", false, newStubFile(
- pkg.KindHTTPGet,
- pkg.ID{0xfe, 0},
- nil,
- nil, nil,
- )),
- // substitution miss fails in testtool due to differing idents
- pkg.MustPath("/.hakurei", false, &stubArtifact{
- kind: pkg.KindTar,
- params: []byte("empty directory (substituted)"),
- cure: func(t *pkg.TContext) error {
- return os.MkdirAll(t.GetWorkDir().String(), 0700)
- },
- }),
- pkg.MustPath("/opt", false, testtool),
- ), ignorePathname, wantOffline, pkg.WSubstitute, nil},
-
- {"error passthrough", pkg.NewExec(
- "", "", nil, 0, false, true,
- pkg.AbsWork,
- []string{"HAKUREI_TEST=1"},
- check.MustAbs("/opt/bin/testtool"),
- []string{"testtool"},
-
- pkg.MustPath("/proc/nonexistent", false, failingArtifact),
- ), nil, nil, pkg.WNew, pkg.InputError{
- failingArtifact: stub.UniqueError(0xcafe),
- }},
-
- {"invalid paths", pkg.NewExec(
- "", "", nil, 0, false, false,
- pkg.AbsWork,
- []string{"HAKUREI_TEST=1"},
- check.MustAbs("/opt/bin/testtool"),
- []string{"testtool"},
-
- pkg.ExecPath{},
- ), nil, nil, pkg.WNew, pkg.ErrInvalidPaths},
- })
-
- // check init failure passthrough
- initFailureArtifact := pkg.NewExec(
- "", "", nil, 0, false, false,
- pkg.AbsWork,
- nil,
- check.MustAbs("/opt/bin/testtool"),
- []string{"testtool"},
- )
- var exitError *exec.ExitError
- if _, _, err := c.Cure(initFailureArtifact); !errors.As(err, &exitError) ||
- exitError.ExitCode() != hst.ExitFailure {
- t.Fatalf("Cure: error = %v, want init exit status 1", err)
- }
-
- var faultStatus []byte
- if faults, err := c.ReadFaults(initFailureArtifact); err != nil {
- t.Fatal(err)
- } else if len(faults) != 1 {
- t.Fatalf("ReadFaults: %v", faults)
- } else if faultStatus, err = os.ReadFile(faults[0].String()); err != nil {
- t.Fatal(err)
- } else if err = faults[0].Destroy(); err != nil {
- t.Fatal(err)
- } else {
- t.Logf("destroyed expected fault at %s", faults[0].Time().UTC())
- }
-
- if !bytes.HasPrefix(faultStatus, []byte(
- "internal/pkg ",
- )) || !bytes.Contains(faultStatus, []byte(
- "\ninit: fork/exec /opt/bin/testtool: no such file or directory\n",
- )) {
- t.Errorf("unexpected status:\n%s", string(faultStatus))
- }
-
- destroyStatus(t, base, 2, 1)
- testtoolDestroy(t, base, c)
- }, expectsFS{
- ".": {Mode: fs.ModeDir | 0700},
-
- "checksum": {Mode: fs.ModeDir | 0700},
- "checksum/" + wantOfflineEncode: {Mode: fs.ModeDir | 0500},
- "checksum/" + wantOfflineEncode + "/check": {Mode: 0400, Data: []byte{0}},
- "checksum/MGWmEfjut2QE2xPJwTsmUzpff4BN_FEnQ7T0j7gvUCCiugJQNwqt9m151fm9D1yU": {Mode: fs.ModeDir | 0500},
- "checksum/OLBgp1GsljhM2TJ-sbHjaiH9txEUvgdDTAzHv2P24donTt6_529l-9Ua0vFImLlb": {Mode: 0400, Data: []byte{}},
-
- "identifier": {Mode: fs.ModeDir | 0700},
- "identifier/MEaM1v6MLRQ60JQOOKbfDzfJOdC3L8i30IgOpYbQdX68enwF0FN-P36_M4RX_0Vd": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/MGWmEfjut2QE2xPJwTsmUzpff4BN_FEnQ7T0j7gvUCCiugJQNwqt9m151fm9D1yU")},
- "identifier/_gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/OLBgp1GsljhM2TJ-sbHjaiH9txEUvgdDTAzHv2P24donTt6_529l-9Ua0vFImLlb")},
- "identifier/" + expected.Offline: {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/" + wantOfflineEncode)},
- "identifier/" + expected.OfflineS: {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/" + wantOfflineEncode)},
- "identifier/_OHzj_xdmfpaWfFN-_D9JpGpPlIjh84873E3Ui9xwv9PPPIt0BlzvH-cnPNeRsTl": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/MGWmEfjut2QE2xPJwTsmUzpff4BN_FEnQ7T0j7gvUCCiugJQNwqt9m151fm9D1yU")},
-
- "substitute": {Mode: fs.ModeDir | 0700},
-
- "temp": {Mode: fs.ModeDir | 0700},
- "work": {Mode: fs.ModeDir | 0700},
- }},
-
- {"net", pkg.CValidateKnown | checkDestroySubstitutes, nil, func(t *testing.T, base *check.Absolute, c *pkg.Cache) {
- testtool, testtoolDestroy := newTesttool()
-
- wantNet := expectsFS{
- ".": {Mode: fs.ModeDir | 0500},
-
- "check": {Mode: 0400, Data: []byte("net")},
- }
- cureMany(t, c, []cureStep{
- {"container", pkg.NewExec(
- "exec-net", "", new(wantNet.hash()), 0, true, false,
- pkg.AbsWork,
- []string{"HAKUREI_TEST=1"},
- check.MustAbs("/opt/bin/testtool"),
- []string{"testtool", "net"},
-
- pkg.MustPath("/file", false, newStubFile(
- pkg.KindHTTPGet,
- pkg.ID{0xfe, 0},
- nil,
- nil, nil,
- )),
- pkg.MustPath("/.hakurei", false, &stubArtifact{
- kind: pkg.KindTar,
- params: []byte("empty directory"),
- cure: func(t *pkg.TContext) error {
- return os.MkdirAll(t.GetWorkDir().String(), 0700)
- },
- }),
- pkg.MustPath("/opt", false, testtool),
- ), ignorePathname, wantNet, pkg.WNew, nil},
- })
-
- destroyStatus(t, base, 2, 0)
- testtoolDestroy(t, base, c)
- }, expectsFS{
- ".": {Mode: fs.ModeDir | 0700},
-
- "checksum": {Mode: fs.ModeDir | 0700},
- "checksum/MGWmEfjut2QE2xPJwTsmUzpff4BN_FEnQ7T0j7gvUCCiugJQNwqt9m151fm9D1yU": {Mode: fs.ModeDir | 0500},
- "checksum/OLBgp1GsljhM2TJ-sbHjaiH9txEUvgdDTAzHv2P24donTt6_529l-9Ua0vFImLlb": {Mode: 0400, Data: []byte{}},
- "checksum/a1F_i9PVQI4qMcoHgTQkORuyWLkC1GLIxOhDt2JpU1NGAxWc5VJzdlfRK-PYBh3W": {Mode: fs.ModeDir | 0500},
- "checksum/a1F_i9PVQI4qMcoHgTQkORuyWLkC1GLIxOhDt2JpU1NGAxWc5VJzdlfRK-PYBh3W/check": {Mode: 0400, Data: []byte("net")},
-
- "identifier": {Mode: fs.ModeDir | 0700},
- "identifier/" + expected.Net: {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/a1F_i9PVQI4qMcoHgTQkORuyWLkC1GLIxOhDt2JpU1NGAxWc5VJzdlfRK-PYBh3W")},
- "identifier/_gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/OLBgp1GsljhM2TJ-sbHjaiH9txEUvgdDTAzHv2P24donTt6_529l-9Ua0vFImLlb")},
- "identifier/MEaM1v6MLRQ60JQOOKbfDzfJOdC3L8i30IgOpYbQdX68enwF0FN-P36_M4RX_0Vd": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/MGWmEfjut2QE2xPJwTsmUzpff4BN_FEnQ7T0j7gvUCCiugJQNwqt9m151fm9D1yU")},
-
- "substitute": {Mode: fs.ModeDir | 0700},
-
- "temp": {Mode: fs.ModeDir | 0700},
- "work": {Mode: fs.ModeDir | 0700},
- }},
-
- {"overlay root", pkg.CValidateKnown | checkDestroySubstitutes, nil, func(t *testing.T, base *check.Absolute, c *pkg.Cache) {
- testtool, testtoolDestroy := newTesttool()
-
- cureMany(t, c, []cureStep{
- {"container", pkg.NewExec(
- "exec-overlay-root", "", nil, 0, false, false,
- pkg.AbsWork,
- []string{"HAKUREI_TEST=1", "HAKUREI_ROOT=1"},
- check.MustAbs("/opt/bin/testtool"),
- []string{"testtool"},
-
- pkg.MustPath("/", true, &stubArtifact{
- kind: pkg.KindTar,
- params: []byte("empty directory"),
- cure: func(t *pkg.TContext) error {
- return os.MkdirAll(t.GetWorkDir().String(), 0700)
- },
- }),
- pkg.MustPath("/opt", false, testtool),
- ), ignorePathname, wantOffline, pkg.WNew, nil},
- })
-
- destroyStatus(t, base, 2, 0)
- testtoolDestroy(t, base, c)
- }, expectsFS{
- ".": {Mode: fs.ModeDir | 0700},
-
- "checksum": {Mode: fs.ModeDir | 0700},
- "checksum/" + wantOfflineEncode: {Mode: fs.ModeDir | 0500},
- "checksum/" + wantOfflineEncode + "/check": {Mode: 0400, Data: []byte{0}},
- "checksum/MGWmEfjut2QE2xPJwTsmUzpff4BN_FEnQ7T0j7gvUCCiugJQNwqt9m151fm9D1yU": {Mode: fs.ModeDir | 0500},
-
- "identifier": {Mode: fs.ModeDir | 0700},
- "identifier/" + expected.OvlRoot: {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/" + wantOfflineEncode)},
- "identifier/MEaM1v6MLRQ60JQOOKbfDzfJOdC3L8i30IgOpYbQdX68enwF0FN-P36_M4RX_0Vd": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/MGWmEfjut2QE2xPJwTsmUzpff4BN_FEnQ7T0j7gvUCCiugJQNwqt9m151fm9D1yU")},
-
- "substitute": {Mode: fs.ModeDir | 0700},
-
- "temp": {Mode: fs.ModeDir | 0700},
- "work": {Mode: fs.ModeDir | 0700},
- }},
-
- {"overlay work", pkg.CValidateKnown | checkDestroySubstitutes, nil, func(t *testing.T, base *check.Absolute, c *pkg.Cache) {
- testtool, testtoolDestroy := newTesttool()
-
- cureMany(t, c, []cureStep{
- {"container", pkg.NewExec(
- "exec-overlay-work", "", nil, 0, false, false,
- pkg.AbsWork,
- []string{"HAKUREI_TEST=1", "HAKUREI_ROOT=1"},
- check.MustAbs("/work/bin/testtool"),
- []string{"testtool"},
-
- pkg.MustPath("/", true, &stubArtifact{
- kind: pkg.KindTar,
- params: []byte("empty directory"),
- cure: func(t *pkg.TContext) error {
- return os.MkdirAll(t.GetWorkDir().String(), 0700)
- },
- }), pkg.MustPath("/work/", false, &stubArtifact{
- kind: pkg.KindTar,
- params: []byte("empty directory"),
- cure: func(t *pkg.TContext) error {
- return os.MkdirAll(t.GetWorkDir().String(), 0700)
- },
- }), pkg.Path(pkg.AbsWork, false /* ignored */, testtool),
- ), ignorePathname, wantOffline, pkg.WNew, nil},
- })
-
- destroyStatus(t, base, 2, 0)
- testtoolDestroy(t, base, c)
- }, expectsFS{
- ".": {Mode: fs.ModeDir | 0700},
-
- "checksum": {Mode: fs.ModeDir | 0700},
- "checksum/" + wantOfflineEncode: {Mode: fs.ModeDir | 0500},
- "checksum/" + wantOfflineEncode + "/check": {Mode: 0400, Data: []byte{0}},
- "checksum/MGWmEfjut2QE2xPJwTsmUzpff4BN_FEnQ7T0j7gvUCCiugJQNwqt9m151fm9D1yU": {Mode: fs.ModeDir | 0500},
-
- "identifier": {Mode: fs.ModeDir | 0700},
- "identifier/" + expected.Work: {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/" + wantOfflineEncode)},
- "identifier/MEaM1v6MLRQ60JQOOKbfDzfJOdC3L8i30IgOpYbQdX68enwF0FN-P36_M4RX_0Vd": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/MGWmEfjut2QE2xPJwTsmUzpff4BN_FEnQ7T0j7gvUCCiugJQNwqt9m151fm9D1yU")},
-
- "substitute": {Mode: fs.ModeDir | 0700},
-
- "temp": {Mode: fs.ModeDir | 0700},
- "work": {Mode: fs.ModeDir | 0700},
- }},
-
- {"multiple layers", pkg.CValidateKnown | checkDestroySubstitutes, nil, func(t *testing.T, base *check.Absolute, c *pkg.Cache) {
- testtool, testtoolDestroy := newTesttool()
-
- cureMany(t, c, []cureStep{
- {"container", pkg.NewExec(
- "exec-multiple-layers", "", nil, 0, false, false,
- pkg.AbsWork,
- []string{"HAKUREI_TEST=1", "HAKUREI_ROOT=1"},
- check.MustAbs("/opt/bin/testtool"),
- []string{"testtool", "layers"},
-
- pkg.MustPath("/", true, &stubArtifact{
- kind: pkg.KindTar,
- params: []byte("empty directory"),
- cure: func(t *pkg.TContext) error {
- return os.MkdirAll(t.GetWorkDir().String(), 0700)
- },
- }, &stubArtifactF{
- kind: pkg.KindExec,
- params: []byte("test sample with dependencies"),
-
- deps: slices.Repeat([]pkg.Artifact{newStubFile(
- pkg.KindHTTPGet,
- pkg.ID{0xfe, 0},
- nil,
- nil, nil,
- ), &stubArtifact{
- kind: pkg.KindTar,
- params: []byte("empty directory"),
-
- // this is queued and might run instead of the other
- // one so do not leave it as nil
- cure: func(t *pkg.TContext) error {
- return os.MkdirAll(t.GetWorkDir().String(), 0700)
- },
- }}, 1<<5 /* concurrent cache hits */),
-
- cure: func(f *pkg.FContext) error {
- work := f.GetWorkDir()
- if err := os.MkdirAll(work.String(), 0700); err != nil {
- return err
- }
- return os.WriteFile(work.Append("check").String(), []byte("layers"), 0400)
- },
- }),
- pkg.MustPath("/opt", false, testtool),
- ), ignorePathname, wantOffline, pkg.WNew, nil},
- })
-
- destroyStatus(t, base, 2, 0)
- testtoolDestroy(t, base, c)
- }, expectsFS{
- ".": {Mode: fs.ModeDir | 0700},
-
- "checksum": {Mode: fs.ModeDir | 0700},
- "checksum/" + wantOfflineEncode: {Mode: fs.ModeDir | 0500},
- "checksum/" + wantOfflineEncode + "/check": {Mode: 0400, Data: []byte{0}},
- "checksum/MGWmEfjut2QE2xPJwTsmUzpff4BN_FEnQ7T0j7gvUCCiugJQNwqt9m151fm9D1yU": {Mode: fs.ModeDir | 0500},
- "checksum/OLBgp1GsljhM2TJ-sbHjaiH9txEUvgdDTAzHv2P24donTt6_529l-9Ua0vFImLlb": {Mode: 0400, Data: []byte{}},
- "checksum/nY_CUdiaUM1OL4cPr5TS92FCJ3rCRV7Hm5oVTzAvMXwC03_QnTRfQ5PPs7mOU9fK": {Mode: fs.ModeDir | 0500},
- "checksum/nY_CUdiaUM1OL4cPr5TS92FCJ3rCRV7Hm5oVTzAvMXwC03_QnTRfQ5PPs7mOU9fK/check": {Mode: 0400, Data: []byte("layers")},
-
- "identifier": {Mode: fs.ModeDir | 0700},
- "identifier/_gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/OLBgp1GsljhM2TJ-sbHjaiH9txEUvgdDTAzHv2P24donTt6_529l-9Ua0vFImLlb")},
- "identifier/2uIvmnqtzAx4Ed4PWV8xjZCWeJCwfE2IcCc0evM-Nd8mDUlgSU6nLtPLcpPUcMlG": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/nY_CUdiaUM1OL4cPr5TS92FCJ3rCRV7Hm5oVTzAvMXwC03_QnTRfQ5PPs7mOU9fK")},
- "identifier/" + expected.Layers: {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/" + wantOfflineEncode)},
- "identifier/MEaM1v6MLRQ60JQOOKbfDzfJOdC3L8i30IgOpYbQdX68enwF0FN-P36_M4RX_0Vd": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/MGWmEfjut2QE2xPJwTsmUzpff4BN_FEnQ7T0j7gvUCCiugJQNwqt9m151fm9D1yU")},
-
- "substitute": {Mode: fs.ModeDir | 0700},
-
- "temp": {Mode: fs.ModeDir | 0700},
- "work": {Mode: fs.ModeDir | 0700},
- }},
-
- {"overlay layer promotion", pkg.CValidateKnown | checkDestroySubstitutes, nil, func(t *testing.T, base *check.Absolute, c *pkg.Cache) {
- testtool, testtoolDestroy := newTesttool()
-
- cureMany(t, c, []cureStep{
- {"container", pkg.NewExec(
- "exec-layer-promotion", "", nil, 0, false, true,
- pkg.AbsWork,
- []string{"HAKUREI_TEST=1", "HAKUREI_ROOT=1"},
- check.MustAbs("/opt/bin/testtool"),
- []string{"testtool", "promote"},
-
- pkg.MustPath("/", true, &stubArtifact{
- kind: pkg.KindTar,
- params: []byte("another empty directory"),
- cure: func(t *pkg.TContext) error {
- return os.MkdirAll(t.GetWorkDir().String(), 0700)
- },
- }, &stubArtifact{
- kind: pkg.KindTar,
- params: []byte("empty directory"),
- cure: func(t *pkg.TContext) error {
- return os.MkdirAll(t.GetWorkDir().String(), 0700)
- },
- }),
- pkg.MustPath("/opt", false, testtool),
- ), ignorePathname, wantOffline, pkg.WNew, nil},
- })
-
- destroyStatus(t, base, 2, 0)
- testtoolDestroy(t, base, c)
- }, expectsFS{
- ".": {Mode: fs.ModeDir | 0700},
-
- "checksum": {Mode: fs.ModeDir | 0700},
- "checksum/" + wantOfflineEncode: {Mode: fs.ModeDir | 0500},
- "checksum/" + wantOfflineEncode + "/check": {Mode: 0400, Data: []byte{0}},
- "checksum/MGWmEfjut2QE2xPJwTsmUzpff4BN_FEnQ7T0j7gvUCCiugJQNwqt9m151fm9D1yU": {Mode: fs.ModeDir | 0500},
-
- "identifier": {Mode: fs.ModeDir | 0700},
- "identifier/Vzj9qaSVBtNyBQv_PW6uojFOWTwraHoaC0C6xdaGG1q_HTvSh4KLVxRcEQU1jd2Y": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/MGWmEfjut2QE2xPJwTsmUzpff4BN_FEnQ7T0j7gvUCCiugJQNwqt9m151fm9D1yU")},
- "identifier/MEaM1v6MLRQ60JQOOKbfDzfJOdC3L8i30IgOpYbQdX68enwF0FN-P36_M4RX_0Vd": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/MGWmEfjut2QE2xPJwTsmUzpff4BN_FEnQ7T0j7gvUCCiugJQNwqt9m151fm9D1yU")},
- "identifier/" + expected.Promote: {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/" + wantOfflineEncode)},
-
- "substitute": {Mode: fs.ModeDir | 0700},
-
- "temp": {Mode: fs.ModeDir | 0700},
- "work": {Mode: fs.ModeDir | 0700},
- }},
-
- {"binfmt", pkg.CValidateKnown | checkDestroySubstitutes, nil, func(t *testing.T, base *check.Absolute, c *pkg.Cache) {
- if info.CanDegrade && os.Getenv("ROSA_SKIP_BINFMT") != "" {
- t.Skip("binfmt_misc test explicitly skipped")
- }
-
- cureMany(t, c, []cureStep{
- {"container", pkg.NewExec(
- "exec-binfmt", "cafe", nil, 0, false, true,
- pkg.AbsWork,
- []string{"HAKUREI_TEST=1", "HAKUREI_BINFMT=1"},
- check.MustAbs("/opt/bin/sample"),
- []string{"sample"},
-
- pkg.MustPath("/", true, &stubArtifact{
- kind: pkg.KindTar,
- params: []byte("empty directory"),
- cure: func(t *pkg.TContext) error {
- return os.MkdirAll(t.GetWorkDir().String(), 0700)
- },
- }),
- pkg.MustPath("/opt", false, overrideIdent{pkg.ID{0xfe, 0xff}, &stubArtifact{
- kind: pkg.KindTar,
- cure: func(t *pkg.TContext) error {
- work := t.GetWorkDir()
- if err := os.MkdirAll(
- work.Append("bin").String(),
- 0700,
- ); err != nil {
- return err
- }
-
- return os.WriteFile(t.GetWorkDir().Append(
- "bin",
- "sample",
- ).String(), []byte(expected.Full), 0500)
- },
- }}),
- ), ignorePathname, expectsFS{
- ".": {Mode: fs.ModeDir | 0500},
-
- "check": {Mode: 0400, Data: []byte("binfmt")},
- }, pkg.WNew, nil},
- })
-
- destroyStatus(t, base, 2, 0)
- }, expectsFS{
- ".": {Mode: fs.ModeDir | 0700},
-
- "checksum": {Mode: fs.ModeDir | 0700},
- "checksum/5aevg3YpDxjqQZ-pdvXK7YqgkL5JKqcoStYQxeD96kuYar6K2mRQWMHib6NQRnpV": {Mode: fs.ModeDir | 0500},
- "checksum/5aevg3YpDxjqQZ-pdvXK7YqgkL5JKqcoStYQxeD96kuYar6K2mRQWMHib6NQRnpV/bin": {Mode: fs.ModeDir | 0700},
- "checksum/5aevg3YpDxjqQZ-pdvXK7YqgkL5JKqcoStYQxeD96kuYar6K2mRQWMHib6NQRnpV/bin/sample": {Mode: 0500, Data: []byte("\xca\xfe\xba\xbe\xfd\xfd:3")},
- "checksum/MGWmEfjut2QE2xPJwTsmUzpff4BN_FEnQ7T0j7gvUCCiugJQNwqt9m151fm9D1yU": {Mode: fs.ModeDir | 0500},
- "checksum/UnDo4B5KneEUY5b4vRUk_y9MWgkWuw2N8f8a2XayO686xXur-aZmX2-7n_8tKMe3": {Mode: fs.ModeDir | 0500},
- "checksum/UnDo4B5KneEUY5b4vRUk_y9MWgkWuw2N8f8a2XayO686xXur-aZmX2-7n_8tKMe3/check": {Mode: 0400, Data: []byte("binfmt")},
-
- "identifier": {Mode: fs.ModeDir | 0700},
- "identifier/c-HodmoEG0f_WGdst9aN-duLMH7QDDXOUi7UcyArXMeM1fc9lYKKQlTCW8ktaK8X": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/UnDo4B5KneEUY5b4vRUk_y9MWgkWuw2N8f8a2XayO686xXur-aZmX2-7n_8tKMe3")},
- "identifier/_v8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/5aevg3YpDxjqQZ-pdvXK7YqgkL5JKqcoStYQxeD96kuYar6K2mRQWMHib6NQRnpV")},
- "identifier/MEaM1v6MLRQ60JQOOKbfDzfJOdC3L8i30IgOpYbQdX68enwF0FN-P36_M4RX_0Vd": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/MGWmEfjut2QE2xPJwTsmUzpff4BN_FEnQ7T0j7gvUCCiugJQNwqt9m151fm9D1yU")},
-
- "substitute": {Mode: fs.ModeDir | 0700},
-
- "temp": {Mode: fs.ModeDir | 0700},
- "work": {Mode: fs.ModeDir | 0700},
- }},
- })
-}
-
-// newTesttool returns an [Artifact] that cures into testtoolBin. The returned
-// function must be called at the end of the test but not deferred.
-func newTesttool() (
- testtool pkg.Artifact,
- testtoolDestroy func(t *testing.T, base *check.Absolute, c *pkg.Cache),
-) {
- // testtoolBin is built during go:generate and is not deterministic
- testtool = overrideIdent{pkg.ID{0xfe, 0xff}, &stubArtifact{
- kind: pkg.KindTar,
- cure: func(t *pkg.TContext) error {
- work := t.GetWorkDir()
- if err := os.MkdirAll(
- work.Append("bin").String(),
- 0700,
- ); err != nil {
- return err
- }
-
- if ift, err := net.Interfaces(); err != nil {
- return err
- } else {
- var f *os.File
- if f, err = os.Create(t.GetWorkDir().Append(
- "ift",
- ).String()); err != nil {
- return err
- } else {
- err = gob.NewEncoder(f).Encode(ift)
- closeErr := f.Close()
- if err != nil {
- return err
- }
- if closeErr != nil {
- return closeErr
- }
- }
- }
-
- return os.WriteFile(t.GetWorkDir().Append(
- "bin",
- "testtool",
- ).String(), testtoolBin, 0500)
- },
- }}
- testtoolDestroy = newDestroyArtifactFunc(testtool)
- return
-}
diff --git a/internal/pkg/file.go b/internal/pkg/file.go
deleted file mode 100644
index 14467153..00000000
--- a/internal/pkg/file.go
+++ /dev/null
@@ -1,100 +0,0 @@
-package pkg
-
-import (
- "bytes"
- "crypto/sha512"
- "fmt"
- "io"
-)
-
-// A fileArtifact is an [Artifact] that cures into data known ahead of time.
-type fileArtifact []byte
-
-var _ KnownChecksum = new(fileArtifact)
-var _ CuresExempt = new(fileArtifact)
-var _ RevisionArtifact = new(fileArtifact)
-
-// fileArtifactNamed embeds fileArtifact alongside a caller-supplied name.
-type fileArtifactNamed struct {
- fileArtifact
- // Caller-supplied user-facing reporting name.
- name string
-}
-
-var _ fmt.Stringer = new(fileArtifactNamed)
-var _ KnownChecksum = new(fileArtifactNamed)
-
-// String returns the caller-supplied reporting name.
-func (a *fileArtifactNamed) String() string { return a.name }
-
-// Params writes the caller-supplied reporting name and the file body.
-func (a *fileArtifactNamed) Params(ctx *IContext) {
- ctx.WriteString(a.name)
- ctx.Write(a.fileArtifact)
-}
-
-// NewFile returns a [FileArtifact] that cures into a caller-supplied byte slice.
-//
-// Caller must not modify data after NewFile returns.
-func NewFile(name string, data []byte) FileArtifact {
- f := fileArtifact(data)
- if name != "" {
- return &fileArtifactNamed{f, name}
- }
- return &f
-}
-
-// Kind returns the hardcoded [Kind] constant.
-func (*fileArtifact) Kind() Kind { return KindFile }
-
-// Params writes an empty string and the file body.
-func (a *fileArtifact) Params(ctx *IContext) {
- ctx.WriteString("")
- ctx.Write(*a)
-}
-
-func init() {
- register(KindFile, func(r *IRReader) Artifact {
- name := r.ReadString()
- data := r.ReadStringBytes()
- if _, ok := r.Finalise(); !ok {
- panic(ErrExpectedChecksum)
- }
- return NewFile(name, data)
- })
-}
-
-// Inputs returns a nil slice.
-func (*fileArtifact) Inputs() []Artifact { return nil }
-
-// IsExclusive returns false: Cure returns a prepopulated buffer.
-func (*fileArtifact) IsExclusive() bool { return false }
-
-// Checksum computes and returns the checksum of caller-supplied data.
-func (a *fileArtifact) Checksum() Checksum {
- h := sha512.New384()
- h.Write(*a)
- return Checksum(h.Sum(nil))
-}
-
-// Revision satisfies [RevisionArtifact] for incompatible IsExecutable behaviour.
-func (*fileArtifact) Revision() uint64 { return 0 }
-
-// IsExecutable returns whether the contents begin with shebang or the ELF
-// magic number.
-func (a *fileArtifact) IsExecutable() bool {
- return a != nil &&
- (bytes.HasPrefix(
- *a, []byte{'#', '!'},
- ) || bytes.HasPrefix(
- *a, []byte{0x7f, 'E', 'L', 'F'},
- ))
-}
-
-// Cure returns the caller-supplied data.
-func (a *fileArtifact) Cure(*RContext) (io.ReadCloser, error) {
- return io.NopCloser(bytes.NewReader(*a)), nil
-}
-
-// CuresExempt exempts the cheap [KindFile] implementation.
-func (*fileArtifact) CuresExempt() {}
diff --git a/internal/pkg/file_test.go b/internal/pkg/file_test.go
deleted file mode 100644
index f6fcc96f..00000000
--- a/internal/pkg/file_test.go
+++ /dev/null
@@ -1,56 +0,0 @@
-package pkg_test
-
-import (
- "io/fs"
- "testing"
-
- "hakurei.app/check"
- "hakurei.app/internal/pkg"
-)
-
-func TestFile(t *testing.T) {
- t.Parallel()
-
- want := expectsFile{0}
- const ident = "N7M6W8-e55Wky_1q1a6qRKFVDw1S5XtPdB4HE2YZObG8OFum8HittyJgZUG5Ru2u"
- wantShebang := expectsFile("#!/bin/sh\n")
- const identShebang = "oKTGZb_TRtJf5G1iGGj4SOx1WUbI6YhmsUeEsCNvmK9tZYRwdwQf-DLFUxRPx5qm"
- wantELF := expectsFile("\x7fELF\xde\xad\xbe\xef")
- const identELF = "LjeHmIJgD1SiXIH8ewpGRed2_LU84NLapstnOAa_0hxLd8YY7x4KM0aApsj-RwCh"
- checkWithCache(t, []cacheTestCase{
- {"file", pkg.CValidateKnown, nil, func(t *testing.T, base *check.Absolute, c *pkg.Cache) {
- cureMany(t, c, []cureStep{
- {"short", pkg.NewFile("null", want), base.Append(
- "identifier",
- ident,
- ), want, pkg.WNew, nil},
-
- {"shebang", pkg.NewFile("shebang", wantShebang), base.Append(
- "identifier",
- identShebang,
- ), wantShebang, pkg.WNew, nil},
-
- {"elf", pkg.NewFile("ELF", wantELF), base.Append(
- "identifier",
- identELF,
- ), wantELF, pkg.WNew, nil},
- })
- }, expectsFS{
- ".": {Mode: fs.ModeDir | 0700},
-
- "checksum": {Mode: fs.ModeDir | 0700},
- "checksum/" + pkg.Encode(want.hash()): {Mode: 0400, Data: want},
- "checksum/" + pkg.Encode(wantShebang.hash()): {Mode: 0500, Data: wantShebang},
- "checksum/" + pkg.Encode(wantELF.hash()): {Mode: 0500, Data: wantELF},
-
- "identifier": {Mode: fs.ModeDir | 0700},
- "identifier/" + ident: {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/" + pkg.Encode(want.hash()))},
- "identifier/" + identShebang: {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/" + pkg.Encode(wantShebang.hash()))},
- "identifier/" + identELF: {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/" + pkg.Encode(wantELF.hash()))},
-
- "substitute": {Mode: fs.ModeDir | 0700},
-
- "work": {Mode: fs.ModeDir | 0700},
- }},
- })
-}
diff --git a/internal/pkg/internal/testtool/expected/expected.go b/internal/pkg/internal/testtool/expected/expected.go
deleted file mode 100644
index c0e8e4a2..00000000
--- a/internal/pkg/internal/testtool/expected/expected.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// Package expected contains data shared between test helper and test harness.
-package expected
-
-const (
- // Magic are magic bytes in the binfmt test case.
- Magic = "\xca\xfe\xba\xbe\xfd\xfd"
- // Full is the full content of the binfmt test case executable.
- Full = Magic + ":3"
-)
diff --git a/internal/pkg/internal/testtool/expected/sum_amd64.go b/internal/pkg/internal/testtool/expected/sum_amd64.go
deleted file mode 100644
index 354931be..00000000
--- a/internal/pkg/internal/testtool/expected/sum_amd64.go
+++ /dev/null
@@ -1,11 +0,0 @@
-package expected
-
-const (
- Offline = "IKmVhALejtYA3JhN1PCfjKF-Dio1XVcOeMWDHhfSHCbb4iBNhGjFy2UspZveZvb8"
- OfflineS = "6ZubjSyCnz4-TKgQZi_BbY-JUwsStYCtD_f-BTDOOotfEbqkm47W20AazHRaLviz"
- OvlRoot = "Yox7WpG8B_OqIXWF4HWFZkUfsEl7DGzpFyZM0qtd9T8nQ-7SAkEUurlAe6_DJ6Iu"
- Layers = "aAwfxDB-efVo379FNl178jK7HEKU3LEjHbZdaVVjk7GnXGZGEANNsXnB3SCUxM9A"
- Net = "IU3GwU2jTBd7HjotvFo2wsDWBQGVGpamwiSKdc2G1EnhM-ZaacxAuK6q0wbTVxra"
- Promote = "rOjetGHzT_jPErrBR24IAZKDj8Q9dLLqxFQqloMgjsULss0VXDI--n6LxuMBHvmZ"
- Work = "7f9XDeREfvJIjCe0qesND0s0tasExAIcc-OH33-eq9tsrQPUXhJp4KEkpsYH4hCD"
-)
diff --git a/internal/pkg/internal/testtool/expected/sum_arm64.go b/internal/pkg/internal/testtool/expected/sum_arm64.go
deleted file mode 100644
index 2e6f7cbf..00000000
--- a/internal/pkg/internal/testtool/expected/sum_arm64.go
+++ /dev/null
@@ -1,11 +0,0 @@
-package expected
-
-const (
- Offline = "MTgCSzwPrzGigp9phvDPRwUTNGLm1KM2EsEtbz-l2cNieqjaGtnzm65CDXlSxXrl"
- OfflineS = "p89bQg7_jR4nwaSbpEd08ne1jHOEw7Wlnlyv5FHq7ba1Kml3HSBZwEKRzu0gCqEb"
- OvlRoot = "9ifwO6MAaV9kTqRR2O5PJzm8XhfXbr50mFLWyEHQm8OHHcJtAEUgXZzJYoZt9YVV"
- Layers = "INuGActFPwJtS7mAR9Bkt7FD4yoHlXHSJ9CaSAQJrpkUBL_k815Cs_jvRfxy5-a7"
- Net = "kJvy24uk4ePvHoxSKf4vMOhR4NxLbmyWlA9bTS7d3z3fE9WF1Tvpao9g-QuYU4vm"
- Promote = "lYqyYrfjPawIbld5Qz0NbKvd_bmI3nJC1eEnlIQWzsjWE9uA1HuKPAaClnDeyG6L"
- Work = "V6k4FqOBMRCmHiqchs5-joVGZ_MhNWZyXm3gdbU0S7S5eMze7G4SwYMTf66ojKQL"
-)
diff --git a/internal/pkg/internal/testtool/expected/sum_riscv64.go b/internal/pkg/internal/testtool/expected/sum_riscv64.go
deleted file mode 100644
index 53872c08..00000000
--- a/internal/pkg/internal/testtool/expected/sum_riscv64.go
+++ /dev/null
@@ -1,11 +0,0 @@
-package expected
-
-const (
- Offline = "LlieSHVDe1lnKvfI8t4oGRg_2hPxwyy1drmaqc-EKCOENuS9C2YHrp2VY5pSyhbg"
- OfflineS = "qccjM8oYjUuEYPKFFzAxDFVzMerSUKUZc18NdVQoiPWf-70XOsNK8NaUQqjTgTAD"
- OvlRoot = "lpV2bb_KGYFHPiOn-jtGop8K_ew0y1p3BezRp0ebM93_a-T9J-vkqGD5uokda1aN"
- Layers = "sM3DJm210CHPGHkAquIbrXhspB81FpVC60ApQrvJGD5El2i7cSONj7LWf7EWqKpT"
- Net = "JihQUwsVETRYjb2-yIXLYZ6WVsaFebwl8btSYAsNQ2QapS5MZVaI-dYwrVoySycR"
- Promote = "lGqwR4W2OjylSVitMQP1lc6wApOBkbMjsmIqkxQbfEZ3DHEQBbJr84ErW6Xb54zo"
- Work = "aZgtyv6aMtoHFkHAaJr6nLaA7N_SHjShgWPyQ5UdzaIqYSiVqvCrZqSokGTCcTii"
-)
diff --git a/internal/pkg/internal/testtool/main.go b/internal/pkg/internal/testtool/main.go
deleted file mode 100644
index 96a85058..00000000
--- a/internal/pkg/internal/testtool/main.go
+++ /dev/null
@@ -1,277 +0,0 @@
-//go:build testtool
-
-package main
-
-import (
- "encoding/gob"
- "log"
- "net"
- "os"
- "path/filepath"
- "reflect"
- "runtime"
- "slices"
- "strconv"
- "strings"
-
- "hakurei.app/fhs"
- "hakurei.app/vfs"
-
- "hakurei.app/internal/pkg/internal/testtool/expected"
-)
-
-func main() {
- log.SetFlags(0)
- log.SetPrefix("testtool: ")
-
- if os.Getenv("HAKUREI_BINFMT") == "1" {
- wantArgs := []string{"/interpreter", "/opt/bin/sample"}
- if !slices.Equal(os.Args, wantArgs) {
- log.Fatalf("Args: %q, want %q", os.Args, wantArgs)
- }
-
- if err := os.WriteFile("check", []byte("binfmt"), 0400); err != nil {
- log.Fatal(err)
- }
-
- return
- }
-
- environ := slices.DeleteFunc(slices.Clone(os.Environ()), func(s string) bool {
- for _, t := range []string{
- "CURE_JOBS=" + strconv.Itoa(runtime.NumCPU()),
- "CURE_LOAD=" + strconv.Itoa(runtime.NumCPU()+2),
- } {
- if s == t {
- return true
- }
- }
- return false
- })
-
- var hostNet, layers, promote bool
- if len(os.Args) == 2 && os.Args[0] == "testtool" {
- switch os.Args[1] {
- case "net":
- hostNet = true
- log.SetPrefix("testtool(net): ")
- break
-
- case "layers":
- layers = true
- log.SetPrefix("testtool(layers): ")
- break
-
- case "promote":
- promote = true
- log.SetPrefix("testtool(promote): ")
-
- default:
- log.Fatalf("Args: %q", os.Args)
- return
- }
- } else if wantArgs := []string{"testtool"}; !slices.Equal(os.Args, wantArgs) {
- log.Fatalf("Args: %q, want %q", os.Args, wantArgs)
- }
-
- var overlayRoot bool
- wantEnv := []string{"HAKUREI_TEST=1"}
- if len(environ) == 2 {
- overlayRoot = true
- if !layers && !promote {
- log.SetPrefix("testtool(overlay root): ")
- }
- wantEnv = []string{"HAKUREI_TEST=1", "HAKUREI_ROOT=1"}
- }
- if !slices.Equal(wantEnv, environ) {
- log.Fatalf("Environ: %q, want %q", environ, wantEnv)
- }
-
- var overlayWork bool
- const (
- wantExec = "/opt/bin/testtool"
- wantExecWork = "/work/bin/testtool"
- )
- var iftPath string
- if got, err := os.Executable(); err != nil {
- log.Fatalf("Executable: error = %v", err)
- } else {
- iftPath = filepath.Join(filepath.Dir(filepath.Dir(got)), "ift")
-
- if got != wantExec {
- switch got {
- case wantExecWork:
- overlayWork = true
- log.SetPrefix("testtool(overlay work): ")
-
- default:
- log.Fatalf("Executable: %q, want %q", got, wantExec)
- }
- }
- }
-
- wantHostname := "cure"
- if hostNet {
- wantHostname += "-net"
- }
-
- if hostname, err := os.Hostname(); err != nil {
- log.Fatalf("Hostname: error = %v", err)
- } else if hostname != wantHostname {
- log.Fatalf("Hostname: %q, want %q", hostname, wantHostname)
- }
-
- var m *vfs.MountInfo
- if f, err := os.Open(fhs.Proc + "self/mountinfo"); err != nil {
- log.Fatalf("Open: error = %v", err)
- } else {
- err = vfs.NewMountInfoDecoder(f).Decode(&m)
- closeErr := f.Close()
- if err != nil {
- log.Fatalf("Decode: error = %v", err)
- }
- if closeErr != nil {
- log.Fatalf("Close: error = %v", err)
- }
- }
-
- if ift, err := net.Interfaces(); err != nil {
- log.Fatal(err)
- } else if !hostNet {
- if len(ift) != 1 || ift[0].Name != "lo" {
- log.Fatalln("got interfaces", strings.Join(slices.Collect(func(yield func(ifn string) bool) {
- for _, ifi := range ift {
- if !yield(ifi.Name) {
- break
- }
- }
- }), ", "))
- }
- } else {
- var iftParent []net.Interface
-
- var r *os.File
- if r, err = os.Open(iftPath); err != nil {
- log.Fatal(err)
- } else {
- err = gob.NewDecoder(r).Decode(&iftParent)
- closeErr := r.Close()
- if err != nil {
- log.Fatal(err)
- }
- if closeErr != nil {
- log.Fatal(closeErr)
- }
- }
-
- if !reflect.DeepEqual(ift, iftParent) {
- log.Fatalf("Interfaces: %#v, want %#v", ift, iftParent)
- }
- }
-
- const checksumEmptyDir = "MGWmEfjut2QE2xPJwTsmUzpff4BN_FEnQ7T0j7gvUCCiugJQNwqt9m151fm9D1yU"
- ident := expected.Offline
- log.Println(m)
- next := func() { m = m.Next; log.Println(m) }
-
- if overlayRoot {
- ident = expected.OvlRoot
-
- if m.Root != "/" || m.Target != "/" ||
- m.Source != "overlay" || m.FsType != "overlay" {
- log.Fatal("unexpected root mount entry")
- }
- var lowerdir []string
- for _, o := range strings.Split(m.FsOptstr, ",") {
- const lowerdirKey = "lowerdir+="
- if strings.HasPrefix(o, lowerdirKey) {
- lowerdir = append(lowerdir, o[len(lowerdirKey):])
- }
- }
- if !layers {
- if len(lowerdir) != 1 || filepath.Base(lowerdir[0]) != checksumEmptyDir {
- log.Fatal("unexpected artifact checksum")
- }
- } else {
- ident = expected.Layers
-
- if len(lowerdir) != 2 ||
- filepath.Base(lowerdir[0]) != "MGWmEfjut2QE2xPJwTsmUzpff4BN_FEnQ7T0j7gvUCCiugJQNwqt9m151fm9D1yU" ||
- filepath.Base(lowerdir[1]) != "nY_CUdiaUM1OL4cPr5TS92FCJ3rCRV7Hm5oVTzAvMXwC03_QnTRfQ5PPs7mOU9fK" {
- log.Fatalf("unexpected lowerdirs %s", strings.Join(lowerdir, ", "))
- }
- }
- } else {
- if hostNet {
- ident = expected.Net
- }
-
- if m.Root != "/sysroot" || m.Target != "/" {
- log.Fatal("unexpected root mount entry")
- }
-
- next()
- if filepath.Base(m.Root) != "OLBgp1GsljhM2TJ-sbHjaiH9txEUvgdDTAzHv2P24donTt6_529l-9Ua0vFImLlb" {
- log.Fatal("unexpected file artifact checksum")
- }
-
- next()
- if filepath.Base(m.Root) != checksumEmptyDir {
- log.Fatal("unexpected artifact checksum")
- }
- }
-
- if promote {
- ident = expected.Promote
- }
-
- next() // testtool artifact
-
- next()
- if overlayWork {
- ident = expected.Work
- if m.Root != "/" || m.Target != "/work" ||
- m.Source != "overlay" || m.FsType != "overlay" {
- log.Fatal("unexpected work mount entry")
- }
- } else {
- if filepath.Base(m.Root) != ident || m.Target != "/work" {
- log.Fatal("unexpected work mount entry")
- }
- }
-
- next()
- if filepath.Base(m.Root) != ident || m.Target != "/tmp" {
- log.Fatal("unexpected temp mount entry")
- }
-
- next()
- if m.Root != "/" || m.Target != "/proc" || m.Source != "proc" || m.FsType != "proc" {
- log.Fatal("unexpected proc mount entry")
- }
-
- next()
- if m.Root != "/" || m.Target != "/dev" || m.Source != "devtmpfs" || m.FsType != "tmpfs" {
- log.Fatal("unexpected dev mount entry")
- }
-
- for i := 0; i < 9; i++ { // private /dev entries
- next()
- }
-
- if m.Next != nil {
- log.Println("unexpected extra mount entries")
- for m.Next != nil {
- next()
- }
- os.Exit(1)
- }
-
- checkData := []byte{0}
- if hostNet {
- checkData = []byte("net")
- }
- if err := os.WriteFile("check", checkData, 0400); err != nil {
- log.Fatal(err)
- }
-}
diff --git a/internal/pkg/ir.go b/internal/pkg/ir.go
deleted file mode 100644
index d9f984a7..00000000
--- a/internal/pkg/ir.go
+++ /dev/null
@@ -1,865 +0,0 @@
-package pkg
-
-import (
- "bufio"
- "bytes"
- "crypto/sha512"
- "encoding/binary"
- "errors"
- "fmt"
- "io"
- "iter"
- "slices"
- "strconv"
- "sync"
- "syscall"
- "unique"
- "unsafe"
-)
-
-// wordSize is the boundary which binary segments are always aligned to.
-const wordSize = 8
-
-// alignSize returns the padded size for aligning sz.
-func alignSize[T int | uint64](sz T) T {
- return sz + (wordSize-(sz)%wordSize)%wordSize
-}
-
-// panicToError recovers from a panic and replaces a nil error with the panicked
-// error value. If the value does not implement error, it is re-panicked.
-func panicToError(errP *error) {
- r := recover()
- if r == nil {
- return
- }
-
- if err, ok := r.(error); !ok {
- panic(r)
- } else if *errP == nil {
- *errP = err
- }
-}
-
-// irCache implements [IRCache].
-type irCache struct {
- // Artifact to [unique.Handle] of identifier cache.
- artifact sync.Map
- // Identifier free list, must not be accessed directly.
- identPool sync.Pool
-}
-
-// zeroIRCache returns the initialised value of irCache.
-func zeroIRCache() irCache {
- return irCache{
- identPool: sync.Pool{New: func() any { return new(extIdent) }},
- }
-}
-
-// IRCache provides memory management and caching primitives for IR and
-// identifier operations against [Artifact] implementations.
-//
-// The zero value is not safe for use.
-type IRCache struct{ irCache }
-
-// NewIR returns the address of a new [IRCache].
-func NewIR() *IRCache {
- return &IRCache{zeroIRCache()}
-}
-
-// Inputs returns an iterator over direct and transitive inputs of an [Artifact]
-// in randomised order.
-func Inputs(a Artifact) iter.Seq2[Artifact, unique.Handle[ID]] {
- ic := NewIR()
- ic.Ident(a)
- return func(yield func(Artifact, unique.Handle[ID]) bool) {
- ic.artifact.Range(func(key, value any) bool {
- return yield(key.(Artifact), value.(unique.Handle[ID]))
- })
- }
-}
-
-// IContext is passed to [Artifact.Params] and provides methods for writing
-// values to the IR writer. It does not expose the underlying [io.Writer].
-//
-// IContext is valid until [Artifact.Params] returns.
-type IContext struct {
- // Address of underlying irCache, should be zeroed or made unusable after
- // [Artifact.Params] returns and must not be exposed directly.
- ic *irCache
- // Written to by various methods, should be zeroed after [Artifact.Params]
- // returns and must not be exposed directly.
- w io.Writer
- // Optional [Artifact] to cureRes cache, replaces [IRKindIdent] with
- // checksum values if non-nil. The pathname field may not be populated.
- inputs map[Artifact]cureRes
-}
-
-// irZero is a zero IR word.
-var irZero [wordSize]byte
-
-// IRValueKind denotes the kind of encoded value.
-type IRValueKind uint32
-
-const (
- // IRKindEnd denotes the end of the current parameters stream. The ancillary
- // value is interpreted as [IREndFlag].
- IRKindEnd IRValueKind = iota
- // IRKindIdent denotes the identifier of a dependency [Artifact]. The
- // ancillary value is reserved for future use.
- IRKindIdent
- // IRKindUint32 denotes an inlined uint32 value.
- IRKindUint32
- // IRKindString denotes a string with its true length encoded in header
- // ancillary data. Its wire length is always aligned to 8 byte boundary.
- IRKindString
-
- irHeaderShift = 32
- irHeaderMask = 0xffffffff
-)
-
-// String returns a user-facing name of k.
-func (k IRValueKind) String() string {
- switch k {
- case IRKindEnd:
- return "terminator"
- case IRKindIdent:
- return "ident"
- case IRKindUint32:
- return "uint32"
- case IRKindString:
- return "string"
- default:
- return "invalid kind " + strconv.Itoa(int(k))
- }
-}
-
-// irValueHeader encodes [IRValueKind] and a 32-bit ancillary value.
-type irValueHeader uint64
-
-// encodeHeader returns irValueHeader encoding [IRValueKind] and ancillary data.
-func (k IRValueKind) encodeHeader(v uint32) irValueHeader {
- return irValueHeader(v)<<irHeaderShift | irValueHeader(k)
-}
-
-// put stores h in b[0:8].
-func (h irValueHeader) put(b []byte) {
- binary.LittleEndian.PutUint64(b[:], uint64(h))
-}
-
-// append appends the bytes of h to b and returns the appended slice.
-func (h irValueHeader) append(b []byte) []byte {
- return binary.LittleEndian.AppendUint64(b, uint64(h))
-}
-
-// IREndFlag is ancillary data encoded in the header of an [IRKindEnd] value and
-// specifies the presence of optional fields in the remaining [IRKindEnd] data.
-// Order of present fields is the order of their corresponding constants defined
-// below.
-type IREndFlag uint32
-
-const (
- // IREndKnownChecksum denotes a [KnownChecksum] artifact. For an [IRKindEnd]
- // value with this flag set, the remaining data contains the [Checksum].
- IREndKnownChecksum IREndFlag = 1 << iota
-)
-
-// mustWrite writes to IContext.w and panics on error. The panic is recovered
-// from by the caller and used as the return value.
-func (i *IContext) mustWrite(p []byte) {
- if _, err := i.w.Write(p); err != nil {
- panic(err)
- }
-}
-
-// WriteIdent writes the identifier of [Artifact] to the IR. The behaviour of
-// WriteIdent is not defined for an [Artifact] not part of the slice returned by
-// [Artifact.Inputs].
-func (i *IContext) WriteIdent(a Artifact) {
- buf := i.ic.getIdentBuf()
- defer i.ic.putIdentBuf(buf)
-
- IRKindIdent.encodeHeader(0).put(buf[:])
- if i.inputs != nil {
- res, ok := i.inputs[a]
- if !ok {
- panic(InvalidLookupError(i.ic.Ident(a).Value()))
- }
- *(*ID)(buf[wordSize:]) = res.checksum.Value()
- } else {
- *(*ID)(buf[wordSize:]) = i.ic.Ident(a).Value()
- }
- i.mustWrite(buf[:])
-}
-
-// WriteUint32 writes a uint32 value to the IR.
-func (i *IContext) WriteUint32(v uint32) {
- i.mustWrite(IRKindUint32.encodeHeader(v).append(nil))
-}
-
-// irMaxStringLength is the maximum acceptable wire size of [IRKindString].
-const irMaxStringLength = 1 << 24
-
-// IRStringError is a string value too big to encode in IR.
-type IRStringError string
-
-func (IRStringError) Error() string {
- return "params value too big to encode in IR"
-}
-
-// Write writes p as a string value to the IR.
-func (i *IContext) Write(p []byte) {
- sz := alignSize(len(p))
- if len(p) > irMaxStringLength || sz > irMaxStringLength {
- panic(IRStringError(p))
- }
-
- i.mustWrite(IRKindString.encodeHeader(uint32(len(p))).append(nil))
- i.mustWrite(p)
-
- psz := sz - len(p)
- if psz > 0 {
- i.mustWrite(irZero[:psz])
- }
-}
-
-// WriteString writes s as a string value to the IR.
-func (i *IContext) WriteString(s string) {
- p := unsafe.Slice(unsafe.StringData(s), len(s))
- i.Write(p)
-}
-
-// Encode writes a deterministic, efficient representation of a to w and returns
-// the first non-nil error encountered while writing to w.
-func (ic *irCache) Encode(w io.Writer, a Artifact) (err error) {
- return ic.encode(w, a, nil)
-}
-
-// encode implements Encode but replaces identifiers with their cured checksums
-// for a non-nil ident. The pathname field is unused. Caller must acquire
-// Cache.identMu.
-func (ic *irCache) encode(
- w io.Writer,
- a Artifact,
- inputs map[Artifact]cureRes,
-) (err error) {
- deps := a.Inputs()
- idents := make([]*extIdent, len(deps))
- if inputs == nil {
- for i, d := range deps {
- dbuf, did := ic.unsafeIdent(d, true)
- if dbuf == nil {
- dbuf = ic.getIdentBuf()
- binary.LittleEndian.PutUint64(dbuf[:], uint64(d.Kind()))
- *(*ID)(dbuf[wordSize:]) = did.Value()
- } else {
- ic.storeIdent(d, dbuf)
- }
- defer ic.putIdentBuf(dbuf)
- idents[i] = dbuf
- }
- } else {
- for i, d := range deps {
- res, ok := inputs[d]
- if !ok {
- return InvalidLookupError(ic.Ident(d).Value())
- }
-
- dbuf := ic.getIdentBuf()
- binary.LittleEndian.PutUint64(dbuf[:], uint64(d.Kind()))
- *(*ID)(dbuf[wordSize:]) = res.checksum.Value()
- defer ic.putIdentBuf(dbuf)
- idents[i] = dbuf
- }
- }
- slices.SortFunc(idents, func(a, b *extIdent) int {
- return bytes.Compare(a[:], b[:])
- })
- idents = slices.CompactFunc(idents, func(a, b *extIdent) bool {
- return *a == *b
- })
-
- // kind uint64 | rev uint64 | deps_sz uint64
- var buf [wordSize * 3]byte
- binary.LittleEndian.PutUint64(buf[:], uint64(a.Kind()))
- binary.LittleEndian.PutUint64(buf[wordSize:], GetRevision(a))
- binary.LittleEndian.PutUint64(buf[wordSize*2:], uint64(len(idents)))
- if _, err = w.Write(buf[:]); err != nil {
- return
- }
-
- for _, dn := range idents {
- // kind uint64 | ident ID
- if _, err = w.Write(dn[:]); err != nil {
- return
- }
- }
-
- func() {
- i := IContext{ic, w, inputs}
-
- defer panicToError(&err)
- defer func() { i.ic, i.w = nil, nil }()
-
- a.Params(&i)
- }()
- if err != nil {
- return
- }
-
- var f IREndFlag
- kcBuf := ic.getIdentBuf()
- sz := wordSize
- if kc, ok := a.(KnownChecksum); ok {
- f |= IREndKnownChecksum
- *(*Checksum)(kcBuf[wordSize:]) = kc.Checksum()
- sz += len(Checksum{})
- }
- IRKindEnd.encodeHeader(uint32(f)).put(kcBuf[:])
-
- _, err = w.Write(kcBuf[:sz])
- ic.putIdentBuf(kcBuf)
- return
-}
-
-// encodeAll implements EncodeAll by recursively encoding dependencies and
-// performs deduplication by value via the encoded map.
-func (ic *irCache) encodeAll(
- w io.Writer,
- a Artifact,
- encoded map[Artifact]struct{},
-) (err error) {
- if _, ok := encoded[a]; ok {
- return
- }
-
- for _, d := range a.Inputs() {
- if err = ic.encodeAll(w, d, encoded); err != nil {
- return
- }
- }
-
- encoded[a] = struct{}{}
- return ic.Encode(w, a)
-}
-
-// EncodeAll writes a self-describing IR stream of a to w and returns the first
-// non-nil error encountered while writing to w.
-//
-// EncodeAll tries to avoid encoding the same [Artifact] more than once, however
-// it will fail to do so if they do not compare equal by value, as that will
-// require buffering and greatly reduce performance. It is therefore up to the
-// caller to avoid causing dependencies to be represented in a way such that
-// two equivalent artifacts do not compare equal. While an IR stream with
-// repeated artifacts is valid, it is somewhat inefficient, and the reference
-// [IRDecoder] implementation produces a warning for it.
-//
-// Note that while EncodeAll makes use of the ident free list, it does not use
-// the ident cache, nor does it contribute identifiers it computes back to the
-// ident cache. Because of this, multiple invocations of EncodeAll will have
-// similar cost and does not amortise when combined with a call to Cure.
-func (ic *irCache) EncodeAll(w io.Writer, a Artifact) error {
- return ic.encodeAll(w, a, make(map[Artifact]struct{}))
-}
-
-// ErrRemainingIR is returned for a [IRReadFunc] that failed to call
-// [IRReader.Finalise] before returning.
-var ErrRemainingIR = errors.New("implementation did not consume final value")
-
-// DanglingIdentError is an identifier in a [IRKindIdent] value that was never
-// described in the IR stream before it was encountered.
-type DanglingIdentError unique.Handle[ID]
-
-func (e DanglingIdentError) Error() string {
- return "artifact " + Encode(unique.Handle[ID](e).Value()) +
- " was never described"
-}
-
-type (
- // IRDecoder decodes [Artifact] from an IR stream. The stream is read to
- // EOF and the final [Artifact] is returned. Previous artifacts may be
- // looked up by their identifier.
- //
- // An [Artifact] may appear more than once in the same IR stream. A
- // repeating [Artifact] generates a warning via [Cache] and will appear if
- // verbose logging is enabled. Artifacts may only depend on artifacts
- // previously described in the IR stream.
- //
- // IRDecoder rejects an IR stream on the first decoding error, it does not
- // check against nonzero reserved ancillary data or incorrectly ordered or
- // redundant unstructured dependencies. An invalid IR stream as such will
- // yield [Artifact] values with identifiers disagreeing with those computed
- // by IRDecoder. For this reason, IRDecoder does not access the ident cache
- // to avoid putting [Cache] into an inconsistent state.
- //
- // Methods of IRDecoder are not safe for concurrent use.
- IRDecoder struct {
- // Address of underlying [Cache], must not be exposed directly.
- c *Cache
-
- // Underlying IR reader. Methods of [IRReader] must not use this as it
- // bypasses ident measurement.
- r io.Reader
- // Artifacts already seen in the IR stream.
- ident map[unique.Handle[ID]]Artifact
-
- // Whether Decode returned, and the entire IR stream was decoded.
- done, ok bool
- }
-
- // IRReader provides methods to decode the IR wire format and read values
- // from the reader embedded in the underlying [IRDecoder]. It is
- // deliberately impossible to obtain the [IRValueKind] of the next value,
- // and callers must never recover from panics in any read method.
- //
- // It is the responsibility of the caller to call Finalise after all IR
- // values have been read. Failure to call Finalise causes the resulting
- // [Artifact] to be rejected with [ErrRemainingIR].
- //
- // For an [Artifact] expected to have dependencies, the caller must consume
- // all dependencies by calling Next until all dependencies are depleted, or
- // call DiscardAll to explicitly discard them and rely on values encoded as
- // [IRKindIdent] instead. Failure to consume all unstructured dependencies
- // causes the resulting [Artifact] to be rejected with [MissedDependencyError].
- //
- // Requesting the value of an unstructured dependency not yet described in
- // the IR stream via Next, or reading an [IRKindIdent] value not part of
- // unstructured dependencies via ReadIdent may cause the resulting
- // [Artifact] to be rejected with [DanglingIdentError], however either
- // method may return a non-nil [Artifact] implementation of unspecified
- // value.
- IRReader struct {
- // Address of underlying [IRDecoder], should be zeroed or made unusable
- // after finalisation and must not be exposed directly.
- d *IRDecoder
- // Common buffer for word-sized reads.
- buf [wordSize]byte
-
- // Inputs sent before params, sorted by identifier. Resliced on
- // each call to Next and checked to be depleted during Finalise.
- inputs []*extIdent
-
- // Number of values already read, -1 denotes a finalised IRReader.
- count int
- // Header of value currently being read.
- h irValueHeader
-
- // Measured IR reader. All reads for the current [Artifact] must go
- // through this to produce a correct ident.
- r io.Reader
- // Buffers measure writes. Flushed and returned to d during Finalise.
- ibw *bufio.Writer
- }
-
- // IRReadFunc reads IR values written by [Artifact.Params] to produce an
- // instance of [Artifact] identical to the one to produce these values.
- IRReadFunc func(r *IRReader) Artifact
-)
-
-// kind returns the [IRValueKind] encoded in h.
-func (h irValueHeader) kind() IRValueKind {
- return IRValueKind(h & irHeaderMask)
-}
-
-// value returns ancillary data encoded in h.
-func (h irValueHeader) value() uint32 {
- return uint32(h >> irHeaderShift)
-}
-
-// irArtifact refers to artifact IR interpretation functions and must not be
-// written to directly.
-var irArtifact = make(map[Kind]IRReadFunc)
-
-// InvalidKindError is an unregistered [Kind] value.
-type InvalidKindError Kind
-
-func (e InvalidKindError) Error() string {
- return "invalid artifact kind " + strconv.Itoa(int(e))
-}
-
-// register records the [IRReadFunc] of an implementation of [Artifact] under
-// the specified [Kind]. Expecting to be used only during initialization, it
-// panics if the mapping between [Kind] and [IRReadFunc] is not a bijection.
-//
-// register is not safe for concurrent use. register must not be called after
-// the first instance of [Cache] has been opened.
-func register(k Kind, f IRReadFunc) {
- openMu.Lock()
- defer openMu.Unlock()
-
- if opened {
- panic("attempting to register after open")
- }
- if _, ok := irArtifact[k]; ok {
- panic("attempting to register " + strconv.Itoa(int(k)) + " twice")
- }
- irArtifact[k] = f
-}
-
-// Register records the [IRReadFunc] of a custom implementation of [Artifact]
-// under the specified [Kind]. Expecting to be used only during initialization,
-// it panics if the mapping between [Kind] and [IRReadFunc] is not a bijection,
-// or the specified [Kind] is below [KindCustomOffset].
-//
-// Register is not safe for concurrent use. Register must not be called after
-// the first instance of [Cache] has been opened.
-func Register(k Kind, f IRReadFunc) {
- if k < KindCustomOffset {
- panic("attempting to register within internal kind range")
- }
- register(k, f)
-}
-
-// NewDecoder returns a new [IRDecoder] that reads from the [io.Reader].
-func (c *Cache) NewDecoder(r io.Reader) *IRDecoder {
- return &IRDecoder{c, r, make(map[unique.Handle[ID]]Artifact), false, false}
-}
-
-const (
- // irMaxValues is the arbitrary maximum number of values allowed to be
- // written by [Artifact.Params] and subsequently read via [IRReader].
- irMaxValues = 1 << 12
-
- // irMaxDeps is the arbitrary maximum number of direct dependencies allowed
- // to be returned by [Artifact.Inputs] and subsequently decoded by
- // [IRDecoder].
- irMaxDeps = 1 << 10
-)
-
-var (
- // ErrIRValues is returned for an [Artifact] with too many parameter values.
- ErrIRValues = errors.New("artifact has too many IR parameter values")
-
- // ErrIRDepend is returned for an [Artifact] with too many dependencies.
- ErrIRDepend = errors.New("artifact has too many dependencies")
-
- // ErrAlreadyFinalised is returned when attempting to use an [IRReader] that
- // has already been finalised.
- ErrAlreadyFinalised = errors.New("reader has already finalised")
-)
-
-// enterReader panics with an appropriate error for an out-of-bounds count and
-// must be called at some point in any exported method.
-func (ir *IRReader) enterReader(read bool) {
- if ir.count < 0 {
- panic(ErrAlreadyFinalised)
- }
- if ir.count >= irMaxValues {
- panic(ErrIRValues)
- }
-
- if read {
- ir.count++
- }
-}
-
-// IRKindError describes an attempt to read an IR value of unexpected kind.
-type IRKindError struct {
- Got, Want IRValueKind
- Ancillary uint32
-}
-
-func (e *IRKindError) Error() string {
- return fmt.Sprintf(
- "got %s IR value (%#x) instead of %s",
- e.Got, e.Ancillary, e.Want,
- )
-}
-
-// readFull reads until either p is filled or an error is encountered.
-func (ir *IRReader) readFull(p []byte) (n int, err error) {
- for n < len(p) && err == nil {
- var nn int
- nn, err = ir.r.Read(p[n:])
- n += nn
- }
- return
-}
-
-// mustRead reads from the underlying measured reader and panics on error. If
-// an [io.EOF] is encountered and n != len(p), the error is promoted to a
-// [io.ErrUnexpectedEOF], if n == 0, [io.EOF] is kept as is, otherwise it is
-// zeroed.
-func (ir *IRReader) mustRead(p []byte) {
- n, err := ir.readFull(p)
- if err == nil {
- return
- }
-
- if errors.Is(err, io.EOF) {
- if n == len(p) {
- return
- }
- err = io.ErrUnexpectedEOF
- }
- panic(err)
-}
-
-// mustReadHeader reads the next header via d and checks its kind.
-func (ir *IRReader) mustReadHeader(k IRValueKind) {
- ir.mustRead(ir.buf[:])
- ir.h = irValueHeader(binary.LittleEndian.Uint64(ir.buf[:]))
- if wk := ir.h.kind(); wk != k {
- panic(&IRKindError{wk, k, ir.h.value()})
- }
-}
-
-// putAll returns all dependency buffers to the underlying [Cache].
-func (ir *IRReader) putAll() {
- for _, buf := range ir.inputs {
- ir.d.c.putIdentBuf(buf)
- }
- ir.inputs = nil
-}
-
-// DiscardAll discards all unstructured dependencies. This is useful to
-// implementations that encode dependencies as [IRKindIdent] which are read back
-// via ReadIdent.
-func (ir *IRReader) DiscardAll() {
- if ir.inputs == nil {
- panic("attempting to discard dependencies twice")
- }
- ir.putAll()
-}
-
-// ErrDependencyDepleted is returned when attempting to advance to the next
-// unstructured dependency when there are none left.
-var ErrDependencyDepleted = errors.New("reading past end of dependencies")
-
-// Next returns the next unstructured dependency.
-func (ir *IRReader) Next() Artifact {
- if len(ir.inputs) == 0 {
- panic(ErrDependencyDepleted)
- }
-
- id := unique.Make(ID(ir.inputs[0][wordSize:]))
- ir.d.c.putIdentBuf(ir.inputs[0])
- ir.inputs = ir.inputs[1:]
-
- if a, ok := ir.d.ident[id]; !ok {
- ir.putAll()
- panic(DanglingIdentError(id))
- } else {
- return a
- }
-}
-
-// MissedDependencyError is the number of unstructured dependencies remaining
-// in [IRReader] that was never requested or explicitly discarded before
-// finalisation.
-type MissedDependencyError int
-
-func (e MissedDependencyError) Error() string {
- return "missed " + strconv.Itoa(int(e)) + " unstructured dependencies"
-}
-
-var (
- // ErrUnexpectedChecksum is returned by a [IRReadFunc] that does not expect
- // a checksum but received one in [IRKindEnd] anyway.
- ErrUnexpectedChecksum = errors.New("checksum specified on unsupported artifact")
- // ErrExpectedChecksum is returned by a [IRReadFunc] that expects a checksum
- // but did not receive one in [IRKindEnd].
- ErrExpectedChecksum = errors.New("checksum required but not specified")
-)
-
-// Finalise reads the final [IRKindEnd] value and marks r as finalised. Methods
-// of r are invalid upon entry into Finalise. If a [Checksum] is available via
-// [IREndKnownChecksum], its handle is returned and the caller must store its
-// value in the resulting [Artifact].
-func (ir *IRReader) Finalise() (checksum unique.Handle[Checksum], ok bool) {
- ir.enterReader(true)
- ir.count = -1
-
- ir.mustReadHeader(IRKindEnd)
- f := IREndFlag(ir.h.value())
-
- if f&IREndKnownChecksum != 0 {
- buf := ir.d.c.getIdentBuf()
- defer ir.d.c.putIdentBuf(buf)
-
- ir.mustRead(buf[wordSize:])
- checksum = unique.Make(Checksum(buf[wordSize:]))
- ok = true
- }
-
- if err := ir.ibw.Flush(); err != nil {
- panic(err)
- }
- ir.r, ir.ibw = nil, nil
-
- if len(ir.inputs) != 0 {
- panic(MissedDependencyError(len(ir.inputs)))
- }
-
- return
-}
-
-// ReadIdent reads the next value as [IRKindIdent].
-func (ir *IRReader) ReadIdent() Artifact {
- ir.enterReader(true)
- ir.mustReadHeader(IRKindIdent)
-
- buf := ir.d.c.getIdentBuf()
- defer ir.d.c.putIdentBuf(buf)
-
- ir.mustRead(buf[wordSize:])
- id := unique.Make(ID(buf[wordSize:]))
-
- if a, ok := ir.d.ident[id]; !ok {
- panic(DanglingIdentError(id))
- } else {
- return a
- }
-}
-
-// ReadUint32 reads the next value as [IRKindUint32].
-func (ir *IRReader) ReadUint32() uint32 {
- ir.enterReader(true)
- ir.mustReadHeader(IRKindUint32)
- return ir.h.value()
-}
-
-// ReadStringBytes reads the next value as [IRKindString] but returns it as a
-// byte slice instead.
-func (ir *IRReader) ReadStringBytes() []byte {
- ir.enterReader(true)
- ir.mustReadHeader(IRKindString)
-
- sz := int(ir.h.value())
- szWire := alignSize(sz)
- if szWire > irMaxStringLength {
- panic(IRStringError("\x00"))
- }
-
- p := make([]byte, szWire)
- ir.mustRead(p)
- return p[:sz]
-}
-
-// ReadString reads the next value as [IRKindString].
-func (ir *IRReader) ReadString() string {
- p := ir.ReadStringBytes()
- return unsafe.String(unsafe.SliceData(p), len(p))
-}
-
-// A RevisionError describes the first [Artifact] in an IR stream claiming a
-// revision not supported by the registered implementation.
-type RevisionError [2]uint64
-
-func (e RevisionError) Error() string {
- return "claimed revision " + strconv.FormatUint(e[0], 10) +
- " differs from implementation value " + strconv.FormatUint(e[1], 10)
-}
-
-// decode decodes the next [Artifact] in the IR stream and returns any buffer
-// originating from [Cache] before returning. decode returns [io.EOF] if and
-// only if the underlying [io.Reader] is already read to EOF.
-func (d *IRDecoder) decode() (a Artifact, err error) {
- defer panicToError(&err)
- var ir IRReader
-
- defer func() { ir.d = nil }()
- ir.d = d
-
- h := sha512.New384()
- ir.ibw = d.c.getWriter(h)
- defer d.c.putWriter(ir.ibw)
- ir.r = io.TeeReader(d.r, ir.ibw)
-
- if n, _err := ir.readFull(ir.buf[:]); _err != nil {
- if errors.Is(_err, io.EOF) {
- if n != 0 {
- _err = io.ErrUnexpectedEOF
- }
- }
-
- err = _err
- return
- }
- ak := Kind(binary.LittleEndian.Uint64(ir.buf[:]))
- f, ok := irArtifact[ak]
- if !ok {
- err = InvalidKindError(ak)
- return
- }
-
- ir.mustRead(ir.buf[:])
- rev := binary.LittleEndian.Uint64(ir.buf[:])
-
- defer ir.putAll()
- ir.mustRead(ir.buf[:])
- sz := binary.LittleEndian.Uint64(ir.buf[:])
- if sz > irMaxDeps {
- err = ErrIRDepend
- return
- }
- ir.inputs = make([]*extIdent, sz)
- for i := range ir.inputs {
- ir.inputs[i] = d.c.getIdentBuf()
- }
- for _, buf := range ir.inputs {
- ir.mustRead(buf[:])
- }
-
- a = f(&ir)
- if a == nil {
- err = syscall.ENOTRECOVERABLE
- return
- }
- if _rev := GetRevision(a); _rev != rev {
- err = RevisionError{rev, _rev}
- return
- }
-
- if ir.count != -1 {
- err = ErrRemainingIR
- return
- }
-
- buf := d.c.getIdentBuf()
- h.Sum(buf[wordSize:wordSize])
- id := unique.Make(ID(buf[wordSize:]))
- d.c.putIdentBuf(buf)
- if _, ok = d.ident[id]; !ok {
- d.ident[id] = a
- } else {
- d.c.msg.Verbosef(
- "artifact %s%s%s appeared more than once in IR stream",
- d.c.sgrIdent, Encode(id.Value()), d.c.sgrRes,
- )
- }
-
- return
-}
-
-// Decode consumes the IR stream to EOF and returns the final [Artifact]. After
-// Decode returns, Lookup is available and Decode must not be called again.
-func (d *IRDecoder) Decode() (a Artifact, err error) {
- if d.done {
- panic("attempting to decode an IR stream twice")
- }
- defer func() { d.done = true }()
-
- var cur Artifact
-next:
- a, err = d.decode()
-
- if err == nil {
- cur = a
- goto next
- }
-
- if errors.Is(err, io.EOF) {
- a, err = cur, nil
- d.ok = true
- }
- return
-}
-
-// Lookup looks up an [Artifact] described by the IR stream by its identifier.
-func (d *IRDecoder) Lookup(id unique.Handle[ID]) (a Artifact, ok bool) {
- if !d.ok {
- panic("attempting to look up artifact without full IR stream")
- }
- a, ok = d.ident[id]
- return
-}
diff --git a/internal/pkg/ir_test.go b/internal/pkg/ir_test.go
deleted file mode 100644
index 312474bc..00000000
--- a/internal/pkg/ir_test.go
+++ /dev/null
@@ -1,170 +0,0 @@
-package pkg_test
-
-import (
- "bytes"
- "io"
- "io/fs"
- "reflect"
- "testing"
-
- "hakurei.app/check"
- "hakurei.app/internal/pkg"
-)
-
-func TestIRRoundtrip(t *testing.T) {
- t.Parallel()
-
- testCases := []struct {
- name string
- a pkg.Artifact
- }{
- {"http get aligned", pkg.NewHTTPGet(
- nil, "file:///testdata",
- pkg.Checksum(bytes.Repeat([]byte{0xfd}, len(pkg.Checksum{}))),
- )},
- {"http get unaligned", pkg.NewHTTPGet(
- nil, "https://hakurei.app",
- pkg.Checksum(bytes.Repeat([]byte{0xfc}, len(pkg.Checksum{}))),
- )},
-
- {"http get tar", pkg.NewTar(pkg.NewDecompress(pkg.NewHTTPGet(
- nil, "file:///testdata",
- pkg.Checksum(bytes.Repeat([]byte{0xff}, len(pkg.Checksum{}))),
- ), pkg.Bzip2))},
- {"http get tar unaligned", pkg.NewTar(pkg.NewHTTPGet(
- nil, "https://hakurei.app",
- pkg.Checksum(bytes.Repeat([]byte{0xfe}, len(pkg.Checksum{}))),
- ))},
-
- {"exec offline", pkg.NewExec(
- "exec-offline", "", nil, 0, false, false,
- pkg.AbsWork,
- []string{"HAKUREI_TEST=1"},
- check.MustAbs("/opt/bin/testtool"),
- []string{"testtool"},
-
- pkg.MustPath("/file", false, pkg.NewFile("file", []byte(
- "stub file",
- ))), pkg.MustPath("/.hakurei", false, pkg.NewTar(pkg.NewHTTPGet(
- nil, "file:///hakurei.tar",
- pkg.Checksum(bytes.Repeat([]byte{0xfc}, len(pkg.Checksum{}))),
- ))), pkg.MustPath("/opt", false, pkg.NewTar(pkg.NewDecompress(pkg.NewHTTPGet(
- nil, "file:///testtool.tar.gz",
- pkg.Checksum(bytes.Repeat([]byte{0xfc}, len(pkg.Checksum{}))),
- ), pkg.Gzip))),
- )},
-
- {"exec net", pkg.NewExec(
- "exec-net", "",
- (*pkg.Checksum)(bytes.Repeat([]byte{0xfc}, len(pkg.Checksum{}))),
- 0, false, false,
- pkg.AbsWork,
- []string{"HAKUREI_TEST=1"},
- check.MustAbs("/opt/bin/testtool"),
- []string{"testtool", "net"},
-
- pkg.MustPath("/file", false, pkg.NewFile("file", []byte(
- "stub file",
- ))), pkg.MustPath("/.hakurei", false, pkg.NewTar(pkg.NewHTTPGet(
- nil, "file:///hakurei.tar",
- pkg.Checksum(bytes.Repeat([]byte{0xfc}, len(pkg.Checksum{}))),
- ))), pkg.MustPath("/opt", false, pkg.NewTar(pkg.NewDecompress(pkg.NewHTTPGet(
- nil, "file:///testtool.tar.gz",
- pkg.Checksum(bytes.Repeat([]byte{0xfc}, len(pkg.Checksum{}))),
- ), pkg.Gzip))),
- )},
-
- {"exec measured", pkg.NewExec(
- "exec-measured", "",
- (*pkg.Checksum)(bytes.Repeat([]byte{0xfd}, len(pkg.Checksum{}))),
- 0, false, false,
- pkg.AbsWork,
- []string{"HAKUREI_TEST=1"},
- check.MustAbs("/opt/bin/testtool"),
- []string{"testtool", "measured"},
-
- pkg.MustPath("/file", false, pkg.NewFile("file", []byte(
- "stub file",
- ))), pkg.MustPath("/.hakurei", false, pkg.NewTar(pkg.NewHTTPGet(
- nil, "file:///hakurei.tar",
- pkg.Checksum(bytes.Repeat([]byte{0xfd}, len(pkg.Checksum{}))),
- ))), pkg.MustPath("/opt", false, pkg.NewTar(pkg.NewDecompress(pkg.NewHTTPGet(
- nil, "file:///testtool.tar.gz",
- pkg.Checksum(bytes.Repeat([]byte{0xfd}, len(pkg.Checksum{}))),
- ), pkg.Gzip))),
- )},
-
- {"file anonymous", pkg.NewFile("", []byte{0})},
- {"file", pkg.NewFile("stub", []byte("stub"))},
-
- {"decompress", pkg.NewDecompress(pkg.NewFile("", []byte{0}), pkg.Bzip2)},
-
- {"archive", pkg.NewArchive(pkg.NewFile("", []byte{0}))},
- }
- testCasesCache := make([]cacheTestCase, len(testCases))
- for i, tc := range testCases {
- want := tc.a
- testCasesCache[i] = cacheTestCase{tc.name, 0, nil,
- func(t *testing.T, base *check.Absolute, c *pkg.Cache) {
- r, w := io.Pipe()
-
- done := make(chan error, 1)
- go func() {
- t.Helper()
- done <- c.EncodeAll(w, want)
- _ = w.Close()
- }()
-
- if got, err := c.NewDecoder(r).Decode(); err != nil {
- t.Fatalf("Decode: error = %v", err)
- } else if !reflect.DeepEqual(got, want) {
- t.Fatalf("Decode: %#v, want %#v", got, want)
- }
-
- if err := <-done; err != nil {
- t.Fatalf("EncodeAll: error = %v", err)
- }
- }, expectsFS{
- ".": {Mode: fs.ModeDir | 0700},
- "checksum": {Mode: fs.ModeDir | 0700},
- "identifier": {Mode: fs.ModeDir | 0700},
- "substitute": {Mode: fs.ModeDir | 0700},
- "work": {Mode: fs.ModeDir | 0700},
- },
- }
- }
- checkWithCache(t, testCasesCache)
-}
-
-func TestRevision(t *testing.T) {
- checkWithCache(t, []cacheTestCase{{"revision", 0, nil,
- func(t *testing.T, base *check.Absolute, c *pkg.Cache) {
- a := pkg.NewFile("", nil)
- var buf bytes.Buffer
- if err := c.EncodeAll(&buf, a); err != nil {
- t.Fatal(err)
- }
-
- if _, err := c.NewDecoder(
- bytes.NewReader(buf.Bytes()),
- ).Decode(); err != nil {
- t.Fatalf("Decode: error = %v", err)
- }
-
- p := buf.Bytes()
- p[8] = 0xfd
- wantErr := pkg.RevisionError{0xfd, 0}
- if _, err := c.NewDecoder(
- bytes.NewReader(p),
- ).Decode(); !reflect.DeepEqual(err, wantErr) {
- t.Fatalf("Decode: error = %v, want %v", err, wantErr)
- }
- }, expectsFS{
- ".": {Mode: fs.ModeDir | 0700},
- "checksum": {Mode: fs.ModeDir | 0700},
- "identifier": {Mode: fs.ModeDir | 0700},
- "substitute": {Mode: fs.ModeDir | 0700},
- "work": {Mode: fs.ModeDir | 0700},
- },
- }})
-}
diff --git a/internal/pkg/net.go b/internal/pkg/net.go
deleted file mode 100644
index cd30e3bb..00000000
--- a/internal/pkg/net.go
+++ /dev/null
@@ -1,109 +0,0 @@
-package pkg
-
-import (
- "fmt"
- "io"
- "net/http"
- "path"
- "unique"
-)
-
-// An httpArtifact is an [Artifact] backed by a [http] url string. The method is
-// hardcoded as [http.MethodGet]. Request body is not allowed because it cannot
-// be deterministically represented by Params.
-type httpArtifact struct {
- // Caller-supplied url string.
- url string
-
- // Caller-supplied checksum of the response body. This is validated when
- // closing the [io.ReadCloser] returned by Cure.
- checksum unique.Handle[Checksum]
-
- // client is the address of the caller-supplied [http.Client].
- client *http.Client
-}
-
-var _ KnownChecksum = new(httpArtifact)
-var _ fmt.Stringer = new(httpArtifact)
-
-// NewHTTPGet returns a new [FileArtifact] backed by the supplied client. A GET
-// request is set up for url. If c is nil, [http.DefaultClient] is used instead.
-func NewHTTPGet(
- c *http.Client,
- url string,
- checksum Checksum,
-) FileArtifact {
- return &httpArtifact{url: url, checksum: unique.Make(checksum), client: c}
-}
-
-// Kind returns the hardcoded [Kind] constant.
-func (*httpArtifact) Kind() Kind { return KindHTTPGet }
-
-// Params writes the backing url string. Client is not represented as it does
-// not affect [Cache.Cure] outcome.
-func (a *httpArtifact) Params(ctx *IContext) { ctx.WriteString(a.url) }
-
-func init() {
- register(KindHTTPGet, func(r *IRReader) Artifact {
- url := r.ReadString()
- checksum, ok := r.Finalise()
- if !ok {
- panic(ErrExpectedChecksum)
- }
- return NewHTTPGet(nil, url, checksum.Value())
- })
-}
-
-// Inputs returns a nil slice.
-func (*httpArtifact) Inputs() []Artifact { return nil }
-
-// IsExclusive returns false: Cure returns as soon as a response is received.
-func (*httpArtifact) IsExclusive() bool { return false }
-
-// Checksum returns the caller-supplied checksum.
-func (a *httpArtifact) Checksum() Checksum { return a.checksum.Value() }
-
-// String returns [path.Base] over the backing url.
-func (a *httpArtifact) String() string { return path.Base(a.url) }
-
-// ResponseStatusError is returned for a response returned by an [http.Client]
-// with a status code other than [http.StatusOK].
-type ResponseStatusError int
-
-func (e ResponseStatusError) Error() string {
- return "the requested URL returned non-OK status: " + http.StatusText(int(e))
-}
-
-// IsExecutable returns false.
-func (*httpArtifact) IsExecutable() bool { return false }
-
-// Cure sends the http request and returns the resulting response body reader
-// wrapped to perform checksum validation. It is valid but not encouraged to
-// close the resulting [io.ReadCloser] before it is read to EOF, as that causes
-// Close to block until all remaining data is consumed and validated.
-func (a *httpArtifact) Cure(r *RContext) (rc io.ReadCloser, err error) {
- var req *http.Request
- req, err = http.NewRequestWithContext(r.Unwrap(), http.MethodGet, a.url, nil)
- if err != nil {
- return
- }
- req.Header.Set("User-Agent", "Hakurei/1.1")
-
- c := a.client
- if c == nil {
- c = http.DefaultClient
- }
-
- var resp *http.Response
- if resp, err = c.Do(req); err != nil {
- return
- }
-
- if resp.StatusCode != http.StatusOK {
- _ = resp.Body.Close()
- return nil, ResponseStatusError(resp.StatusCode)
- }
-
- rc = r.NewMeasuredReader(resp.Body, a.checksum)
- return
-}
diff --git a/internal/pkg/net_test.go b/internal/pkg/net_test.go
deleted file mode 100644
index d809d35f..00000000
--- a/internal/pkg/net_test.go
+++ /dev/null
@@ -1,168 +0,0 @@
-package pkg_test
-
-import (
- "crypto/sha512"
- "io"
- "io/fs"
- "net/http"
- "reflect"
- "testing"
- "testing/fstest"
- "unique"
-
- "hakurei.app/check"
- "hakurei.app/internal/pkg"
-)
-
-func TestHTTPGet(t *testing.T) {
- t.Parallel()
-
- const testdata = "\x7f\xe1\x69\xa2\xdd\x63\x96\x26\x83\x79\x61\x8b\xf0\x3f\xd5\x16\x9a\x39\x3a\xdb\xcf\xb1\xbc\x8d\x33\xff\x75\xee\x62\x56\xa9\xf0\x27\xac\x13\x94\x69"
-
- testdataChecksum := func() unique.Handle[pkg.Checksum] {
- h := sha512.New384()
- h.Write([]byte(testdata))
- return unique.Make(pkg.Checksum(h.Sum(nil)))
- }()
-
- var transport http.Transport
- client := http.Client{Transport: &transport}
- transport.RegisterProtocol("file", http.NewFileTransportFS(fstest.MapFS{
- "testdata": {Data: []byte(testdata), Mode: 0400},
- }))
-
- checkWithCache(t, []cacheTestCase{
- {"direct", pkg.CValidateKnown, nil, func(t *testing.T, base *check.Absolute, c *pkg.Cache) {
- r := newRContext(t, c)
- f := pkg.NewHTTPGet(
- &client,
- "file:///testdata",
- testdataChecksum.Value(),
- )
- var got []byte
- if rc, err := f.Cure(r); err != nil {
- t.Fatalf("Cure: error = %v", err)
- } else if got, err = io.ReadAll(rc); err != nil {
- t.Fatalf("ReadAll: error = %v", err)
- } else if string(got) != testdata {
- t.Fatalf("Cure: %x, want %x", got, testdata)
- } else if err = rc.Close(); err != nil {
- t.Fatalf("Close: error = %v", err)
- }
-
- // check direct validation
- f = pkg.NewHTTPGet(
- &client,
- "file:///testdata",
- pkg.Checksum{},
- )
- wantErrMismatch := &pkg.ChecksumMismatchError{
- Got: testdataChecksum.Value(),
- }
- if rc, err := f.Cure(r); err != nil {
- t.Fatalf("Cure: error = %v", err)
- } else if got, err = io.ReadAll(rc); err != nil {
- t.Fatalf("ReadAll: error = %v", err)
- } else if string(got) != testdata {
- t.Fatalf("Cure: %x, want %x", got, testdata)
- } else if err = rc.Close(); !reflect.DeepEqual(err, wantErrMismatch) {
- t.Fatalf("Close: error = %#v, want %#v", err, wantErrMismatch)
- }
-
- // check fallback validation
- if rc, err := f.Cure(r); err != nil {
- t.Fatalf("Cure: error = %v", err)
- } else if err = rc.Close(); !reflect.DeepEqual(err, wantErrMismatch) {
- t.Fatalf("Close: error = %#v, want %#v", err, wantErrMismatch)
- }
-
- // check direct response error
- f = pkg.NewHTTPGet(
- &client,
- "file:///nonexistent",
- pkg.Checksum{},
- )
- wantErrNotFound := pkg.ResponseStatusError(http.StatusNotFound)
- if _, err := f.Cure(r); !reflect.DeepEqual(err, wantErrNotFound) {
- t.Fatalf("Cure: error = %#v, want %#v", err, wantErrNotFound)
- }
- }, expectsFS{
- ".": {Mode: fs.ModeDir | 0700},
- "checksum": {Mode: fs.ModeDir | 0700},
- "identifier": {Mode: fs.ModeDir | 0700},
- "substitute": {Mode: fs.ModeDir | 0700},
- "work": {Mode: fs.ModeDir | 0700},
- }},
-
- {"cure", pkg.CValidateKnown, nil, func(t *testing.T, base *check.Absolute, c *pkg.Cache) {
- r := newRContext(t, c)
-
- f := pkg.NewHTTPGet(
- &client,
- "file:///testdata",
- testdataChecksum.Value(),
- )
- wantPathname := base.Append(
- "identifier",
- "COBRUwkxpIvZWJggpRxn7HVXiw6epXZOex8jGRJKpowpwukV7GRBY_LBvOJNQHue",
- )
- if pathname, checksum, err := c.Cure(f); err != nil {
- t.Fatalf("Cure: error = %v", err)
- } else if !pathname.Is(wantPathname) {
- t.Fatalf("Cure: %q, want %q", pathname, wantPathname)
- } else if checksum != testdataChecksum {
- t.Fatalf("Cure: %x, want %x", checksum.Value(), testdataChecksum.Value())
- }
-
- var got []byte
- if rc, err := f.Cure(r); err != nil {
- t.Fatalf("Cure: error = %v", err)
- } else if got, err = io.ReadAll(rc); err != nil {
- t.Fatalf("ReadAll: error = %v", err)
- } else if string(got) != testdata {
- t.Fatalf("Cure: %x, want %x", got, testdata)
- } else if err = rc.Close(); err != nil {
- t.Fatalf("Close: error = %v", err)
- }
-
- // check load from cache
- f = pkg.NewHTTPGet(
- &client,
- "file:///testdata",
- testdataChecksum.Value(),
- )
- if rc, err := f.Cure(r); err != nil {
- t.Fatalf("Cure: error = %v", err)
- } else if got, err = io.ReadAll(rc); err != nil {
- t.Fatalf("ReadAll: error = %v", err)
- } else if string(got) != testdata {
- t.Fatalf("Cure: %x, want %x", got, testdata)
- } else if err = rc.Close(); err != nil {
- t.Fatalf("Close: error = %v", err)
- }
-
- // check error passthrough
- f = pkg.NewHTTPGet(
- &client,
- "file:///nonexistent",
- pkg.Checksum{},
- )
- wantErrNotFound := pkg.ResponseStatusError(http.StatusNotFound)
- if _, _, err := c.Cure(f); !reflect.DeepEqual(err, wantErrNotFound) {
- t.Fatalf("Pathname: error = %#v, want %#v", err, wantErrNotFound)
- }
- }, expectsFS{
- ".": {Mode: fs.ModeDir | 0700},
-
- "checksum": {Mode: fs.ModeDir | 0700},
- "checksum/fLYGIMHgN1louE-JzITJZJo2SDniPu-IHBXubtvQWFO-hXnDVKNuscV7-zlyr5fU": {Mode: 0400, Data: []byte("\x7f\xe1\x69\xa2\xdd\x63\x96\x26\x83\x79\x61\x8b\xf0\x3f\xd5\x16\x9a\x39\x3a\xdb\xcf\xb1\xbc\x8d\x33\xff\x75\xee\x62\x56\xa9\xf0\x27\xac\x13\x94\x69")},
-
- "identifier": {Mode: fs.ModeDir | 0700},
- "identifier/COBRUwkxpIvZWJggpRxn7HVXiw6epXZOex8jGRJKpowpwukV7GRBY_LBvOJNQHue": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/fLYGIMHgN1louE-JzITJZJo2SDniPu-IHBXubtvQWFO-hXnDVKNuscV7-zlyr5fU")},
-
- "substitute": {Mode: fs.ModeDir | 0700},
-
- "work": {Mode: fs.ModeDir | 0700},
- }},
- })
-}
diff --git a/internal/pkg/pkg.go b/internal/pkg/pkg.go
deleted file mode 100644
index 268d0248..00000000
--- a/internal/pkg/pkg.go
+++ /dev/null
@@ -1,2947 +0,0 @@
-// Package pkg provides utilities for packaging software.
-package pkg
-
-import (
- "bufio"
- "bytes"
- "cmp"
- "context"
- "crypto/rand"
- "crypto/sha512"
- "encoding/base64"
- "encoding/binary"
- "errors"
- "fmt"
- "hash"
- "io"
- "io/fs"
- "iter"
- "maps"
- "math"
- "os"
- "path/filepath"
- "runtime"
- "slices"
- "strconv"
- "strings"
- "sync"
- "sync/atomic"
- "syscall"
- "testing"
- "time"
- "unique"
- "unsafe"
-
- "hakurei.app/check"
- "hakurei.app/internal/info"
- "hakurei.app/internal/lockedfile"
- "hakurei.app/message"
-)
-
-const (
- // programName is the string identifying this build system.
- programName = "internal/pkg"
-)
-
-type (
- // A Checksum is a SHA-384 checksum computed for a cured [Artifact].
- Checksum = [sha512.Size384]byte
-
- // An ID is a unique identifier returned by [KnownIdent.ID]. This value must
- // be deterministically determined ahead of time.
- ID Checksum
-)
-
-// Encode is abbreviation for base64.URLEncoding.EncodeToString(checksum[:]).
-func Encode(checksum Checksum) string {
- return base64.URLEncoding.EncodeToString(checksum[:])
-}
-
-// Decode is abbreviation for base64.URLEncoding.Decode(checksum[:], []byte(s)).
-func Decode(buf *Checksum, s string) (err error) {
- var n int
- n, err = base64.URLEncoding.Decode(buf[:], []byte(s))
- if err == nil && n != len(buf) {
- err = io.ErrUnexpectedEOF
- }
- return
-}
-
-// MustDecode decodes a string representation of [Checksum] and panics if there
-// is a decoding error or the resulting data is too short.
-func MustDecode(s string) (checksum Checksum) {
- if err := Decode(&checksum, s); err != nil {
- panic(err)
- }
- return
-}
-
-var (
- // extension is a string uniquely identifying a set of custom [Artifact]
- // implementations registered by calling [Register].
- extension string
-
- // openMu synchronises access to global state for initialisation.
- openMu sync.Mutex
- // opened is false if [Open] was never called.
- opened bool
-)
-
-// Extension returns a string uniquely identifying the currently registered set
-// of custom [Artifact], or the zero value if none was registered.
-func Extension() string { return extension }
-
-// ValidExtension returns whether s is valid for use in a call to SetExtension.
-func ValidExtension(s string) bool {
- if l := len(s); l == 0 || l > 128 {
- return false
- }
- for _, v := range s {
- if v < 'a' || v > 'z' {
- return false
- }
- }
- return true
-}
-
-// ErrInvalidExtension is returned for a variant identification string for which
-// [ValidExtension] returns false.
-var ErrInvalidExtension = errors.New("invalid extension variant identification string")
-
-// SetExtension sets the extension variant identification string. SetExtension
-// must be called before [Open] if custom [Artifact] implementations had been
-// recorded by calling [Register].
-//
-// The variant identification string must be between 1 and 128 bytes long and
-// consists of only bytes between 'a' and 'z'.
-//
-// SetExtension is not safe for concurrent use. SetExtension is called at most
-// once and must not be called after the first instance of Cache has been opened.
-func SetExtension(s string) {
- openMu.Lock()
- defer openMu.Unlock()
-
- if opened {
- panic("attempting to set extension after open")
- }
- if extension != "" {
- panic("attempting to set extension twice")
- }
- if !ValidExtension(s) {
- panic(ErrInvalidExtension)
- }
- extension = s
- statusHeader = makeStatusHeader(s)
-}
-
-// common holds elements and receives methods shared between different contexts.
-type common struct {
- // Context specific to this [Artifact]. The toplevel context in [Cache] must
- // not be exposed directly.
- ctx context.Context
-
- // Address of underlying [Cache], should be zeroed or made unusable after
- // Cure returns and must not be exposed directly.
- cache *Cache
-}
-
-// TContext is passed to [TrivialArtifact.Cure] and provides information and
-// methods required for curing the [TrivialArtifact].
-//
-// Methods of TContext are safe for concurrent use. TContext is valid
-// until [TrivialArtifact.Cure] returns.
-type TContext struct {
- // Populated during [Cache.Cure].
- work, temp *check.Absolute
-
- // Target [Artifact] encoded identifier.
- ids string
- // Pathname status was created at.
- statusPath, statusSPath *check.Absolute
- // File statusHeader and logs are written to.
- status *os.File
- // Error value during prepareStatus.
- statusErr error
-
- common
-}
-
-// makeStatusHeader creates the header written to every status file. This should
-// not be called directly, its result is stored in statusHeader and will not
-// change after the first [Cache] is opened.
-func makeStatusHeader(extension string) string {
- s := programName
- if v := info.Version(); v != info.FallbackVersion {
- s += " " + v
- }
- if extension != "" {
- s += " with " + extension + " extensions"
- }
- s += " (" + runtime.GOARCH + ")"
- if name, err := os.Hostname(); err == nil {
- s += " on " + name
- }
- s += "\n\n"
- return s
-}
-
-// statusHeader is the header written to all status files in dirStatus.
-var statusHeader = makeStatusHeader("")
-
-// prepareStatus initialises the status file once.
-func (t *TContext) prepareStatus(writeHeader bool) error {
- if t.statusPath != nil || t.status != nil {
- return t.statusErr
- }
-
- t.statusPath = t.cache.base.Append(
- dirStatus,
- t.ids,
- )
- if t.status, t.statusErr = os.OpenFile(
- t.statusPath.String(),
- syscall.O_CREAT|syscall.O_EXCL|syscall.O_WRONLY,
- 0400,
- ); t.statusErr != nil {
- return t.statusErr
- }
-
- if writeHeader {
- _, t.statusErr = t.status.WriteString(statusHeader)
- }
- return t.statusErr
-}
-
-// GetStatusWriter returns a [io.Writer] for build logs. The caller must not
-// seek this writer before the position it was first returned in.
-func (t *TContext) GetStatusWriter() (io.Writer, error) {
- err := t.prepareStatus(true)
- return t.status, err
-}
-
-// destroy destroys the temporary directory and joins its errors with the error
-// referred to by errP. If the error referred to by errP is non-nil, the work
-// directory is removed similarly. [Cache] is responsible for making sure work
-// is never left behind for a successful [Cache.Cure].
-//
-// If implementation had requested status, it is closed with error joined with
-// the error referred to by errP. If the error referred to by errP is non-nil,
-// the status file is removed from the filesystem.
-//
-// destroy must be deferred by [Cache.Cure] if [TContext] is passed to any Cure
-// implementation. It should not be called prior to that point.
-func (t *TContext) destroy(errP *error) {
- if chmodErr, removeErr := removeAll(t.temp); chmodErr != nil || removeErr != nil {
- *errP = errors.Join(*errP, chmodErr, removeErr)
- }
-
- if *errP != nil {
- chmodErr, removeErr := removeAll(t.work)
- if chmodErr != nil || removeErr != nil {
- *errP = errors.Join(*errP, chmodErr, removeErr)
- } else if errors.Is(*errP, os.ErrExist) {
- if linkError, ok := errors.AsType[*os.LinkError](*errP); ok &&
- linkError != nil &&
- linkError.Op == "rename" {
- // two artifacts may be backed by the same file
- *errP = nil
- }
- }
- }
-
- if t.status != nil {
- if err := t.status.Close(); err != nil {
- *errP = errors.Join(*errP, err)
- }
- if *errP != nil {
- *errP = errors.Join(*errP, os.Rename(
- t.statusPath.String(), t.cache.base.Append(
- dirFault,
- t.ids+"."+strconv.FormatUint(uint64(
- time.Now().UnixNano(),
- ), 10),
- ).String(),
- ))
- if t.statusSPath != nil {
- t.cache.checksumMu.Lock()
- *errP = errors.Join(*errP, os.Remove(t.statusSPath.String()))
- t.cache.checksumMu.Unlock()
- }
- }
- t.status = nil
- }
-}
-
-// Unwrap returns the underlying [context.Context].
-func (c *common) Unwrap() context.Context { return c.ctx }
-
-// GetMessage returns [message.Msg] held by the underlying [Cache].
-func (c *common) GetMessage() message.Msg { return c.cache.msg }
-
-// GetJobs returns the preferred number of jobs to run, when applicable. Its
-// value must not affect cure outcome.
-func (c *common) GetJobs() int { return c.cache.attr.Jobs }
-
-// GetLoad returns the preferred load average target, when applicable. Its
-// value must not affect cure outcome.
-func (c *common) GetLoad() int { return c.cache.attr.Load }
-
-// GetWorkDir returns a pathname to a directory which [Artifact] is expected to
-// write its output to. This is not the final resting place of the [Artifact]
-// and this pathname should not be directly referred to in the final contents.
-func (t *TContext) GetWorkDir() *check.Absolute { return t.work }
-
-// GetTempDir returns a pathname which implementations may use as scratch space.
-// A directory is not created automatically, implementations are expected to
-// create it if they wish to use it, using [os.MkdirAll].
-func (t *TContext) GetTempDir() *check.Absolute { return t.temp }
-
-// Open tries to open [Artifact] for reading. If a implements [FileArtifact],
-// its reader might be used directly, eliminating the roundtrip to vfs.
-// Otherwise, it must cure into a directory containing a single regular file.
-//
-// If err is nil, the caller must close the resulting [io.ReadCloser] and return
-// its error, if any. Failure to read r to EOF may result in a spurious
-// [ChecksumMismatchError], or the underlying implementation may block on Close.
-func (c *common) Open(a Artifact) (r io.ReadCloser, err error) {
- if f, ok := a.(FileArtifact); ok {
- return c.cache.openFile(c.ctx, f)
- }
-
- var pathname *check.Absolute
- if pathname, _, _, err = c.cache.cure(a, true, false); err != nil {
- return
- }
-
- var entries []os.DirEntry
- if entries, err = os.ReadDir(pathname.String()); err != nil {
- return
- }
-
- if len(entries) != 1 || !entries[0].Type().IsRegular() {
- err = errors.New(
- "input directory does not contain a single regular file",
- )
- return
- } else {
- return os.Open(pathname.Append(entries[0].Name()).String())
- }
-}
-
-// FContext is passed to [FloodArtifact.Cure] and provides information and
-// methods required for curing the [FloodArtifact].
-//
-// Methods of FContext are safe for concurrent use. FContext is valid
-// until [FloodArtifact.Cure] returns.
-type FContext struct {
- TContext
-
- // Cured top-level inputs looked up by Pathname.
- inputs map[Artifact]cureRes
-}
-
-// linkSubstitute links status for substitute if populated.
-func (f *FContext) linkSubstitute(ids, substitutes string) (err error) {
- if f.status == nil || ids == substitutes {
- return
- }
-
- statusS := f.cache.base.Append(
- dirStatus,
- substitutes,
- )
- f.cache.checksumMu.Lock()
- err = os.Link(f.cache.base.Append(
- dirStatus,
- ids,
- ).String(), statusS.String())
- f.cache.checksumMu.Unlock()
- if err == nil {
- f.statusSPath = statusS
- }
- return
-}
-
-// InvalidLookupError is the identifier of non-input [Artifact] looked up
-// via [FContext.GetArtifact] by a misbehaving [Artifact] implementation.
-type InvalidLookupError ID
-
-func (e InvalidLookupError) Error() string {
- return "attempting to look up non-input artifact " + Encode(e)
-}
-
-var _ error = InvalidLookupError{}
-
-// GetArtifact returns the identifier pathname and checksum of an [Artifact].
-// Calling Pathname with an [Artifact] not part of the slice returned by
-// [Artifact.Inputs] panics.
-func (f *FContext) GetArtifact(a Artifact) (
- pathname *check.Absolute,
- checksum unique.Handle[Checksum],
-) {
- if res, ok := f.inputs[a]; ok {
- return res.pathname, res.checksum
- }
- panic(InvalidLookupError(f.cache.Ident(a).Value()))
-}
-
-// RContext is passed to [FileArtifact.Cure] and provides helper methods useful
-// for curing the [FileArtifact].
-//
-// Methods of RContext are safe for concurrent use. RContext is valid
-// until [FileArtifact.Cure] returns.
-type RContext struct{ common }
-
-// An Artifact is a read-only reference to a piece of data that may be created
-// deterministically but might not currently be available in memory or on the
-// filesystem.
-type Artifact interface {
- // Kind returns the [Kind] of artifact. This is usually unique to the
- // concrete type but two functionally identical implementations of
- // [Artifact] is allowed to return the same [Kind] value.
- Kind() Kind
-
- // Params writes deterministic values describing [Artifact]. Implementations
- // must guarantee that these values are unique among differing instances
- // of the same implementation with identical dependencies and conveys enough
- // information to create another instance of [Artifact] identical to the
- // instance emitting these values. The new instance created via [IRReadFunc]
- // from these values must then produce identical IR values.
- //
- // Result must remain identical across multiple invocations.
- Params(ctx *IContext)
-
- // Inputs returns a slice of [Artifact] the current instance has access to
- // while producing its output.
- //
- // Callers must not modify the retuned slice.
- //
- // Result must remain identical across multiple invocations.
- Inputs() []Artifact
-
- // IsExclusive returns whether the [Artifact] is exclusive. Exclusive
- // artifacts might not run in parallel with each other, and are still
- // subject to the cures limit.
- //
- // Some implementations may saturate the CPU for a nontrivial amount of
- // time. Curing multiple such implementations simultaneously causes
- // significant CPU scheduler overhead. An exclusive artifact will generally
- // not be cured alongside another exclusive artifact, thus alleviating this
- // overhead.
- //
- // Note that [Cache] reserves the right to still cure exclusive
- // artifacts concurrently as this is not a synchronisation primitive but
- // an optimisation one. Implementations are forbidden from accessing global
- // state regardless of exclusivity.
- //
- // Result must remain identical across multiple invocations.
- IsExclusive() bool
-}
-
-// FloodArtifact refers to an [Artifact] requiring its entire dependency graph
-// to be cured prior to curing itself.
-type FloodArtifact interface {
- // Cure cures the current [Artifact] to the working directory obtained via
- // [TContext.GetWorkDir] embedded in [FContext].
- //
- // Implementations must not retain c.
- Cure(f *FContext) (err error)
-
- Artifact
-}
-
-// TrivialArtifact refers to an [Artifact] that cures without requiring that
-// any other [Artifact] is cured before it. Its dependency tree is ignored after
-// computing its identifier.
-//
-// TrivialArtifact is unable to cure any other [Artifact] and it cannot access
-// pathnames. This type of [Artifact] is primarily intended for dependency-less
-// artifacts or direct dependencies that only consists of [FileArtifact].
-type TrivialArtifact interface {
- // Cure cures the current [Artifact] to the working directory obtained via
- // [TContext.GetWorkDir].
- //
- // Implementations must not retain c.
- Cure(t *TContext) (err error)
-
- Artifact
-}
-
-// KnownIdent is optionally implemented by [Artifact] and is used instead of
-// [Cache.Ident] when it is available.
-//
-// This is very subtle to use correctly. The implementation must ensure that
-// this value is globally unique, otherwise [Cache] can enter an inconsistent
-// state. This should not be implemented outside of testing.
-type KnownIdent interface {
- // ID returns a globally unique identifier referring to the current
- // [Artifact]. This value must be known ahead of time and guaranteed to be
- // unique without having obtained the full contents of the [Artifact].
- ID() ID
-
- Artifact
-}
-
-// KnownChecksum is optionally implemented by [Artifact] for an artifact with
-// output known ahead of time.
-type KnownChecksum interface {
- // Checksum returns the address of a known checksum.
- //
- // Callers must not modify the [Checksum].
- //
- // Result must remain identical across multiple invocations.
- Checksum() Checksum
-
- Artifact
-}
-
-// CuresExempt is optionally implemented for an artifact exempt to the
-// cache-wide cures counter and limit.
-type CuresExempt interface {
- Artifact
-
- // CuresExempt is a no-op function but serves to distinguish implementations
- // that are cures-exempt.
- CuresExempt()
-}
-
-// FileArtifact refers to an [Artifact] backed by a single file.
-//
-// FileArtifact does not support fine-grained cancellation. Its context is
-// inherited from the first [TrivialArtifact] or [FloodArtifact] that opens it.
-type FileArtifact interface {
- // IsExecutable returns whether the resulting filesystem entry should be made
- // executable, if the [FileArtifact] is cured to the on-disk cache.
- //
- // Result must remain identical across multiple invocations.
- IsExecutable() bool
-
- // Cure returns [io.ReadCloser] of the full contents of [FileArtifact]. If
- // [FileArtifact] implements [KnownChecksum], Cure is responsible for
- // validating any data it produces and must return [ChecksumMismatchError]
- // if validation fails. This error is conventionally returned during the
- // first call to Close, but may be returned during any call to Read before
- // EOF, or by Cure itself.
- //
- // Callers are responsible for closing the resulting [io.ReadCloser].
- //
- // The resulting [io.ReadCloser] across multiple invocations must have
- // identical behaviour.
- Cure(r *RContext) (io.ReadCloser, error)
-
- Artifact
-}
-
-// RevisionArtifact is optionally implemented by an artifact that had undergone
-// internal changes affecting its behaviour while retaining its IR structure.
-type RevisionArtifact interface {
- // Revision returns the revision number of [Artifact]. This value is always
- // represented in the IR. An IR stream produced from the same [Kind] with
- // differing revision is rejected.
- //
- // Result must remain identical across multiple invocations.
- Revision() uint64
-
- Artifact
-}
-
-// GetRevision returns the revision number of an [Artifact].
-func GetRevision(a Artifact) (revision uint64) {
- revision = math.MaxUint64
- if r, ok := a.(RevisionArtifact); ok {
- revision = r.Revision()
- }
- return
-}
-
-// reportName returns a string describing [Artifact] presented to the user.
-func reportName(a Artifact, id unique.Handle[ID]) string {
- r := Encode(id.Value())
- if s, ok := a.(fmt.Stringer); ok {
- if name := s.String(); name != "" {
- r += "-" + name
- }
- }
- return r
-}
-
-// Kind corresponds to the concrete type of [Artifact] and is used to create
-// identifier for an [Artifact] with dependencies.
-type Kind uint64
-
-const (
- // KindHTTPGet is the kind of [Artifact] returned by [NewHTTPGet].
- KindHTTPGet Kind = iota
- // KindTar is the kind of [Artifact] returned by [NewTar].
- KindTar
- // KindExec is the kind of [Artifact] returned by [NewExec].
- KindExec
- // KindExecNet is the kind of [Artifact] returned by [NewExec] but with a
- // non-nil checksum.
- KindExecNet
- // KindFile is the kind of [Artifact] returned by [NewFile].
- KindFile
- // KindDecompress is the kind of [Artifact] returned by [NewDecompress].
- KindDecompress
- // KindArchive is the kind of [Artifact] returned by [NewArchive].
- KindArchive
-
- // _kindEnd is the total number of kinds and does not denote a kind.
- _kindEnd
-
- // KindCustomOffset is the first [Kind] value reserved for implementations
- // not from this package.
- KindCustomOffset = 1 << 31
-)
-
-const (
- // kindCollection is the kind of [Collect]. It never cures successfully.
- kindCollection Kind = KindCustomOffset - 1 - iota
-)
-
-const (
- // fileLock is the lock file for exclusive access to the cache directory.
- fileLock = "lock"
- // fileVariant is a file holding the variant identification string set by a
- // prior call to [SetExtension].
- fileVariant = "variant"
-
- // dirSubstitute holds symlinks to artifacts by checksum, named after their
- // substitute identifier.
- dirSubstitute = "substitute"
- // dirIdentifier holds symlinks to artifacts by checksum, named after their
- // IR-based identifier.
- dirIdentifier = "identifier"
- // dirChecksum holds artifacts named after their [Checksum].
- dirChecksum = "checksum"
- // dirStatus holds artifact metadata and logs named after their IR-based
- // identifier. For [FloodArtifact], the same file is also available under
- // its substitute identifier.
- dirStatus = "status"
- // dirFault holds status files of faulted cures.
- dirFault = "fault"
-
- // dirWork holds working pathnames set up during [Cache.Cure].
- dirWork = "work"
- // dirTemp holds scratch space allocated during [Cache.Cure].
- dirTemp = "temp"
-
- // dirExecScratch is scratch space set up for the container started by
- // [Cache.EnterExec]. Exclusivity via Cache.inExec.
- dirExecScratch = "scratch"
-
- // checksumLinknamePrefix is prepended to the encoded [Checksum] value
- // of an [Artifact] when creating a symbolic link to dirChecksum.
- checksumLinknamePrefix = "../" + dirChecksum + "/"
-)
-
-// cureRes are the non-error results returned by [Cache.Cure].
-type cureRes struct {
- pathname *check.Absolute
- checksum unique.Handle[Checksum]
-}
-
-// A pendingArtifactDep is an input [Artifact] pending concurrent curing,
-// subject to the cures limit. Values pointed to by result addresses are safe
-// to access after the [sync.WaitGroup] associated with this pendingArtifactDep
-// is done. pendingArtifactDep must not be reused or modified after it is sent
-// to cure.
-type pendingArtifactDep struct {
- // Dependency artifact populated during [Cache.Cure].
- a Artifact
-
- // Address of result pathname populated during [Cache.Cure] and dereferenced
- // if curing succeeds.
- resP *cureRes
-
- // Address of result error map populated during [Cache.Cure], dereferenced
- // after acquiring errsMu if curing fails. No additional action is taken,
- // [Cache] and its caller are responsible for further error handling.
- errs InputError
- // Address of mutex synchronising access to errs.
- errsMu *sync.Mutex
-
- // For synchronising access to result buffer.
- *sync.WaitGroup
-}
-
-const (
- // CValidateKnown arranges for [KnownChecksum] outcomes to be validated to
- // match its intended checksum.
- //
- // A correct implementation of [KnownChecksum] does not successfully cure
- // with output not matching its intended checksum. When an implementation
- // fails to perform this validation correctly, the on-disk format enters
- // an inconsistent state (correctable by [Cache.Scrub]).
- //
- // This flag causes [Cache.Cure] to always compute the checksum, and reject
- // a cure if it does not match the intended checksum.
- //
- // This behaviour significantly reduces performance and is not recommended
- // outside of testing a custom [Artifact] implementation.
- CValidateKnown = 1 << iota
-
- // CSchedIdle arranges for the [ext.SCHED_IDLE] scheduling priority to be
- // set for [KindExec] and [KindExecNet] containers.
- CSchedIdle
-
- // CAssumeChecksum enables the use of [KnownChecksum] for duplicate function
- // call suppression via the on-disk cache.
- //
- // This may cause incorrect cure outcome if an impossible checksum is
- // specified that matches an output already present in the on-disk cache.
- // This may be avoided by purposefully specifying a statistically
- // unattainable checksum, like the zero value.
- //
- // While this optimisation might seem appealing, it is almost never
- // applicable in real world use. Almost every time this path was taken, it
- // was caused by an incorrect checksum accidentally left behind while
- // bumping a package. Only enable this if you are really sure you need it.
- CAssumeChecksum
-
- // CHostAbstract disables restriction of sandboxed processes from connecting
- // to an abstract UNIX socket created by a host process.
- //
- // This is considered less secure in some systems, but does not introduce
- // impurity due to [KindExecNet] being [KnownChecksum]. This flag exists
- // to support kernels without Landlock LSM enabled.
- CHostAbstract
-
- // CPromoteVariant allows [pkg.Open] to promote an unextended on-disk cache
- // to the current extension variant. This is a one-way operation.
- CPromoteVariant
-
- // CSuppressInit arranges for verbose output of the container init to be
- // suppressed regardless of [message.Msg] state.
- CSuppressInit
-
- // CIgnoreSubstitutes disables content-based input substitution.
- CIgnoreSubstitutes
-
- // CExternShallow arranges for only non-flood inputs to be fetched when
- // curing an [Artifact] available via the external cache.
- CExternShallow
-
- // CColourOutput enables output colouring via ANSI control sequences.
- CColourOutput
-)
-
-// toplevel holds [context.WithCancel] over caller-supplied context, where all
-// [Artifact] context are derived from.
-type toplevel struct {
- ctx context.Context
- cancel context.CancelFunc
-}
-
-// newToplevel returns the address of a new toplevel via ctx.
-func newToplevel(ctx context.Context) *toplevel {
- var t toplevel
- t.ctx, t.cancel = context.WithCancel(ctx)
- return &t
-}
-
-// pendingCure provides synchronisation and cancellation for pending cures.
-type pendingCure struct {
- // Closed on cure completion.
- done <-chan struct{}
- // Error outcome, safe to access after done is closed.
- err error
- // Cancels the corresponding cure.
- cancel context.CancelFunc
-}
-
-// An External cache provides prepared [Artifact] cure outcomes.
-type External interface {
- // Artifact returns the address of the [Checksum] of the cure outcome of
- // an [Artifact] corresponding to id, or nil if this [Artifact] is not
- // available in the external cache.
- Artifact(ctx context.Context, id unique.Handle[ID]) (*Checksum, error)
- // Checksum returns an [Artifact] producing the specified checksum.
- Checksum(checksum unique.Handle[Checksum]) Artifact
- // Status returns [io.ReadCloser] of the status file of an [Artifact]
- // corresponding to id, or nil if this [Artifact] is not available or a
- // status file is not present.
- Status(r *RContext, id unique.Handle[ID]) (io.ReadCloser, error)
-}
-
-// Cache is a support layer that implementations of [Artifact] can use to store
-// cured [Artifact] data in a content addressed fashion.
-type Cache struct {
- // Cures of any variant of [Artifact] sends to cures before entering the
- // implementation and receives an equal amount of elements after.
- cures chan struct{}
-
- // Parent context which toplevel was derived from.
- parent context.Context
- // For deriving curing context, must not be accessed directly.
- toplevel atomic.Pointer[toplevel]
- // For waiting on input curing goroutines.
- wg sync.WaitGroup
- // Reports new cures and passed to [Artifact].
- msg message.Msg
- // Select graphics rendition sequences, populated by Open.
- sgrRes, sgrIdent, sgrWarn, sgrErr string
-
- // Directory where all [Cache] related files are placed.
- base *check.Absolute
- // Immutable [CacheAttr] populated by [Open].
- attr CacheAttr
-
- // Must not be exposed directly.
- irCache
-
- // Synchronises access to dirChecksum.
- checksumMu sync.RWMutex
-
- // Presence of an alternative in the cache. Keys are not valid identifiers
- // and must not be used as such.
- substitute map[unique.Handle[ID]]unique.Handle[Checksum]
- // Synchronises access to substitute and corresponding filesystem entries.
- substituteMu sync.RWMutex
- // Identifier to content pair cache.
- ident map[unique.Handle[ID]]unique.Handle[Checksum]
- // Identifier to error pair for unrecoverably faulted [Artifact].
- identErr map[unique.Handle[ID]]error
- // Pending identifiers, accessed through Cure for entries not in ident.
- identPending map[unique.Handle[ID]]*pendingCure
- // Synchronises access to ident and corresponding filesystem entries.
- identMu sync.RWMutex
- // Synchronises entry into Abort and Cure.
- abortMu sync.RWMutex
-
- // Synchronises entry into exclusive artifacts for the cure method.
- exclMu sync.Mutex
- // Buffered I/O free list, must not be accessed directly.
- brPool, bwPool sync.Pool
-
- // Optional external cache implementation.
- extern External
- // Caches responses from extern.
- externCache map[unique.Handle[ID]]unique.Handle[Checksum]
- // Synchronises access to extern.
- externMu sync.RWMutex
-
- // Unlocks the on-filesystem cache. Must only be called from Close.
- unlock func()
- // Whether [Cache] is considered closed.
- closed bool
- // Synchronises calls to Abort and Close.
- closeMu sync.Mutex
-
- // Whether EnterExec has not yet returned.
- inExec atomic.Bool
-}
-
-// extIdent is a [Kind] concatenated with [ID].
-type extIdent [wordSize + len(ID{})]byte
-
-// getIdentBuf returns the address of an extIdent for Ident.
-func (ic *irCache) getIdentBuf() *extIdent { return ic.identPool.Get().(*extIdent) }
-
-// putIdentBuf adds buf to identPool.
-func (ic *irCache) putIdentBuf(buf *extIdent) { ic.identPool.Put(buf) }
-
-// storeIdent adds an [Artifact] to the artifact cache.
-func (ic *irCache) storeIdent(a Artifact, buf *extIdent) unique.Handle[ID] {
- idu := unique.Make(ID(buf[wordSize:]))
- ic.artifact.Store(a, idu)
- return idu
-}
-
-// Ident returns the identifier of an [Artifact].
-func (ic *irCache) Ident(a Artifact) unique.Handle[ID] {
- buf, idu := ic.unsafeIdent(a, false)
- if buf != nil {
- idu = ic.storeIdent(a, buf)
- ic.putIdentBuf(buf)
- }
- return idu
-}
-
-// unsafeIdent implements Ident but returns the underlying buffer for a newly
-// computed identifier. Callers must return this buffer to identPool. encodeKind
-// is only a hint, kind may still be encoded in the buffer.
-func (ic *irCache) unsafeIdent(a Artifact, encodeKind bool) (
- buf *extIdent,
- idu unique.Handle[ID],
-) {
- if id, ok := ic.artifact.Load(a); ok {
- idu = id.(unique.Handle[ID])
- return
- }
-
- if ki, ok := a.(KnownIdent); ok {
- buf = ic.getIdentBuf()
- if encodeKind {
- binary.LittleEndian.PutUint64(buf[:], uint64(a.Kind()))
- }
- *(*ID)(buf[wordSize:]) = ki.ID()
- return
- }
-
- buf = ic.getIdentBuf()
- h := sha512.New384()
- if err := ic.Encode(h, a); err != nil {
- // unreachable
- panic(err)
- }
- binary.LittleEndian.PutUint64(buf[:], uint64(a.Kind()))
- h.Sum(buf[wordSize:wordSize])
- return
-}
-
-// getReader is like [bufio.NewReader] but for brPool.
-func (c *Cache) getReader(r io.Reader) *bufio.Reader {
- br := c.brPool.Get().(*bufio.Reader)
- br.Reset(r)
- return br
-}
-
-// putReader adds br to brPool.
-func (c *Cache) putReader(br *bufio.Reader) { c.brPool.Put(br) }
-
-// bufioReadCloser is the concrete type of value returned by Cache.getReaderRC.
-type bufioReadCloser struct {
- // Saved close error.
- closeErr error
- // Synchronises calls to Close.
- closeOnce sync.Once
-
- // For backing freelist.
- c *Cache
- // Underlying reader.
- r io.ReadCloser
- // Allocated from c.
- *bufio.Reader
-}
-
-// Close closes the underlying reader, saves its return value, and returns the
-// [bufio.Reader] instance to the backing [Cache].
-func (brc *bufioReadCloser) Close() error {
- brc.closeOnce.Do(func() {
- br := brc.Reader
- brc.Reader = nil
- brc.c.putReader(br)
- brc.closeErr = brc.r.Close()
- })
- return brc.closeErr
-}
-
-// getReaderRC is like getReader, but returns an [io.ReadCloser].
-func (c *Cache) getReaderRC(r io.ReadCloser) io.ReadCloser {
- return &bufioReadCloser{c: c, r: r, Reader: c.getReader(r)}
-}
-
-// getWriter is like [bufio.NewWriter] but for bwPool.
-func (c *Cache) getWriter(w io.Writer) *bufio.Writer {
- bw := c.bwPool.Get().(*bufio.Writer)
- bw.Reset(w)
- return bw
-}
-
-// putWriter adds bw to bwPool.
-func (c *Cache) putWriter(bw *bufio.Writer) { c.bwPool.Put(bw) }
-
-// A ChecksumMismatchError describes an [Artifact] with unexpected content.
-type ChecksumMismatchError struct {
- // Actual and expected checksums.
- Got, Want Checksum
-}
-
-func (e *ChecksumMismatchError) Error() string {
- return "got " + Encode(e.Got) +
- " instead of " + Encode(e.Want)
-}
-
-// LinknamePrefixError describes a malformed linkname to a [Checksum].
-type LinknamePrefixError string
-
-func (e LinknamePrefixError) Error() string {
- return "linkname " + strconv.Quote(string(e)) + " missing prefix"
-}
-
-// readlinkChecksum reads a symbolic link to a dirChecksum entry and saves the
-// decoded [Checksum] to the value pointed to by buf. The checksumLinknamePrefix
-// is required.
-func readlinkChecksum(a *check.Absolute, buf *Checksum) error {
- linkname, err := os.Readlink(a.String())
- if err != nil {
- return nil
- }
-
- if !strings.HasPrefix(linkname, checksumLinknamePrefix) {
- return LinknamePrefixError(linkname)
- }
- return Decode(buf, linkname[len(checksumLinknamePrefix):])
-}
-
-// SetExternal sets e as the [External] implementation of c.
-func (c *Cache) SetExternal(e External) {
- c.externMu.Lock()
- c.externCache = make(map[unique.Handle[ID]]unique.Handle[Checksum])
- c.extern = e
- c.externMu.Unlock()
-}
-
-// ScrubError describes the outcome of a [Cache.Scrub] call where errors were
-// found and removed from the underlying storage of [Cache].
-type ScrubError struct {
- // Content-addressed entries not matching their checksum. This can happen
- // if an incorrect [FileArtifact] implementation was cured against
- // a non-strict [Cache].
- ChecksumMismatches []ChecksumMismatchError
- // Dangling identifier symlinks. This can happen if the content-addressed
- // entry was removed while scrubbing due to a checksum mismatch.
- DanglingIdentifiers []ID
- // Dangling status files. This can happen if a dangling status symlink was
- // removed while scrubbing.
- DanglingStatus []ID
- // Miscellaneous errors, including [os.ReadDir] on checksum and identifier
- // directories, [Decode] on entry names and [os.RemoveAll] on inconsistent
- // entries.
- Errs map[unique.Handle[string]][]error
-}
-
-// errs is a deterministic iterator over Errs.
-func (e *ScrubError) errs(yield func(unique.Handle[string], []error) bool) {
- keys := slices.AppendSeq(
- make([]unique.Handle[string], 0, len(e.Errs)),
- maps.Keys(e.Errs),
- )
- slices.SortFunc(keys, func(a, b unique.Handle[string]) int {
- return strings.Compare(a.Value(), b.Value())
- })
- for _, key := range keys {
- if !yield(key, e.Errs[key]) {
- break
- }
- }
-}
-
-// Unwrap returns a concatenation of ChecksumMismatches and Errs.
-func (e *ScrubError) Unwrap() []error {
- s := make([]error, 0, len(e.ChecksumMismatches)+len(e.Errs))
- for _, err := range e.ChecksumMismatches {
- s = append(s, &err)
- }
- for _, errs := range e.errs {
- s = append(s, errs...)
- }
- return s
-}
-
-// Error returns a multi-line representation of [ScrubError].
-func (e *ScrubError) Error() string {
- var segments []string
- var buf strings.Builder
-
- if len(e.ChecksumMismatches) > 0 {
- buf.Reset()
- buf.WriteString("checksum mismatches:\n")
- for _, m := range e.ChecksumMismatches {
- buf.WriteString(m.Error() + "\n")
- }
- segments = append(segments, buf.String())
- }
- if len(e.DanglingIdentifiers) > 0 {
- buf.Reset()
- buf.WriteString("dangling identifiers:\n")
- for _, id := range e.DanglingIdentifiers {
- buf.WriteString(Encode(id) + "\n")
- }
- segments = append(segments, buf.String())
- }
- if len(e.DanglingStatus) > 0 {
- buf.Reset()
- buf.WriteString("dangling status:\n")
- for _, id := range e.DanglingStatus {
- buf.WriteString(Encode(id) + "\n")
- }
- segments = append(segments, buf.String())
- }
- if len(e.Errs) > 0 {
- buf.Reset()
- buf.WriteString("errors during scrub:\n")
- for pathname, errs := range e.errs {
- buf.WriteString(" " + pathname.Value() + ":\n")
- for _, err := range errs {
- buf.WriteString(" " + err.Error() + "\n")
- }
- }
- segments = append(segments, buf.String())
- }
- return strings.Join(segments, "\n")
-}
-
-// Scrub frees internal in-memory identifier to content pair cache, verifies all
-// cached artifacts against their checksums, checks for dangling identifier
-// symlinks and removes them if found.
-//
-// This method is not safe for concurrent use with any other method.
-func (c *Cache) Scrub(checks int) error {
- if checks <= 0 {
- checks = runtime.NumCPU()
- }
-
- c.substituteMu.Lock()
- defer c.substituteMu.Unlock()
- c.identMu.Lock()
- defer c.identMu.Unlock()
- c.checksumMu.Lock()
- defer c.checksumMu.Unlock()
-
- c.substitute = make(map[unique.Handle[ID]]unique.Handle[Checksum])
- c.ident = make(map[unique.Handle[ID]]unique.Handle[Checksum])
- c.identErr = make(map[unique.Handle[ID]]error)
- c.artifact.Clear()
-
- var (
- se = ScrubError{Errs: make(map[unique.Handle[string]][]error)}
- seMu sync.Mutex
-
- addErr = func(pathname *check.Absolute, err error) {
- seMu.Lock()
- se.Errs[pathname.Handle()] = append(se.Errs[pathname.Handle()], err)
- seMu.Unlock()
- }
- )
-
- type checkEntry struct {
- ent os.DirEntry
- check func(ent os.DirEntry, want *Checksum) bool
- }
- var (
- dir *check.Absolute
- wg sync.WaitGroup
- w = make(chan checkEntry, checks)
- p = sync.Pool{New: func() any { return new(Checksum) }}
- )
- condemn := func(ent os.DirEntry) {
- pathname := dir.Append(ent.Name())
- chmodErr, removeErr := removeAll(pathname)
- if chmodErr != nil {
- addErr(pathname, chmodErr)
- }
- if removeErr != nil {
- addErr(pathname, removeErr)
- }
- }
- for i := 0; i < checks; i++ {
- go func() {
- for ce := range w {
- want := p.Get().(*Checksum)
- ent := ce.ent
- if err := Decode(want, ent.Name()); err != nil {
- addErr(dir.Append(ent.Name()), err)
- wg.Go(func() { condemn(ent) })
- } else if !ce.check(ent, want) {
- wg.Go(func() { condemn(ent) })
- } else {
- c.msg.Verbosef(
- "%s%s%s is consistent",
- c.sgrIdent, ent.Name(), c.sgrRes,
- )
- }
- p.Put(want)
- wg.Done()
- }
- }()
- }
- defer close(w)
-
- dir = c.base.Append(dirChecksum)
- if entries, readdirErr := os.ReadDir(dir.String()); readdirErr != nil {
- addErr(dir, readdirErr)
- } else {
- wg.Add(len(entries))
- for _, ent := range entries {
- w <- checkEntry{ent, func(ent os.DirEntry, want *Checksum) bool {
- got := p.Get().(*Checksum)
- defer p.Put(got)
-
- pathname := dir.Append(ent.Name())
- if ent.IsDir() {
- if err := SumDir(got, pathname); err != nil {
- addErr(pathname, err)
- return true
- }
- } else if ent.Type().IsRegular() {
- h := sha512.New384()
-
- if r, err := os.Open(pathname.String()); err != nil {
- addErr(pathname, err)
- return true
- } else {
- _, err = io.Copy(h, r)
- closeErr := r.Close()
- if closeErr != nil {
- addErr(pathname, closeErr)
- }
- if err != nil {
- addErr(pathname, err)
- }
- }
- h.Sum(got[:0])
- } else {
- addErr(pathname, InvalidFileModeError(ent.Type()))
- return false
- }
-
- if *got != *want {
- seMu.Lock()
- se.ChecksumMismatches = append(se.ChecksumMismatches,
- ChecksumMismatchError{Got: *got, Want: *want},
- )
- seMu.Unlock()
- return false
- }
- return true
- }}
- }
- wg.Wait()
- }
-
- for _, suffix := range []string{
- dirSubstitute,
- dirIdentifier,
- } {
- dir = c.base.Append(suffix)
- if entries, readdirErr := os.ReadDir(dir.String()); readdirErr != nil {
- addErr(dir, readdirErr)
- } else {
- wg.Add(len(entries))
- for _, ent := range entries {
- w <- checkEntry{ent, func(ent os.DirEntry, want *Checksum) bool {
- got := p.Get().(*Checksum)
- defer p.Put(got)
-
- pathname := dir.Append(ent.Name())
- if linkname, err := os.Readlink(
- pathname.String(),
- ); err != nil {
- seMu.Lock()
- se.Errs[pathname.Handle()] = append(se.Errs[pathname.Handle()], err)
- se.DanglingIdentifiers = append(se.DanglingIdentifiers, *want)
- seMu.Unlock()
- return false
- } else if err = Decode(got, filepath.Base(linkname)); err != nil {
- seMu.Lock()
- lnp := dir.Append(linkname)
- se.Errs[lnp.Handle()] = append(se.Errs[lnp.Handle()], err)
- se.DanglingIdentifiers = append(se.DanglingIdentifiers, *want)
- seMu.Unlock()
- return false
- }
-
- if _, err := os.Stat(pathname.String()); err != nil {
- if !errors.Is(err, os.ErrNotExist) {
- addErr(pathname, err)
- }
- seMu.Lock()
- se.DanglingIdentifiers = append(se.DanglingIdentifiers, *want)
- seMu.Unlock()
- return false
- }
- return true
- }}
- }
- wg.Wait()
- }
- }
-
- dir = c.base.Append(dirStatus)
- if entries, readdirErr := os.ReadDir(dir.String()); readdirErr != nil {
- if !errors.Is(readdirErr, os.ErrNotExist) {
- addErr(dir, readdirErr)
- }
- } else {
- wg.Add(len(entries))
- for _, ent := range entries {
- w <- checkEntry{ent, func(ent os.DirEntry, want *Checksum) bool {
- got := p.Get().(*Checksum)
- defer p.Put(got)
-
- var ok bool
- for _, name := range [...]string{
- dirIdentifier,
- dirSubstitute,
- } {
- if _, err := os.Stat(c.base.Append(
- name,
- ent.Name(),
- ).String()); err != nil {
- if !errors.Is(err, os.ErrNotExist) {
- addErr(dir.Append(ent.Name()), err)
- }
- continue
- }
- ok = true
- }
- if !ok {
- seMu.Lock()
- se.DanglingStatus = append(se.DanglingStatus, *want)
- seMu.Unlock()
- }
- return ok
- }}
- }
- wg.Wait()
- }
-
- if len(c.identPending) > 0 {
- addErr(c.base, errors.New(
- "scrub began with pending artifacts",
- ))
- } else {
- pathname := c.base.Append(dirWork)
- chmodErr, removeErr := removeAll(pathname)
- if chmodErr != nil {
- addErr(pathname, chmodErr)
- }
- if removeErr != nil {
- addErr(pathname, removeErr)
- }
-
- if err := os.Mkdir(pathname.String(), 0700); err != nil {
- addErr(pathname, err)
- }
-
- pathname = c.base.Append(dirTemp)
- chmodErr, removeErr = removeAll(pathname)
- if chmodErr != nil {
- addErr(pathname, chmodErr)
- }
- if removeErr != nil {
- addErr(pathname, removeErr)
- }
- }
-
- if len(se.ChecksumMismatches) > 0 ||
- len(se.DanglingIdentifiers) > 0 ||
- len(se.DanglingStatus) > 0 ||
- len(se.Errs) > 0 {
- slices.SortFunc(se.ChecksumMismatches, func(a, b ChecksumMismatchError) int {
- return bytes.Compare(a.Want[:], b.Want[:])
- })
- slices.SortFunc(se.DanglingIdentifiers, func(a, b ID) int {
- return bytes.Compare(a[:], b[:])
- })
- slices.SortFunc(se.DanglingStatus, func(a, b ID) int {
- return bytes.Compare(a[:], b[:])
- })
- return &se
- } else {
- return nil
- }
-}
-
-// loadOrStoreIdent attempts to load a cached [Artifact] by its identifier or
-// wait for a pending [Artifact] to cure. If neither is possible, the current
-// identifier is stored in identPending and a non-nil channel is returned.
-//
-// Since identErr is treated as grow-only, loadOrStoreIdent must not be entered
-// without holding a read lock on abortMu.
-func (c *Cache) loadOrStoreIdent(id unique.Handle[ID]) (
- ctx context.Context,
- done chan<- struct{},
- checksum unique.Handle[Checksum],
- err error,
-) {
- var ok bool
-
- c.identMu.Lock()
- if checksum, ok = c.ident[id]; ok {
- c.identMu.Unlock()
- return
- }
- if err, ok = c.identErr[id]; ok {
- c.identMu.Unlock()
- return
- }
-
- var pending *pendingCure
- if pending, ok = c.identPending[id]; ok {
- c.identMu.Unlock()
- <-pending.done
- c.identMu.RLock()
- if checksum, ok = c.ident[id]; !ok {
- err = pending.err
- }
- c.identMu.RUnlock()
- return
- }
-
- d := make(chan struct{})
- pending = &pendingCure{done: d}
- ctx, pending.cancel = context.WithCancel(c.toplevel.Load().ctx)
- c.wg.Add(1)
- c.identPending[id] = pending
- c.identMu.Unlock()
- done = d
- return
-}
-
-// finaliseIdent commits a checksum or error to ident for an identifier
-// previously submitted to identPending.
-func (c *Cache) finaliseIdent(
- done chan<- struct{},
- id unique.Handle[ID],
- checksum unique.Handle[Checksum],
- err error,
-) {
- c.identMu.Lock()
- if err != nil {
- c.identPending[id].err = err
- c.identErr[id] = err
- } else {
- c.ident[id] = checksum
- }
- delete(c.identPending, id)
- c.identMu.Unlock()
- c.wg.Done()
-
- close(done)
-}
-
-// zeroChecksum is a zero [Checksum] handle, used for comparison only.
-var zeroChecksum unique.Handle[Checksum]
-
-// loadSubstitute returns a checksum corresponding to a substitute identifier,
-// or zeroChecksum if an alternative is not available.
-func (c *Cache) loadSubstitute(
- substitute unique.Handle[ID],
-) (unique.Handle[Checksum], error) {
- c.substituteMu.RLock()
- if checksum, ok := c.substitute[substitute]; ok {
- c.substituteMu.RUnlock()
- return checksum, nil
- }
-
- linkname, err := os.Readlink(c.base.Append(
- dirSubstitute,
- Encode(substitute.Value()),
- ).String())
- c.substituteMu.RUnlock()
-
- if err != nil {
- if !errors.Is(err, os.ErrNotExist) {
- return zeroChecksum, err
- }
-
- c.substituteMu.Lock()
- c.substitute[substitute] = zeroChecksum
- c.substituteMu.Unlock()
- return zeroChecksum, nil
- }
-
- var checksum unique.Handle[Checksum]
- buf := c.getIdentBuf()
- err = Decode((*Checksum)(buf[:]), filepath.Base(linkname))
- if err == nil {
- checksum = unique.Make(Checksum(buf[:]))
-
- c.substituteMu.Lock()
- c.substitute[substitute] = checksum
- c.substituteMu.Unlock()
- }
- c.putIdentBuf(buf)
-
- return checksum, err
-}
-
-// Done returns a channel that is closed when the ongoing cure of an [Artifact]
-// referred to by the specified identifier completes. Done may return nil if
-// no ongoing cure of the specified identifier exists.
-func (c *Cache) Done(id unique.Handle[ID]) <-chan struct{} {
- c.identMu.RLock()
- pending, ok := c.identPending[id]
- c.identMu.RUnlock()
- if !ok || pending == nil {
- return nil
- }
- return pending.done
-}
-
-// Cancel cancels the ongoing cure of an [Artifact] referred to by the specified
-// identifier. Cancel returns whether the [context.CancelFunc] has been killed.
-// Cancel returns after the cure is complete.
-func (c *Cache) Cancel(id unique.Handle[ID]) bool {
- c.identMu.RLock()
- pending, ok := c.identPending[id]
- c.identMu.RUnlock()
- if !ok || pending == nil || pending.cancel == nil {
- return false
- }
- pending.cancel()
- <-pending.done
-
- c.abortMu.Lock()
- c.identMu.Lock()
- delete(c.identErr, id)
- c.identMu.Unlock()
- c.abortMu.Unlock()
- return true
-}
-
-// openFile tries to load [FileArtifact] from [Cache], and if that fails,
-// obtains it via [FileArtifact.Cure] instead. Notably, it does not cure
-// [FileArtifact] to the filesystem. If err is nil, the caller is responsible
-// for closing the resulting [io.ReadCloser].
-//
-// The context must originate from loadOrStoreIdent to enable cancellation.
-func (c *Cache) openFile(
- ctx context.Context,
- f FileArtifact,
-) (r io.ReadCloser, err error) {
- if kc, ok := f.(KnownChecksum); c.attr.Flags&CAssumeChecksum != 0 && ok {
- c.checksumMu.RLock()
- r, err = os.Open(c.base.Append(
- dirChecksum,
- Encode(kc.Checksum()),
- ).String())
- c.checksumMu.RUnlock()
- } else {
- c.identMu.RLock()
- r, err = os.Open(c.base.Append(
- dirIdentifier,
- Encode(c.Ident(f).Value()),
- ).String())
- c.identMu.RUnlock()
- }
-
- if err != nil {
- if !errors.Is(err, os.ErrNotExist) {
- return
- }
- id := c.Ident(f)
- if c.msg.IsVerbose() {
- rn := reportName(f, id)
- c.msg.Verbosef("curing %s%s%s in memory...", c.sgrIdent, rn, c.sgrRes)
- defer func() {
- if err == nil {
- c.msg.Verbosef("opened %s%s%s for reading", c.sgrIdent, rn, c.sgrRes)
- }
- }()
- }
- return f.Cure(&RContext{common{ctx, c}})
- }
- return
-}
-
-// InvalidFileModeError describes a [FloodArtifact.Cure] or
-// [TrivialArtifact.Cure] that did not result in a regular file or directory
-// located at the work pathname.
-type InvalidFileModeError fs.FileMode
-
-// Error returns a constant string.
-func (e InvalidFileModeError) Error() string {
- return "artifact did not produce a regular file or directory"
-}
-
-// NoOutputError describes a [FloodArtifact.Cure] or [TrivialArtifact.Cure]
-// that did not populate its work pathname despite completing successfully.
-type NoOutputError struct{}
-
-// Unwrap returns [os.ErrNotExist].
-func (NoOutputError) Unwrap() error { return os.ErrNotExist }
-
-// Error returns a constant string.
-func (NoOutputError) Error() string {
- return "artifact cured successfully but did not produce any output"
-}
-
-// removeAll is similar to [os.RemoveAll] but is robust against any permissions.
-func removeAll(pathname *check.Absolute) (chmodErr, removeErr error) {
- chmodErr = filepath.WalkDir(pathname.String(), func(
- path string,
- d fs.DirEntry,
- err error,
- ) error {
- if err != nil {
- return err
- }
- if d.IsDir() {
- return os.Chmod(path, 0700)
- }
- return nil
- })
- if errors.Is(chmodErr, os.ErrNotExist) {
- chmodErr = nil
- }
- removeErr = os.RemoveAll(pathname.String())
- return
-}
-
-// zeroTimes zeroes atime and mtime for the named file.
-func zeroTimes(path string) (err error) {
- // include/uapi/linux/fcntl.h
- const (
- AT_FDCWD = -100
- AT_SYMLINK_NOFOLLOW = 0x100
- )
- _AT_FDCWD := AT_FDCWD
-
- var _p0 *byte
- _p0, err = syscall.BytePtrFromString(path)
- if err != nil {
- return
- }
- if _, _, errno := syscall.Syscall6(
- syscall.SYS_UTIMENSAT,
- uintptr(_AT_FDCWD),
- uintptr(unsafe.Pointer(_p0)),
- uintptr(unsafe.Pointer(new([2]syscall.Timespec))),
- AT_SYMLINK_NOFOLLOW,
- 0, 0,
- ); errno != 0 {
- return os.NewSyscallError("utimensat", errno)
- }
- return
-}
-
-// overrideFileInfo overrides the permission bits of [fs.FileInfo] to 0500 and
-// is the concrete type returned by overrideFile.Stat.
-type overrideFileInfo struct{ fs.FileInfo }
-
-// Mode returns [fs.FileMode] with its permission bits set to 0500.
-func (fi overrideFileInfo) Mode() fs.FileMode {
- return fi.FileInfo.Mode()&(^fs.FileMode(0777)) | 0500
-}
-
-// Sys returns nil to avoid passing the original permission bits.
-func (fi overrideFileInfo) Sys() any { return nil }
-
-// overrideFile overrides the permission bits of [fs.File] to 0500 and is the
-// concrete type returned by dotOverrideFS for calls with "." passed as name.
-type overrideFile struct{ fs.File }
-
-func (f overrideFile) Stat() (fi fs.FileInfo, err error) {
- fi, err = f.File.Stat()
- if err != nil {
- return
- }
- fi = overrideFileInfo{fi}
- return
-}
-
-// dirFS is implemented by the concrete type of the return value of [os.DirFS].
-type dirFS interface {
- fs.StatFS
- fs.ReadFileFS
- fs.ReadDirFS
- fs.ReadLinkFS
-}
-
-// dotOverrideFS overrides the permission bits of "." to 0500 to avoid the extra
-// system calls to add and remove write bit from the target directory.
-type dotOverrideFS struct{ dirFS }
-
-// Open wraps the underlying [fs.FS] with "." special case.
-func (fsys dotOverrideFS) Open(name string) (f fs.File, err error) {
- f, err = fsys.dirFS.Open(name)
- if err != nil || name != "." {
- return
- }
- f = overrideFile{f}
- return
-}
-
-// Stat wraps the underlying [fs.FS] with "." special case.
-func (fsys dotOverrideFS) Stat(name string) (fi fs.FileInfo, err error) {
- fi, err = fsys.dirFS.Stat(name)
- if err != nil || name != "." {
- return
- }
- fi = overrideFileInfo{fi}
- return
-}
-
-// InvalidArtifactError describes an artifact that does not implement a
-// supported Cure method.
-type InvalidArtifactError ID
-
-func (e InvalidArtifactError) Error() string {
- return "artifact " + Encode(e) + " cannot be cured"
-}
-
-// Cure cures the [Artifact] and returns its pathname and [Checksum]. Direct
-// calls to Cure are not subject to the cures limit.
-func (c *Cache) Cure(a Artifact) (
- pathname *check.Absolute,
- checksum unique.Handle[Checksum],
- err error,
-) {
- c.abortMu.RLock()
- defer c.abortMu.RUnlock()
-
- if err = c.toplevel.Load().ctx.Err(); err != nil {
- return
- }
-
- pathname, checksum, _, err = c.cure(a, true, false)
- return
-}
-
-// CureWhence is like Cure, but returns the whence value.
-func (c *Cache) CureWhence(a Artifact) (
- pathname *check.Absolute,
- checksum unique.Handle[Checksum],
- whence int,
- err error,
-) {
- c.abortMu.RLock()
- defer c.abortMu.RUnlock()
-
- if err = c.toplevel.Load().ctx.Err(); err != nil {
- return
- }
-
- return c.cure(a, true, false)
-}
-
-// CureNew is like Cure, but always enters the implementation.
-func (c *Cache) CureNew(a Artifact) (
- pathname *check.Absolute,
- checksum unique.Handle[Checksum],
- err error,
-) {
- c.abortMu.RLock()
- defer c.abortMu.RUnlock()
-
- if err = c.toplevel.Load().ctx.Err(); err != nil {
- return
- }
-
- var whence int
-retry:
- pathname, checksum, whence, err = c.cure(a, true, true)
- if err != nil || whence == WNew {
- return
- }
- goto retry
-}
-
-// An InputError describes inputs of a [FloodArtifact] which had failed to cure.
-type InputError map[Artifact]error
-
-// unwrap returns an iterator over sorted, deduplicated [Artifact] and their
-// corresponding identifier.
-func (e InputError) unwrap() iter.Seq2[Artifact, unique.Handle[ID]] {
- ir := NewIR()
-
- type input struct {
- a Artifact
- id unique.Handle[ID]
- }
- p := make([]input, 0, len(e))
- for a := range e {
- p = append(p, input{a, ir.Ident(a)})
- }
-
- var identBuf [2]ID
- slices.SortFunc(p, func(a, b input) int {
- identBuf[0], identBuf[1] = a.id.Value(), b.id.Value()
- return slices.Compare(identBuf[0][:], identBuf[1][:])
- })
- p = slices.CompactFunc(p, func(a, b input) bool { return a.id == b.id })
-
- return func(yield func(Artifact, unique.Handle[ID]) bool) {
- for _, i := range p {
- if !yield(i.a, i.id) {
- return
- }
- }
- }
-}
-
-// Error returns a user-facing, deterministic text representation of e.
-func (e InputError) Error() string {
- var buf strings.Builder
- buf.WriteString("errors curing inputs:")
- for a, id := range e.unwrap() {
- buf.WriteString("\n\t")
- buf.WriteString(reportName(a, id))
- buf.WriteString(": ")
- buf.WriteString(e[a].Error())
- }
- return buf.String()
-}
-
-// Unwrap returns a slice of underlying errors sorted by identifier.
-func (e InputError) Unwrap() []error {
- errs := make([]error, 0, len(e))
- for a := range e.unwrap() {
- errs = append(errs, e[a])
- }
- return errs
-}
-
-// enterCure must be called before entering an [Artifact] implementation.
-func (c *Cache) enterCure(a Artifact, curesExempt bool) error {
- if c.attr.Notify != nil {
- c.attr.Notify <- true
- }
-
- if a.IsExclusive() {
- c.exclMu.Lock()
- }
- if curesExempt {
- return nil
- }
-
- ctx := c.toplevel.Load().ctx
- select {
- case c.cures <- struct{}{}:
- return nil
-
- case <-ctx.Done():
- if a.IsExclusive() {
- c.exclMu.Unlock()
- }
- return ctx.Err()
- }
-}
-
-// exitCure must be called after exiting an [Artifact] implementation.
-func (c *Cache) exitCure(a Artifact, curesExempt bool) {
- if c.attr.Notify != nil {
- c.attr.Notify <- false
- }
-
- if a.IsExclusive() {
- c.exclMu.Unlock()
- }
- if curesExempt {
- return
- }
-
- <-c.cures
-}
-
-// measuredReader implements [io.ReadCloser] and measures the checksum during
-// Close. If the underlying reader is not read to EOF, Close blocks until all
-// remaining data is consumed and validated.
-type measuredReader struct {
- // Underlying reader. Never exposed directly.
- r io.ReadCloser
- // For validating checksum. Never exposed directly.
- h hash.Hash
- // Buffers writes to h, initialised by [Cache]. Never exposed directly.
- hbw *bufio.Writer
- // Expected checksum, compared during Close.
- want unique.Handle[Checksum]
-
- // For accessing free lists.
- c *Cache
-
- // Set up via [io.TeeReader] by [Cache].
- io.Reader
-}
-
-// Close reads the underlying [io.ReadCloser] to EOF, closes it and measures its
-// outcome. It returns a [ChecksumMismatchError] for an unexpected checksum.
-func (mr *measuredReader) Close() (err error) {
- if mr.hbw == nil || mr.Reader == nil {
- return os.ErrInvalid
- }
- err = mr.hbw.Flush()
- mr.c.putWriter(mr.hbw)
- mr.hbw, mr.Reader = nil, nil
- if err != nil {
- _ = mr.r.Close()
- return
- }
- var n int64
- if n, err = io.Copy(mr.h, mr.r); err != nil {
- _ = mr.r.Close()
- return
- }
-
- if n > 0 {
- mr.c.msg.Verbosef(
- "%smissed %d bytes on measured reader%s",
- mr.c.sgrWarn, n, mr.c.sgrRes,
- )
- }
-
- if err = mr.r.Close(); err != nil {
- return
- }
-
- buf := mr.c.getIdentBuf()
- mr.h.Sum(buf[:0])
-
- if got := Checksum(buf[:]); got != mr.want.Value() {
- err = &ChecksumMismatchError{
- Got: got,
- Want: mr.want.Value(),
- }
- }
-
- mr.c.putIdentBuf(buf)
- return
-}
-
-// newMeasuredReader implements [RContext.NewMeasuredReader].
-func (c *Cache) newMeasuredReader(
- r io.ReadCloser,
- checksum unique.Handle[Checksum],
-) io.ReadCloser {
- mr := measuredReader{r: r, h: sha512.New384(), want: checksum, c: c}
- mr.hbw = c.getWriter(mr.h)
- mr.Reader = io.TeeReader(r, mr.hbw)
- return &mr
-}
-
-// NewMeasuredReader returns an [io.ReadCloser] implementing behaviour required
-// by [FileArtifact]. The resulting [io.ReadCloser] holds a buffer originating
-// from [Cache] and must be closed to return this buffer.
-func (r *RContext) NewMeasuredReader(
- rc io.ReadCloser,
- checksum unique.Handle[Checksum],
-) io.ReadCloser {
- return r.cache.newMeasuredReader(rc, checksum)
-}
-
-// tryChecksum dereferences a symlink to a cure outcome.
-func (c *Cache) tryChecksum(pathname *check.Absolute) (
- checksum unique.Handle[Checksum],
- err error,
-) {
- _, err = os.Lstat(pathname.String())
- if err == nil {
- var name string
- if name, err = os.Readlink(pathname.String()); err != nil {
- return
- }
- buf := c.getIdentBuf()
- err = Decode((*Checksum)(buf[:]), filepath.Base(name))
- if err == nil {
- checksum = unique.Make(Checksum(buf[:]))
- }
- c.putIdentBuf(buf)
- }
- return
-}
-
-// tryLocal attempts to obtain an [Artifact] outcome from the filesystem.
-func (c *Cache) tryLocal(id unique.Handle[ID]) (unique.Handle[Checksum], error) {
- return c.tryChecksum(c.base.Append(
- dirIdentifier,
- Encode(id.Value()),
- ))
-}
-
-// tryExtern attempts to obtain an [Artifact] outcome from extern.
-func (c *Cache) tryExtern(ctx context.Context, id unique.Handle[ID]) (
- unique.Handle[Checksum],
- error,
-) {
- c.externMu.RLock()
- defer c.externMu.RUnlock()
-
- checksum, ok := c.externCache[id]
- if !ok {
- if c.extern == nil {
- return zeroChecksum, nil
- }
-
- v, err := c.extern.Artifact(ctx, id)
- if err != nil {
- return zeroChecksum, err
- }
- if v == nil {
- return zeroChecksum, nil
- }
- checksum = unique.Make(*v)
-
- var got unique.Handle[Checksum]
- if _, got, err = c.Cure(c.extern.Checksum(checksum)); err != nil {
- return checksum, err
- } else if got != checksum {
- return zeroChecksum, &ChecksumMismatchError{got.Value(), checksum.Value()}
- }
- }
- return checksum, nil
-}
-
-// cureMany concurrently collects outcome of multiple [Artifact].
-func (c *Cache) cureMany(
- inputs []Artifact,
- r map[Artifact]cureRes,
- shallow bool,
-) ([]bool, error) {
- var wg sync.WaitGroup
- wg.Add(len(inputs))
- var mask []bool
- res := make([]cureRes, len(inputs))
- errs := make(InputError)
- var errsMu sync.Mutex
- if shallow {
- mask = make([]bool, len(inputs))
- }
- for i, d := range inputs {
- if shallow {
- if _, ok := d.(FloodArtifact); ok {
- mask[i] = true
- wg.Done()
- continue
- }
-
- if kc, ok := d.(KnownChecksum); ok {
- res[i].checksum = unique.Make(kc.Checksum())
- wg.Done()
- continue
- }
- }
- pending := pendingArtifactDep{d, &res[i], errs, &errsMu, &wg}
- go pending.cure(c)
- }
- wg.Wait()
-
- if len(errs) > 0 {
- return mask, errs
- }
- for i, p := range res {
- if shallow && mask[i] {
- continue
- }
- r[inputs[i]] = p
- }
- return mask, nil
-}
-
-// HangingInputError describes an input of an [Artifact] on a sparse cache
-// without an outcome available locally or via [External].
-type HangingInputError unique.Handle[ID]
-
-func (e HangingInputError) Error() string {
- return Encode(unique.Handle[ID](e).Value()) + " is unavailable"
-}
-
-const (
- // WNew indicates a cure entering the implementation.
- WNew = iota
- // WCache indicates an [Artifact] present in the cache.
- WCache
- // WSubstitute indicates an [Artifact] hitting a content-based input
- // substitution.
- WSubstitute
- // WExternal indicates a cure entering the external cache.
- WExternal
-)
-
-// WhenceString returns a printable string for a whence value.
-func WhenceString(whence int) string {
- switch whence {
- case WNew:
- return "new"
- case WCache:
- return "cache"
- case WSubstitute:
- return "substitute"
- case WExternal:
- return "external"
-
- default:
- return "invalid whence " + strconv.Itoa(whence)
- }
-}
-
-// cure implements Cure without acquiring a read lock on abortMu. cure must not
-// be entered during Abort.
-func (c *Cache) cure(a Artifact, curesExempt, rebuild bool) (
- pathname *check.Absolute,
- checksum unique.Handle[Checksum],
- whence int,
- err error,
-) {
- id := c.Ident(a)
- if rebuild {
- var v ID
- _, _ = rand.Read(v[:])
- id = unique.Make(v)
- }
-
- ids := Encode(id.Value())
- pathname = c.base.Append(
- dirIdentifier,
- ids,
- )
- defer func() {
- if err != nil {
- pathname = nil
- checksum = unique.Handle[Checksum]{}
- }
- }()
-
- if _, ok := a.(CuresExempt); ok {
- curesExempt = true
- }
-
- var (
- ctx context.Context
- done chan<- struct{}
- )
- ctx, done, checksum, err = c.loadOrStoreIdent(id)
- if done == nil {
- whence = WCache
- return
- } else {
- defer func() { c.finaliseIdent(done, id, checksum, err) }()
- }
-
- checksum, err = c.tryChecksum(pathname)
- if err == nil || !errors.Is(err, os.ErrNotExist) {
- whence = WCache
- return
- }
-
- var (
- checksums string
- substitute unique.Handle[ID]
- alternative *check.Absolute
- )
- defer func() {
- if err == nil && checksums != "" {
- linkname := checksumLinknamePrefix + checksums
-
- err = os.Symlink(
- linkname,
- pathname.String(),
- )
- if err == nil {
- err = zeroTimes(pathname.String())
- }
-
- if err == nil && alternative != nil && substitute != id {
- c.substituteMu.Lock()
- err = os.Symlink(
- linkname,
- alternative.String(),
- )
- if errors.Is(err, os.ErrExist) {
- c.msg.Verbosef(
- "creating alternative over %s%s%s for artifact %s%s%s",
- c.sgrIdent, Encode(substitute.Value()), c.sgrRes,
- c.sgrIdent, ids, c.sgrRes,
- )
- err = nil
- }
- if err == nil {
- err = zeroTimes(alternative.String())
- }
- if err == nil && checksum != zeroChecksum {
- c.substitute[substitute] = checksum
- }
- c.substituteMu.Unlock()
- }
- }
- }()
-
- var checksumPathname *check.Absolute
- var checksumFi os.FileInfo
- if kc, ok := a.(KnownChecksum); ok {
- checksum = unique.Make(kc.Checksum())
- checksums = Encode(checksum.Value())
- checksumPathname = c.base.Append(
- dirChecksum,
- checksums,
- )
-
- if c.attr.Flags&CAssumeChecksum != 0 {
- c.checksumMu.RLock()
- checksumFi, err = os.Stat(checksumPathname.String())
- c.checksumMu.RUnlock()
-
- if err != nil {
- if !errors.Is(err, os.ErrNotExist) {
- return
- }
-
- checksumFi, err = nil, nil
- }
- }
- }
-
- whence = WNew
- if c.msg.IsVerbose() {
- rn := reportName(a, id)
- c.msg.Verbosef("curing %s%s%s...", c.sgrIdent, rn, c.sgrRes)
- defer func() {
- if err != nil {
- return
- }
- if checksums != "" {
- c.msg.Verbosef(
- "cured %s%s%s checksum %s%s%s",
- c.sgrIdent, rn, c.sgrRes,
- c.sgrIdent, checksums, c.sgrRes)
- } else {
- c.msg.Verbosef("cured %s%s%s", c.sgrIdent, rn, c.sgrRes)
- }
- }()
- }
-
- // cure FileArtifact outside type switch to skip TContext initialisation
- if f, ok := a.(FileArtifact); ok {
- if checksumFi != nil {
- whence = WCache
- if !checksumFi.Mode().IsRegular() {
- // unreachable
- err = InvalidFileModeError(checksumFi.Mode())
- }
- return
- }
-
- perm := os.FileMode(0400)
- if f.IsExecutable() {
- perm = 0500
- }
-
- work := c.base.Append(dirWork, ids)
- var w *os.File
- if w, err = os.OpenFile(
- work.String(),
- os.O_CREATE|os.O_EXCL|os.O_WRONLY,
- perm,
- ); err != nil {
- return
- }
- defer func() {
- closeErr := w.Close()
- if err == nil {
- err = closeErr
- }
-
- removeErr := os.Remove(work.String())
- if err == nil && !errors.Is(removeErr, os.ErrNotExist) {
- err = removeErr
- }
- }()
-
- var r io.ReadCloser
- if err = c.enterCure(a, curesExempt); err != nil {
- return
- }
- r, err = f.Cure(&RContext{common{ctx, c}})
- if err == nil {
- if checksumPathname == nil || c.attr.Flags&CValidateKnown != 0 {
- h := sha512.New384()
- hbw := c.getWriter(h)
- _, err = io.Copy(w, io.TeeReader(r, hbw))
- flushErr := hbw.Flush()
- c.putWriter(hbw)
- if err == nil {
- err = flushErr
- }
-
- if err == nil {
- buf := c.getIdentBuf()
- h.Sum(buf[:0])
-
- if checksumPathname == nil {
- checksum = unique.Make(Checksum(buf[:]))
- checksums = Encode(Checksum(buf[:]))
- } else if c.attr.Flags&CValidateKnown != 0 {
- if got := Checksum(buf[:]); got != checksum.Value() {
- err = &ChecksumMismatchError{
- Got: got,
- Want: checksum.Value(),
- }
- }
- }
-
- c.putIdentBuf(buf)
-
- if checksumPathname == nil {
- checksumPathname = c.base.Append(
- dirChecksum,
- checksums,
- )
- }
- }
- } else {
- _, err = io.Copy(w, r)
- }
-
- closeErr := r.Close()
- if err == nil {
- err = closeErr
- }
- }
- c.exitCure(a, curesExempt)
- if err != nil {
- if c.msg.IsVerbose() {
- c.msg.Verbosef(
- "cure file %s%s%s: %s%v%s",
- c.sgrIdent, reportName(f, id), c.sgrRes,
- c.sgrErr, err, c.sgrRes,
- )
- }
- return
- }
-
- c.checksumMu.Lock()
- if err = os.Rename(
- work.String(),
- checksumPathname.String(),
- ); err != nil {
- c.checksumMu.Unlock()
- return
- }
- timeErr := zeroTimes(checksumPathname.String())
- c.checksumMu.Unlock()
-
- if err == nil {
- err = timeErr
- }
- return
- }
-
- if checksumFi != nil {
- whence = WCache
- if !checksumFi.Mode().IsDir() {
- // unreachable
- err = InvalidFileModeError(checksumFi.Mode())
- }
- return
- }
-
- t := TContext{
- c.base.Append(dirWork, ids),
- c.base.Append(dirTemp, ids),
- ids, nil, nil, nil, nil,
- common{ctx, c},
- }
- switch ca := a.(type) {
- case TrivialArtifact:
- defer t.destroy(&err)
- if err = c.enterCure(a, curesExempt); err != nil {
- return
- }
- err = ca.Cure(&t)
- c.exitCure(a, curesExempt)
- if err != nil {
- if c.msg.IsVerbose() {
- c.msg.Verbosef(
- "cure trivial %s%s%s: %s%v%s",
- c.sgrIdent, reportName(ca, id), c.sgrRes,
- c.sgrErr, err, c.sgrRes,
- )
- }
- return
- }
- break
-
- case FloodArtifact:
- var externChecksum unique.Handle[Checksum]
- if externChecksum, err = c.tryExtern(ctx, id); err != nil {
- if c.msg.IsVerbose() {
- c.msg.Verbosef(
- "extern %s%s%s: %s%v%s",
- c.sgrIdent, reportName(ca, id), c.sgrRes,
- c.sgrErr, err, c.sgrRes,
- )
- }
- return
- }
- extern := externChecksum != zeroChecksum
- shallow := extern && c.attr.Flags&CExternShallow != 0
-
- inputs := a.Inputs()
- f := FContext{t, make(map[Artifact]cureRes, len(inputs))}
- var mask []bool
- if mask, err = c.cureMany(inputs, f.inputs, shallow); err != nil {
- return
- }
-
- if shallow {
- for i, d := range inputs {
- if !mask[i] {
- continue
- }
-
- if kc, ok := d.(KnownChecksum); ok {
- f.inputs[d] = cureRes{checksum: unique.Make(kc.Checksum())}
- continue
- }
-
- var sum unique.Handle[Checksum]
- did := c.Ident(d)
- sum, err = c.tryLocal(did)
- if err != nil {
- if !errors.Is(err, os.ErrNotExist) {
- return
- }
-
- sum, err = c.tryExtern(ctx, did)
- if err != nil {
- return
- }
- if sum == zeroChecksum {
- if c.msg.IsVerbose() {
- c.msg.Verbosef(
- "input %s%s%s not available",
- c.sgrIdent, reportName(d, did), c.sgrRes,
- )
- }
- err = HangingInputError(did)
- return
- }
- }
-
- f.inputs[d] = cureRes{checksum: sum}
- }
- }
-
- sh := sha512.New384()
- err = c.encode(sh, a, f.inputs)
- if err != nil {
- return
- }
-
- buf := c.getIdentBuf()
- sh.Sum(buf[wordSize:wordSize])
- substitute = unique.Make(ID(buf[wordSize:]))
- substitutes := Encode(substitute.Value())
- c.putIdentBuf(buf)
- alternative = c.base.Append(
- dirSubstitute,
- substitutes,
- )
-
- if !rebuild && c.attr.Flags&CIgnoreSubstitutes == 0 {
- var substituteChecksum unique.Handle[Checksum]
- substituteChecksum, err = c.loadSubstitute(substitute)
- if err != nil {
- return
- }
- if substituteChecksum != zeroChecksum {
- whence = WSubstitute
- checksum = substituteChecksum
- checksums = Encode(checksum.Value())
- checksumPathname = c.base.Append(
- dirChecksum,
- checksums,
- )
- if _, err = os.Lstat(c.base.Append(
- dirStatus,
- substitutes,
- ).String()); err == nil {
- err = os.Symlink(substitutes, c.base.Append(
- dirStatus,
- ids,
- ).String())
- } else if errors.Is(err, os.ErrNotExist) {
- err = nil
- }
- return
- }
- }
-
- defer f.destroy(&err)
-
- if extern {
- whence = WExternal
- if checksum != zeroChecksum && externChecksum != checksum {
- err = &ChecksumMismatchError{externChecksum.Value(), checksum.Value()}
- if c.msg.IsVerbose() {
- c.msg.Verbosef(
- "extern %s%s%s: %s%v%s",
- c.sgrIdent, reportName(ca, id), c.sgrRes,
- c.sgrErr, err, c.sgrRes,
- )
- }
- return
- }
-
- var externStatus io.ReadCloser
- c.externMu.RLock()
- externStatus, err = c.extern.Status(&RContext{common{ctx, c}}, id)
- c.externMu.RUnlock()
- if err != nil {
- return
- }
-
- checksum = externChecksum
- checksums = Encode(checksum.Value())
- checksumPathname = c.base.Append(
- dirChecksum,
- checksums,
- )
-
- if externStatus != nil {
- if err = f.prepareStatus(false); err != nil {
- _ = externStatus.Close()
- return
- } else if _, err = io.Copy(f.status, externStatus); err != nil {
- _ = externStatus.Close()
- return
- } else if err = externStatus.Close(); err != nil {
- return
- } else if !rebuild {
- if err = f.linkSubstitute(ids, substitutes); err != nil {
- return
- }
- }
- }
- return
- }
-
- if err = c.enterCure(a, curesExempt); err != nil {
- return
- }
- err = ca.Cure(&f)
- c.exitCure(a, curesExempt)
-
- if !rebuild && err == nil {
- err = f.linkSubstitute(ids, substitutes)
- }
- if err != nil {
- if c.msg.IsVerbose() {
- c.msg.Verbosef(
- "cure %s%s%s: %s%v%s",
- c.sgrIdent, reportName(ca, id), c.sgrRes,
- c.sgrErr, err, c.sgrRes,
- )
- }
- return
- }
- break
-
- default:
- err = InvalidArtifactError(id.Value())
- return
- }
- t.cache = nil
-
- var fi os.FileInfo
- if fi, err = os.Lstat(t.work.String()); err != nil {
- if errors.Is(err, os.ErrNotExist) {
- err = NoOutputError{}
- }
- return
- }
-
- if !fi.IsDir() {
- if !fi.Mode().IsRegular() {
- err = InvalidFileModeError(fi.Mode())
- } else {
- err = errors.New("non-file artifact produced regular file")
- }
- return
- }
-
- var gotChecksum Checksum
- if err = SumFS(
- &gotChecksum,
- dotOverrideFS{os.DirFS(t.work.String()).(dirFS)},
- ".",
- ); err != nil {
- return
- }
-
- if checksumPathname == nil {
- checksum = unique.Make(gotChecksum)
- checksums = Encode(gotChecksum)
- checksumPathname = c.base.Append(
- dirChecksum,
- checksums,
- )
- } else if gotChecksum != checksum.Value() {
- err = &ChecksumMismatchError{
- Got: gotChecksum,
- Want: checksum.Value(),
- }
- if c.msg.IsVerbose() {
- c.msg.Verbosef(
- "validate %s%s%s: %s%v%s",
- c.sgrIdent, reportName(a, id), c.sgrRes,
- c.sgrErr, err, c.sgrRes,
- )
- }
- return
- }
-
- if err = os.Chmod(t.work.String(), 0700); err != nil {
- return
- }
- if err = filepath.WalkDir(t.work.String(), func(path string, _ fs.DirEntry, err error) error {
- if err != nil {
- return err
- }
- return zeroTimes(path)
- }); err != nil {
- return
- }
- c.checksumMu.Lock()
- if err = os.Rename(
- t.work.String(),
- checksumPathname.String(),
- ); err != nil {
- if !errors.Is(err, os.ErrExist) {
- c.checksumMu.Unlock()
- return
- }
- // err is zeroed during deferred cleanup
- } else {
- err = os.Chmod(checksumPathname.String(), 0500)
- }
- c.checksumMu.Unlock()
- return
-}
-
-// cure cures the pending [Artifact], stores its result and notifies the caller.
-func (pending *pendingArtifactDep) cure(c *Cache) {
- defer pending.Done()
-
- var err error
- pending.resP.pathname, pending.resP.checksum, _, err = c.cure(pending.a, false, false)
- if err == nil {
- return
- }
-
- pending.errsMu.Lock()
- if errs, ok := err.(InputError); ok {
- maps.Copy(pending.errs, errs)
- } else {
- pending.errs[pending.a] = err
- }
- pending.errsMu.Unlock()
-}
-
-// OpenStatus attempts to open the status file associated to an [Artifact]. If
-// err is nil, the caller must close the resulting reader.
-func (c *Cache) OpenStatus(a Artifact) (r io.ReadSeekCloser, err error) {
- c.identMu.RLock()
- r, err = os.Open(c.base.Append(
- dirStatus,
- Encode(c.Ident(a).Value())).String(),
- )
- c.identMu.RUnlock()
- return
-}
-
-// Fault holds the pathname and termination time of an [Artifact] fault entry.
-type Fault struct {
- *check.Absolute
- t uint64
-}
-
-// Time returns the instant in time where the fault occurred.
-func (f Fault) Time() time.Time { return time.Unix(0, int64(f.t)) }
-
-// Open opens the underlying entry for reading.
-func (f Fault) Open() (io.ReadCloser, error) { return os.Open(f.Absolute.String()) }
-
-// Destroy removes the underlying fault entry.
-func (f Fault) Destroy() error { return os.Remove(f.Absolute.String()) }
-
-// ReadFaults returns fault entries for an [Artifact].
-func (c *Cache) ReadFaults(a Artifact) (faults []Fault, err error) {
- prefix := Encode(c.Ident(a).Value()) + "."
- var dents []os.DirEntry
- if dents, err = os.ReadDir(c.base.Append(dirFault).String()); err != nil {
- return
- }
-
- for _, dent := range dents {
- name := dent.Name()
- if !strings.HasPrefix(name, prefix) {
- continue
- }
- var t uint64
- t, err = strconv.ParseUint(name[len(prefix):], 10, 64)
- if err != nil {
- return
- }
-
- faults = append(faults, Fault{c.base.Append(
- dirFault,
- name,
- ), t})
- }
-
- slices.SortFunc(faults, func(a, b Fault) int {
- return cmp.Compare(a.t, b.t)
- })
- return
-}
-
-// Abort cancels all pending cures and waits for them to clean up, but does not
-// close the cache.
-func (c *Cache) Abort() {
- c.closeMu.Lock()
- defer c.closeMu.Unlock()
-
- if c.closed {
- return
- }
-
- c.toplevel.Load().cancel()
- c.abortMu.Lock()
- defer c.abortMu.Unlock()
-
- // holding abortMu, identPending stays empty
- c.wg.Wait()
- c.identMu.Lock()
- c.toplevel.Store(newToplevel(c.parent))
- clear(c.identErr)
- c.identMu.Unlock()
-}
-
-// Close cancels all pending cures and waits for them to clean up.
-func (c *Cache) Close() {
- c.closeMu.Lock()
- defer c.closeMu.Unlock()
-
- if c.closed {
- return
- }
-
- c.closed = true
- c.toplevel.Load().cancel()
- c.wg.Wait()
- close(c.cures)
- c.unlock()
-
- if c.attr.Notify != nil {
- close(c.attr.Notify)
- }
-}
-
-// UnsupportedVariantError describes an on-disk cache with an extension variant
-// identification string that differs from the value returned by [Extension].
-type UnsupportedVariantError string
-
-func (e UnsupportedVariantError) Error() string {
- return "unsupported variant " + strconv.Quote(string(e))
-}
-
-var (
- // ErrWouldPromote is returned by [Open] if the [CPromoteVariant] bit is not
- // set and the on-disk cache requires variant promotion.
- ErrWouldPromote = errors.New("operation would promote unextended cache")
-)
-
-// CacheAttr holds the attributes that will be applied to a new [Cache] opened
-// by [Open].
-type CacheAttr struct {
- // Concurrent cures of a [FloodArtifact] dependency graph.
- Cures int
- // Options affecting [Cache] behaviour.
- Flags int
- // Preferred job count, when applicable.
- Jobs int
- // Preferred loadavg target, when applicable.
- Load int
- // Optional cure entry and exit notification.
- Notify chan<- bool
-
- // Omit the [lockedfile] lock.
- skipLock bool
-}
-
-// Open returns the address of a newly opened instance of [Cache].
-//
-// Concurrent cures of a [FloodArtifact] dependency graph is limited to the
-// caller-supplied value, however direct calls to [Cache.Cure] is not subject
-// to this limitation.
-//
-// A cures or jobs value of 0 or lower is equivalent to the value returned by
-// [runtime.NumCPU].
-//
-// A successful call to Open guarantees exclusive access to the on-filesystem
-// cache for the resulting instance of [Cache]. The [Cache.Close] method cancels
-// and waits for pending cures on [Cache] before releasing this lock and must be
-// called once the [Cache] is no longer needed.
-func Open(
- ctx context.Context,
- msg message.Msg,
- base *check.Absolute,
- attr *CacheAttr,
-) (*Cache, error) {
- openMu.Lock()
- defer openMu.Unlock()
- opened = true
-
- if extension == "" && len(irArtifact) != int(_kindEnd) {
- panic("attempting to open cache with incomplete variant setup")
- }
-
- var a CacheAttr
- if attr != nil {
- a = *attr
- }
-
- if a.Cures < 1 {
- a.Cures = runtime.NumCPU()
- }
- if a.Jobs < 1 {
- a.Jobs = runtime.NumCPU()
- }
- if a.Load < 1 {
- a.Load = runtime.NumCPU() + 2
- }
-
- for _, name := range []string{
- dirSubstitute,
- dirIdentifier,
- dirChecksum,
- dirStatus,
- dirFault,
- dirWork,
- } {
- if err := os.MkdirAll(
- base.Append(name).String(),
- 0700,
- ); err != nil && !errors.Is(err, os.ErrExist) {
- return nil, err
- }
- }
-
- c := Cache{
- parent: ctx,
-
- cures: make(chan struct{}, a.Cures),
- attr: a,
-
- msg: msg,
- base: base,
-
- irCache: zeroIRCache(),
-
- substitute: make(map[unique.Handle[ID]]unique.Handle[Checksum]),
- ident: make(map[unique.Handle[ID]]unique.Handle[Checksum]),
- identErr: make(map[unique.Handle[ID]]error),
- identPending: make(map[unique.Handle[ID]]*pendingCure),
-
- brPool: sync.Pool{New: func() any { return new(bufio.Reader) }},
- bwPool: sync.Pool{New: func() any { return new(bufio.Writer) }},
- }
- c.toplevel.Store(newToplevel(ctx))
-
- if !a.skipLock || !testing.Testing() {
- if unlock, err := lockedfile.MutexAt(
- base.Append(fileLock).String(),
- ).Lock(); err != nil {
- return nil, err
- } else {
- c.unlock = unlock
- }
- } else {
- c.unlock = func() {}
- }
-
- for _, name := range []string{
- dirWork,
- dirTemp,
- } {
- dents, err := os.ReadDir(base.Append(name).String())
- if err != nil {
- if errors.Is(err, os.ErrNotExist) {
- continue
- }
- c.unlock()
- return nil, err
- }
- if len(dents) != 0 {
- c.unlock()
- return nil, fmt.Errorf(
- "%s is not empty, scrub likely required",
- name,
- )
- }
- }
-
- if _, err := os.ReadDir(base.Append(
- dirExecScratch,
- ).String()); !errors.Is(err, os.ErrNotExist) {
- c.unlock()
- if err != nil {
- return nil, err
- }
- return nil, errors.New(dirExecScratch + " is present, scrub likely required")
- }
-
- variantPath := base.Append(fileVariant).String()
- if p, err := os.ReadFile(variantPath); err != nil {
- if !errors.Is(err, os.ErrNotExist) {
- c.unlock()
- return nil, err
- }
- // nonexistence implies newly created cache, or a cache predating
- // variant identification strings, in which case it is silently promoted
- if err = os.WriteFile(
- variantPath,
- []byte(extension),
- 0400,
- ); err != nil {
- c.unlock()
- return nil, err
- }
- } else if s := string(p); s == "" {
- if extension != "" {
- if a.Flags&CPromoteVariant == 0 {
- c.unlock()
- return nil, ErrWouldPromote
- }
- if err = os.WriteFile(
- variantPath,
- []byte(extension),
- 0400,
- ); err != nil {
- c.unlock()
- return nil, err
- }
- }
- } else if !ValidExtension(s) {
- c.unlock()
- return nil, ErrInvalidExtension
- } else if s != extension {
- c.unlock()
- return nil, UnsupportedVariantError(s)
- }
-
- if a.Flags&CColourOutput != 0 {
- c.sgrRes = "\x1b[0m"
- c.sgrIdent = "\x1b[1m"
- c.sgrWarn = "\x1b[35m"
- c.sgrErr = "\x1b[1;31m"
- }
-
- return &c, nil
-}
-
-// Collected is returned by [Collect.Cure] to indicate a successful collection.
-type Collected struct{}
-
-// Error returns a constant string to satisfy error, but should never be seen
-// by the user.
-func (Collected) Error() string { return "artifacts successfully collected" }
-
-// IsCollected returns whether the underlying error contains that of the result
-// of curing a [Collect] helper.
-func IsCollected(err error) bool { return errors.As(err, new(Collected)) }
-
-// Collect implements [pkg.FloodArtifact] to concurrently cure multiple
-// [pkg.Artifact]. It returns [Collected].
-type Collect []Artifact
-
-var _ Artifact = new(Collect)
-
-// Cure returns [Collected].
-func (*Collect) Cure(*FContext) error { return Collected{} }
-
-// Kind returns the hardcoded [pkg.Kind] value.
-func (*Collect) Kind() Kind { return kindCollection }
-
-// Params is a noop: dependencies are already represented in the header.
-func (*Collect) Params(*IContext) {}
-
-// Inputs returns [Collect] as is.
-func (c *Collect) Inputs() []Artifact { return *c }
-
-// IsExclusive returns false: Cure is a noop.
-func (*Collect) IsExclusive() bool { return false }
diff --git a/internal/pkg/pkg_test.go b/internal/pkg/pkg_test.go
deleted file mode 100644
index b23948f8..00000000
--- a/internal/pkg/pkg_test.go
+++ /dev/null
@@ -1,2375 +0,0 @@
-package pkg_test
-
-import (
- "archive/tar"
- "bytes"
- "context"
- "crypto/sha512"
- "encoding/base64"
- "errors"
- "fmt"
- "io"
- "io/fs"
- "log"
- "net/http"
- "os"
- "path/filepath"
- "reflect"
- "strconv"
- "strings"
- "sync"
- "syscall"
- "testing"
- "testing/fstest"
- "time"
- "unique"
- "unsafe"
-
- "hakurei.app/check"
- "hakurei.app/container"
- "hakurei.app/fhs"
- "hakurei.app/internal/info"
- "hakurei.app/internal/landlock"
- "hakurei.app/internal/pkg"
- "hakurei.app/internal/stub"
- "hakurei.app/message"
-)
-
-var skipLock = func() pkg.CacheAttr {
- var attr pkg.CacheAttr
- *(*bool)(unsafe.Pointer(reflect.ValueOf(&attr).
- Elem().
- FieldByName("skipLock").
- UnsafeAddr())) = true
- return attr
-}()
-
-var (
- // extension is a string uniquely identifying a set of custom [Artifact]
- // implementations registered by calling [Register].
- //
- //go:linkname extension hakurei.app/internal/pkg.extension
- extension string
-
- // opened is false if [Open] was never called.
- //
- //go:linkname opened hakurei.app/internal/pkg.opened
- opened bool
-
- // irArtifact refers to artifact IR interpretation functions and must not be
- // written to directly.
- //
- //go:linkname irArtifact hakurei.app/internal/pkg.irArtifact
- irArtifact map[pkg.Kind]pkg.IRReadFunc
-
- // statusHeader is the header written to all status files in dirStatus.
- //
- //go:linkname statusHeader hakurei.app/internal/pkg.statusHeader
- statusHeader string
-)
-
-// newRContext returns the address of a new [pkg.RContext] unsafely created for
-// the specified [testing.TB].
-func newRContext(tb testing.TB, c *pkg.Cache) *pkg.RContext {
- var r pkg.RContext
- rContextVal := reflect.ValueOf(&r).Elem().FieldByName("ctx")
- reflect.NewAt(
- rContextVal.Type(),
- unsafe.Pointer(rContextVal.UnsafeAddr()),
- ).Elem().Set(reflect.ValueOf(tb.Context()))
- rCacheVal := reflect.ValueOf(&r).Elem().FieldByName("cache")
- reflect.NewAt(
- rCacheVal.Type(),
- unsafe.Pointer(rCacheVal.UnsafeAddr()),
- ).Elem().Set(reflect.ValueOf(c))
- return &r
-}
-
-// overrideIdent overrides the ID method of [Artifact].
-type overrideIdent struct {
- id pkg.ID
- pkg.TrivialArtifact
-}
-
-func (a overrideIdent) ID() pkg.ID { return a.id }
-
-// overrideIdentFile overrides the ID method of [FileArtifact].
-type overrideIdentFile struct {
- id pkg.ID
- pkg.FileArtifact
-}
-
-func (a overrideIdentFile) ID() pkg.ID { return a.id }
-
-// A knownIdentArtifact implements [pkg.KnownIdent] and [Artifact]
-type knownIdentArtifact interface {
- pkg.KnownIdent
- pkg.TrivialArtifact
-}
-
-// A knownIdentFile implements [pkg.KnownIdent] and [FileArtifact]
-type knownIdentFile interface {
- pkg.KnownIdent
- pkg.FileArtifact
-}
-
-// overrideChecksum overrides the Checksum method of [Artifact].
-type overrideChecksum struct {
- checksum pkg.Checksum
- knownIdentArtifact
-}
-
-func (a overrideChecksum) Checksum() pkg.Checksum { return a.checksum }
-
-// overrideChecksumFile overrides the Checksum method of [FileArtifact].
-type overrideChecksumFile struct {
- checksum pkg.Checksum
- knownIdentFile
-}
-
-func (a overrideChecksumFile) Checksum() pkg.Checksum { return a.checksum }
-
-// A stubArtifact implements [TrivialArtifact] with hardcoded behaviour.
-type stubArtifact struct {
- kind pkg.Kind
- params []byte
- deps []pkg.Artifact
-
- cure func(t *pkg.TContext) error
-}
-
-func (a *stubArtifact) Kind() pkg.Kind { return a.kind }
-func (a *stubArtifact) Params(ctx *pkg.IContext) { ctx.Write(a.params) }
-func (a *stubArtifact) Inputs() []pkg.Artifact { return a.deps }
-func (a *stubArtifact) Cure(t *pkg.TContext) error { return a.cure(t) }
-func (*stubArtifact) IsExclusive() bool { return false }
-
-// A stubArtifactF implements [FloodArtifact] with hardcoded behaviour.
-type stubArtifactF struct {
- kind pkg.Kind
- params []byte
- deps []pkg.Artifact
- excl bool
-
- cure func(f *pkg.FContext) error
-}
-
-func (a *stubArtifactF) Kind() pkg.Kind { return a.kind }
-func (a *stubArtifactF) Params(ctx *pkg.IContext) { ctx.Write(a.params) }
-func (a *stubArtifactF) Inputs() []pkg.Artifact { return a.deps }
-func (a *stubArtifactF) Cure(f *pkg.FContext) error { return a.cure(f) }
-func (a *stubArtifactF) IsExclusive() bool { return a.excl }
-
-// A stubFile implements [FileArtifact] with hardcoded behaviour.
-type stubFile struct {
- data []byte
- err error
-
- stubArtifact
-}
-
-func (*stubFile) IsExecutable() bool { return false }
-
-func (a *stubFile) Cure(*pkg.RContext) (io.ReadCloser, error) {
- return io.NopCloser(bytes.NewReader(a.data)), a.err
-}
-
-// newStubFile returns an implementation of [pkg.File] with hardcoded behaviour.
-func newStubFile(
- kind pkg.Kind,
- id pkg.ID,
- sum *pkg.Checksum,
- data []byte,
- err error,
-) pkg.FileArtifact {
- f := overrideIdentFile{id, &stubFile{data, err, stubArtifact{
- kind,
- nil,
- nil,
- func(*pkg.TContext) error {
- panic("unreachable")
- },
- }}}
- if sum == nil {
- return f
- } else {
- return overrideChecksumFile{*sum, f}
- }
-}
-
-// stubExtern implements [External] with hardcoded prepared outcomes.
-type stubExtern struct {
- artifact map[unique.Handle[pkg.ID]]pkg.Checksum
- checksum map[unique.Handle[pkg.Checksum]]fstest.MapFS
- status map[unique.Handle[pkg.ID]]string
-}
-
-func (e stubExtern) Artifact(_ context.Context, id unique.Handle[pkg.ID]) (*pkg.Checksum, error) {
- if checksum, ok := e.artifact[id]; ok {
- return &checksum, nil
- }
- return nil, nil
-}
-
-func (e stubExtern) Checksum(checksum unique.Handle[pkg.Checksum]) pkg.Artifact {
- var buf bytes.Buffer
- if err := pkg.Write(e.checksum[checksum], ".", &buf); err != nil {
- panic(err)
- }
- return pkg.NewArchive(pkg.NewFile("", buf.Bytes()))
-}
-
-func (e stubExtern) Status(_ *pkg.RContext, id unique.Handle[pkg.ID]) (io.ReadCloser, error) {
- if status, ok := e.status[id]; ok {
- return io.NopCloser(strings.NewReader(status)), nil
- }
- return nil, nil
-}
-
-// destroyArtifact removes all traces of an [Artifact] from the on-disk cache.
-// Do not use this in a test case without a very good reason to do so.
-func destroyArtifact(
- t *testing.T,
- base *check.Absolute,
- c *pkg.Cache,
- a pkg.Artifact,
-) {
- if pathname, checksum, err := c.Cure(a); err != nil {
- t.Fatalf("Cure: error = %v", err)
- } else if err = os.Remove(pathname.String()); err != nil {
- t.Fatal(err)
- } else {
- p := base.Append(
- "checksum",
- pkg.Encode(checksum.Value()),
- )
- if err = filepath.WalkDir(p.String(), func(
- path string,
- d fs.DirEntry,
- err error,
- ) error {
- if err != nil {
- return err
- }
- if d.IsDir() {
- return os.Chmod(path, 0700)
- }
- return nil
- }); err != nil && !errors.Is(err, os.ErrNotExist) {
- t.Fatal(err)
- }
- if err = os.RemoveAll(p.String()); err != nil {
- t.Fatal(err)
- }
- }
-}
-
-// newDestroyArtifactFunc returns a function that calls destroyArtifact.
-func newDestroyArtifactFunc(a pkg.Artifact) func(
- t *testing.T,
- base *check.Absolute,
- c *pkg.Cache,
-) {
- return func(
- t *testing.T,
- base *check.Absolute,
- c *pkg.Cache,
- ) {
- destroyArtifact(t, base, c, a)
- }
-}
-
-// destroyStatus counts non-substitution status entries and destroys them.
-func destroyStatus(t *testing.T, base *check.Absolute, c, s int) {
- dents, err := os.ReadDir(base.Append("status").String())
- if err != nil {
- t.Fatal(err)
- }
-
- var gotC, gotS int
- for _, dent := range dents {
- if err = os.Remove(base.Append(
- "status",
- dent.Name(),
- ).String()); err != nil {
- t.Fatal(err)
- }
-
- if dent.Type().IsRegular() {
- gotC++
- continue
- }
- if dent.Type()&fs.ModeSymlink == fs.ModeSymlink {
- gotS++
- continue
- }
- t.Errorf("%s: %s", dent.Name(), dent.Type())
- }
-
- if gotC != c {
- t.Errorf("status: c = %d, want %d", gotC, c)
- }
- if gotS != s {
- t.Errorf("status: s = %d, want %d", gotS, s)
- }
-}
-
-func TestIdent(t *testing.T) {
- t.Parallel()
-
- testCases := []struct {
- name string
- a pkg.Artifact
- want unique.Handle[pkg.ID]
- }{
- {"decompress", &stubArtifact{
- pkg.KindDecompress,
- []byte{pkg.Gzip, 0, 0, 0, 0, 0, 0, 0},
- []pkg.Artifact{
- overrideIdent{pkg.ID{}, new(stubArtifact)},
- },
- nil,
- }, unique.Make[pkg.ID](pkg.MustDecode(
- "fkmge-H56Ph2LzNNbEUjTypes8LfOxrF_CEXg07kq6ho_nbTNvzQde9-bjB7gyB_",
- ))},
- }
-
- msg := message.New(log.New(os.Stderr, "ident: ", 0))
- msg.SwapVerbose(true)
- var cache *pkg.Cache
- if a, err := check.NewAbs(t.TempDir()); err != nil {
- t.Fatal(err)
- } else if cache, err = pkg.Open(t.Context(), msg, a, nil); err != nil {
- t.Fatal(err)
- }
- t.Cleanup(cache.Close)
-
- for _, tc := range testCases {
- t.Run(tc.name, func(t *testing.T) {
- t.Parallel()
-
- if got := cache.Ident(tc.a); got != tc.want {
- t.Errorf("Ident: %s, want %s",
- pkg.Encode(got.Value()),
- pkg.Encode(tc.want.Value()),
- )
- }
- })
- }
-}
-
-// An expectsKnown describes an expected file or directory.
-type expectsKnown interface {
- // hash returns the checksum of the represented data.
- hash() (checksum pkg.Checksum)
-}
-
-// An expectsChecksum is a prepared checksum value.
-type expectsChecksum pkg.Checksum
-
-// hash returns e.
-func (e expectsChecksum) hash() pkg.Checksum { return e }
-
-// An expectsFile is the contents of a file expected by the test suite.
-type expectsFile []byte
-
-// hash computes the checksum of e.
-func (e expectsFile) hash() (checksum pkg.Checksum) {
- h := sha512.New384()
- h.Write(e)
- h.Sum(checksum[:0])
- return
-}
-
-// An expectsFS describes the state of a filesystem expected by the test suite.
-type expectsFS fstest.MapFS
-
-// hash computes the checksum of e.
-func (e expectsFS) hash() (checksum pkg.Checksum) {
- if err := pkg.SumFS(&checksum, fstest.MapFS(e), "."); err != nil {
- panic(err)
- }
- return
-}
-
-// expectsFrom generates expectsFS for a filesystem directory.
-func expectsFrom(pathname string) string {
- var buf strings.Builder
- buf.WriteString("expectsFS{\n")
- if err := filepath.WalkDir(pathname, func(path string, d fs.DirEntry, err error) error {
- if err != nil {
- return err
- }
-
- var rel string
- if rel, err = filepath.Rel(pathname, path); err != nil {
- return err
- }
- buf.WriteString("\t" + strconv.Quote(rel) + ": {Mode: ")
-
- var fi fs.FileInfo
- if fi, err = d.Info(); err != nil {
- return err
- }
- mode := fi.Mode()
-
- switch {
- case mode.IsDir():
- buf.WriteString("fs.ModeDir | 0" +
- strconv.FormatInt(int64(mode&^fs.ModeDir), 8))
-
- case mode&fs.ModeSymlink != 0:
- buf.WriteString("fs.ModeSymlink | 0" +
- strconv.FormatInt(int64(mode&^fs.ModeSymlink), 8) +
- ", Data: []byte(")
- var linkname string
- if linkname, err = os.Readlink(path); err != nil {
- return err
- }
- buf.WriteString(strconv.Quote(linkname))
- buf.WriteByte(')')
-
- case mode.IsRegular():
- buf.WriteString("0" + strconv.FormatInt(int64(mode), 8))
- var p []byte
- if p, err = os.ReadFile(path); err != nil {
- return err
- }
-
- if len(p) > 0 {
- buf.WriteString(", Data: []byte(")
- buf.WriteString(strconv.Quote(unsafe.String(unsafe.SliceData(p), len(p))))
- buf.WriteByte(')')
- }
- }
- buf.WriteString("},\n")
- return nil
- }); err != nil {
- panic(err)
- }
- buf.WriteString("}")
- return buf.String()
-}
-
-// cacheTestCase is a test case passed to checkWithCache where a new instance
-// of [pkg.Cache] is prepared for the test case, and is validated and removed
-// on test completion.
-type cacheTestCase struct {
- name string
- flags int
- early func(t *testing.T, base *check.Absolute)
- f func(t *testing.T, base *check.Absolute, c *pkg.Cache)
- want expectsFS
-}
-
-const (
- // checkDestroySubstitutes arranges for substitutes to be destroyed before
- // measurement during checkWithCache.
- checkDestroySubstitutes = 1 << (iota + 32)
-)
-
-// makeBase returns a [pkg.Cache] base directory created for tb.
-func makeBase(tb testing.TB) (base *check.Absolute) {
- tb.Helper()
-
- base = check.MustAbs(tb.TempDir())
- if err := os.Chmod(base.String(), 0700); err != nil {
- tb.Fatal(err)
- }
- tb.Cleanup(func() {
- if err := filepath.WalkDir(base.String(), func(path string, d fs.DirEntry, err error) error {
- if err != nil {
- tb.Error(err)
- return nil
- }
- if !d.IsDir() {
- return nil
- }
- return os.Chmod(path, 0700)
- }); err != nil {
- tb.Fatal(err)
- }
- })
- return
-}
-
-// checkWithCache runs a slice of cacheTestCase.
-func checkWithCache(t *testing.T, testCases []cacheTestCase) {
- t.Helper()
-
- for _, tc := range testCases {
- t.Run(tc.name, func(t *testing.T) {
- t.Helper()
- t.Parallel()
-
- base := makeBase(t)
- msg := message.New(log.New(os.Stderr, "cache: ", 0))
- msg.SwapVerbose(testing.Verbose())
-
- flags := tc.flags | pkg.CSuppressInit
-
- if info.CanDegrade {
- if _, err := landlock.GetABI(); err != nil {
- if !errors.Is(err, syscall.ENOSYS) {
- t.Fatalf("LandlockGetABI: error = %v", err)
- }
- flags |= pkg.CHostAbstract
- t.Log("Landlock LSM is unavailable, setting CHostAbstract")
- }
- }
-
- var scrubFunc func() error // scrub after hashing
- if c, err := pkg.Open(t.Context(), msg, base, &pkg.CacheAttr{
- Cures: 1 << 4,
- Flags: flags,
- }); err != nil {
- t.Fatalf("Open: error = %v", err)
- } else {
- t.Cleanup(c.Close)
- if tc.early != nil {
- tc.early(t, base)
- }
- tc.f(t, base, c)
- scrubFunc = func() error {
- err = c.Scrub(1 << 7)
- idents, checksums, cleanErr := c.Clean(false, false)
- if len(idents) > 0 {
- t.Errorf("destroyed %d idents", len(idents))
- }
- if len(checksums) > 0 {
- t.Errorf("destroyed %d checksums", len(checksums))
- }
- return errors.Join(err, cleanErr)
- }
- }
-
- var restoreTemp bool
- if _, err := os.Lstat(base.Append("temp").String()); err != nil {
- if !errors.Is(err, os.ErrNotExist) {
- t.Fatal(err)
- }
- } else {
- restoreTemp = true
- }
-
- // destroy lock and variant file to avoid changing cache checksums
- for _, s := range []string{
- "lock",
- "variant",
- } {
- pathname := base.Append(s)
- if p, err := os.ReadFile(pathname.String()); err != nil {
- t.Fatal(err)
- } else if len(p) != 0 {
- t.Fatalf("file %q: %q", s, string(p))
- }
- if err := os.Remove(pathname.String()); err != nil {
- t.Fatal(err)
- }
- }
-
- // destroy non-deterministic substitutes
- if tc.flags&checkDestroySubstitutes != 0 {
- substitute := base.Append("substitute")
- if err := os.RemoveAll(substitute.String()); err != nil {
- t.Fatal(err)
- } else if err = os.Mkdir(substitute.String(), 0700); err != nil {
- t.Fatal(err)
- }
- }
-
- // destroy empty status directory
- if err := syscall.Rmdir(base.Append("status").String()); err != nil {
- if !errors.Is(err, syscall.ENOTEMPTY) {
- t.Fatal(err)
- }
- }
-
- // destroy empty fault directory
- if err := os.Remove(base.Append("fault").String()); err != nil {
- t.Fatal(err)
- }
-
- want := tc.want.hash()
-
- var checksum pkg.Checksum
- if err := pkg.SumDir(&checksum, base); err != nil {
- t.Fatalf("SumDir: error = %v", err)
- } else if checksum != want {
- t.Fatal(expectsFrom(base.String()))
- }
-
- if err := scrubFunc(); err != nil {
- t.Fatal("cache contains inconsistencies\n\n" + err.Error())
- }
-
- if restoreTemp {
- if err := os.Mkdir(
- base.Append("temp").String(),
- 0700,
- ); err != nil {
- t.Fatal(err)
- }
- }
-
- // validate again to make sure scrub did not condemn anything
- if err := pkg.SumDir(&checksum, base); err != nil {
- t.Fatalf("SumDir: error = %v", err)
- } else if checksum != want {
- t.Fatalf("(scrubbed) %s", expectsFrom(base.String()))
- }
- })
- }
-}
-
-// A cureStep contains an [Artifact] to be cured, and the expected outcome.
-type cureStep struct {
- name string
-
- a pkg.Artifact
-
- pathname *check.Absolute
- output expectsKnown
- whence int
- err error
-}
-
-// ignorePathname is passed to cureMany to skip the pathname check.
-var ignorePathname = check.MustAbs("/\x00")
-
-// cureMany cures many artifacts against a [Cache] and checks their outcomes.
-func cureMany(t *testing.T, c *pkg.Cache, steps []cureStep) {
- t.Helper()
-
- makeChecksumH := func(checksum pkg.Checksum) unique.Handle[pkg.Checksum] {
- if checksum == (pkg.Checksum{}) {
- return unique.Handle[pkg.Checksum]{}
- }
- return unique.Make(checksum)
- }
-
- for _, step := range steps {
- t.Log("cure step:", step.name)
- if pathname, checksum, whence, err := c.CureWhence(step.a); !reflect.DeepEqual(err, step.err) {
- faults, _err := c.ReadFaults(step.a)
- if _err != nil {
- t.Errorf("ReadFaults: error = %v", _err)
- }
-
- var p []byte
- for _, fault := range faults {
- p, _err = os.ReadFile(fault.String())
- if _err != nil {
- t.Error(_err)
- continue
- }
- t.Log(string(p))
- t.Logf("faulting cure terminated %s ago", time.Since(faults[0].Time()))
- }
- t.Fatalf("Cure: error = %v, want %v", err, step.err)
- } else if step.whence != whence {
- t.Fatalf("Cure: whence = %s, want %s", pkg.WhenceString(whence), pkg.WhenceString(step.whence))
- } else if step.pathname != ignorePathname && !pathname.Is(step.pathname) {
- t.Fatalf("Cure: pathname = %q, want %q", pathname, step.pathname)
- } else if step.output == nil || checksum != makeChecksumH(step.output.hash()) {
- if pathname != nil {
- if name, _err := filepath.EvalSymlinks(pathname.String()); _err != nil {
- t.Fatal(_err)
- } else {
- t.Fatal(expectsFrom(name))
- }
- } else if checksum != (unique.Handle[pkg.Checksum]{}) {
- t.Fatalf("Cure: unexpected checksum %s", pkg.Encode(checksum.Value()))
- }
- } else {
- v := any(err)
- if err == nil {
- v = pathname
- }
- var checksumVal pkg.Checksum
- if checksum != (unique.Handle[pkg.Checksum]{}) {
- checksumVal = checksum.Value()
- }
- t.Log(pkg.Encode(checksumVal)+":", v)
- }
- }
-}
-
-// newWantScrubError returns the address to a new [ScrubError] for base.
-func newWantScrubError(base *check.Absolute) *pkg.ScrubError {
- return &pkg.ScrubError{
- ChecksumMismatches: []pkg.ChecksumMismatchError{
- {Got: pkg.MustDecode(
- "vsAhtPNo4waRNOASwrQwcIPTqb3SBuJOXw2G4T1mNmVZM-wrQTRllmgXqcIIoRcX",
- ), Want: pkg.Checksum{0xff, 0}},
- },
- DanglingIdentifiers: []pkg.ID{
- {0xfe, 0},
- {0xfe, 0xfe},
- {0xfe, 0xff},
- },
- Errs: map[unique.Handle[string]][]error{
- base.Append("checksum", "__8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA").Handle(): {
- pkg.InvalidFileModeError(fs.ModeSymlink),
- },
-
- base.Append("checksum", "invalid").Handle(): {
- base64.CorruptInputError(4),
- },
-
- base.Append("nonexistent").Handle(): {
- base64.CorruptInputError(8),
- },
-
- base.Append("identifier", pkg.Encode(pkg.ID{0xfe, 0xff})).Handle(): {
- &os.PathError{
- Op: "readlink",
- Path: base.Append(
- "identifier",
- pkg.Encode(pkg.ID{0xfe, 0xff}),
- ).String(),
- Err: syscall.EINVAL,
- },
- },
- base.Append("identifier", "invalid").Handle(): {
- base64.CorruptInputError(4),
- },
- },
- }
-}
-
-func TestCache(t *testing.T) {
- t.Parallel()
-
- testdata := expectsFile("" +
- "\x00\x00\x00\x00" +
- "\xad\x0b\x00" +
- "\x04" +
- "\xfe\xfe\x00\x00" +
- "\xfe\xca\x00\x00")
-
- testCases := []cacheTestCase{
- {"file", pkg.CValidateKnown | pkg.CAssumeChecksum, nil, func(t *testing.T, base *check.Absolute, c *pkg.Cache) {
- identifier := (pkg.ID)(bytes.Repeat([]byte{
- 0x75, 0xe6, 0x9d, 0x6d, 0xe7, 0x9f,
- }, 8))
- wantPathname := base.Append(
- "identifier",
- "deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef",
- )
- identifier0 := (pkg.ID)(bytes.Repeat([]byte{
- 0x71, 0xa7, 0xde, 0x6d, 0xa6, 0xde,
- }, 8))
- wantPathname0 := base.Append(
- "identifier",
- "cafebabecafebabecafebabecafebabecafebabecafebabecafebabecafebabe",
- )
- failingFile := newStubFile(
- pkg.KindHTTPGet,
- pkg.ID{0xff, 3},
- nil,
- nil, struct {
- _ []byte
- stub.UniqueError
- }{UniqueError: 0xbad},
- )
-
- cureMany(t, c, []cureStep{
- {"initial file", newStubFile(
- pkg.KindHTTPGet,
- identifier,
- new(testdata.hash()),
- testdata, nil,
- ), wantPathname, testdata, pkg.WNew, nil},
-
- {"identical content", newStubFile(
- pkg.KindHTTPGet,
- identifier0,
- new(testdata.hash()),
- testdata, nil,
- ), wantPathname0, testdata, pkg.WCache, nil},
-
- {"existing entry", newStubFile(
- pkg.KindHTTPGet,
- identifier,
- new(testdata.hash()),
- testdata, nil,
- ), wantPathname, testdata, pkg.WCache, nil},
-
- {"checksum mismatch", newStubFile(
- pkg.KindHTTPGet,
- pkg.ID{0xff, 0},
- new(pkg.Checksum),
- testdata, nil,
- ), nil, nil, pkg.WNew, &pkg.ChecksumMismatchError{
- Got: testdata.hash(),
- }},
-
- {"store without validation", newStubFile(
- pkg.KindHTTPGet,
- pkg.MustDecode("vsAhtPNo4waRNOASwrQwcIPTqb3SBuJOXw2G4T1mNmVZM-wrQTRllmgXqcIIoRcX"),
- nil,
- []byte{0}, nil,
- ), base.Append(
- "identifier",
- "vsAhtPNo4waRNOASwrQwcIPTqb3SBuJOXw2G4T1mNmVZM-wrQTRllmgXqcIIoRcX",
- ), expectsChecksum{
- 0xbe, 0xc0, 0x21, 0xb4, 0xf3, 0x68,
- 0xe3, 0x06, 0x91, 0x34, 0xe0, 0x12,
- 0xc2, 0xb4, 0x30, 0x70, 0x83, 0xd3,
- 0xa9, 0xbd, 0xd2, 0x06, 0xe2, 0x4e,
- 0x5f, 0x0d, 0x86, 0xe1, 0x3d, 0x66,
- 0x36, 0x65, 0x59, 0x33, 0xec, 0x2b,
- 0x41, 0x34, 0x65, 0x96, 0x68, 0x17,
- 0xa9, 0xc2, 0x08, 0xa1, 0x17, 0x17,
- }, pkg.WNew, nil},
-
- {"incomplete implementation", struct{ pkg.Artifact }{&stubArtifact{
- kind: pkg.KindExec,
- params: []byte("artifact overridden to be incomplete"),
- }}, nil, nil, pkg.WNew, pkg.InvalidArtifactError(pkg.MustDecode(
- "poVrv3zNINbHd-WUJihwgWQwJpbHURFHfpY7Zux-ztto_bQhhS5PdpbNMjdkXv-V",
- ))},
-
- {"error passthrough", newStubFile(
- pkg.KindHTTPGet,
- pkg.ID{0xff, 1},
- nil,
- nil, stub.UniqueError(0xcafe),
- ), nil, nil, pkg.WNew, stub.UniqueError(0xcafe)},
-
- {"error caching", newStubFile(
- pkg.KindHTTPGet,
- pkg.ID{0xff, 1},
- nil,
- nil, nil,
- ), nil, nil, pkg.WCache, stub.UniqueError(0xcafe)},
-
- {"cache hit bad type", overrideChecksum{testdata.hash(), overrideIdent{pkg.ID{0xff, 2}, &stubArtifact{
- kind: pkg.KindTar,
- }}}, nil, nil, pkg.WCache, pkg.InvalidFileModeError(
- 0400,
- )},
-
- {"noncomparable error", &stubArtifactF{
- kind: pkg.KindExec,
- params: []byte("artifact with dependency returning noncomparable error"),
- deps: []pkg.Artifact{failingFile},
-
- cure: func(f *pkg.FContext) error {
- panic("attempting to cure impossible artifact")
- },
- }, nil, nil, pkg.WNew, pkg.InputError{
- failingFile: struct {
- _ []byte
- stub.UniqueError
- }{UniqueError: 0xbad},
- }},
- })
-
- if c0, err := pkg.Open(
- t.Context(),
- message.New(nil),
- base, &skipLock,
- ); err != nil {
- t.Fatalf("open: error = %v", err)
- } else {
- t.Cleanup(c.Close) // check doubled cancel
- cureMany(t, c0, []cureStep{
- {"cache hit ident", overrideIdent{
- id: identifier,
- }, wantPathname, testdata, pkg.WCache, nil},
-
- {"cache miss checksum match", newStubFile(
- pkg.KindHTTPGet,
- testdata.hash(),
- nil,
- testdata,
- nil,
- ), base.Append(
- "identifier",
- pkg.Encode(testdata.hash()),
- ), testdata, pkg.WNew, nil},
- })
-
- // cure after close
- c.Close()
- if _, _, err = c.Cure(&stubArtifactF{
- kind: pkg.KindExec,
- params: []byte("unreachable artifact cured after cancel"),
- deps: []pkg.Artifact{pkg.NewFile("", []byte("unreachable dependency"))},
- }); !reflect.DeepEqual(err, context.Canceled) {
- t.Fatalf("(closed) Cure: error = %v", err)
- }
- }
- }, expectsFS{
- ".": {Mode: fs.ModeDir | 0700},
-
- "checksum": {Mode: fs.ModeDir | 0700},
- "checksum/vsAhtPNo4waRNOASwrQwcIPTqb3SBuJOXw2G4T1mNmVZM-wrQTRllmgXqcIIoRcX": {Mode: 0400, Data: []byte{0}},
- "checksum/0bSFPu5Tnd-2Jj0Mv6co23PW2t3BmHc7eLFj9TgY3eIBg8zislo7xZYNBqovVLcq": {Mode: 0400, Data: []byte{0, 0, 0, 0, 0xad, 0xb, 0, 4, 0xfe, 0xfe, 0, 0, 0xfe, 0xca, 0, 0}},
-
- "identifier": {Mode: fs.ModeDir | 0700},
- "identifier/vsAhtPNo4waRNOASwrQwcIPTqb3SBuJOXw2G4T1mNmVZM-wrQTRllmgXqcIIoRcX": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/vsAhtPNo4waRNOASwrQwcIPTqb3SBuJOXw2G4T1mNmVZM-wrQTRllmgXqcIIoRcX")},
- "identifier/0bSFPu5Tnd-2Jj0Mv6co23PW2t3BmHc7eLFj9TgY3eIBg8zislo7xZYNBqovVLcq": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/0bSFPu5Tnd-2Jj0Mv6co23PW2t3BmHc7eLFj9TgY3eIBg8zislo7xZYNBqovVLcq")},
- "identifier/cafebabecafebabecafebabecafebabecafebabecafebabecafebabecafebabe": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/0bSFPu5Tnd-2Jj0Mv6co23PW2t3BmHc7eLFj9TgY3eIBg8zislo7xZYNBqovVLcq")},
- "identifier/deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/0bSFPu5Tnd-2Jj0Mv6co23PW2t3BmHc7eLFj9TgY3eIBg8zislo7xZYNBqovVLcq")},
-
- "substitute": {Mode: fs.ModeDir | 0700},
-
- "work": {Mode: fs.ModeDir | 0700},
- }},
-
- {"directory", pkg.CAssumeChecksum, nil, func(t *testing.T, base *check.Absolute, c *pkg.Cache) {
- id := pkg.MustDecode(
- "HnySzeLQvSBZuTUcvfmLEX_OmH4yJWWH788NxuLuv7kVn8_uPM6Ks4rqFWM2NZJY",
- )
- makeSample := func(t *pkg.TContext) error {
- work := t.GetWorkDir()
- if err := os.Mkdir(work.String(), 0700); err != nil {
- return err
- }
-
- if err := os.WriteFile(
- work.Append("check").String(),
- []byte{0, 0},
- 0400,
- ); err != nil {
- return err
- }
-
- if err := os.MkdirAll(work.Append(
- "lib",
- "pkgconfig",
- ).String(), 0700); err != nil {
- return err
- }
-
- return os.Symlink(
- "/proc/nonexistent/libedac.so",
- work.Append(
- "lib",
- "libedac.so",
- ).String(),
- )
- }
- want := expectsFS{
- ".": {Mode: fs.ModeDir | 0500},
-
- "check": {Mode: 0400, Data: []byte{0, 0}},
-
- "lib": {Mode: fs.ModeDir | 0700},
- "lib/libedac.so": {Mode: fs.ModeSymlink | 0777, Data: []byte("/proc/nonexistent/libedac.so")},
-
- "lib/pkgconfig": {Mode: fs.ModeDir | 0700},
- }
- wantPathname := base.Append(
- "identifier",
- pkg.Encode(id),
- )
-
- id0 := pkg.MustDecode(
- "Zx5ZG9BAwegNT3zQwCySuI2ktCXxNgxirkGLFjW4FW06PtojYVaCdtEw8yuntPLa",
- )
- wantPathname0 := base.Append(
- "identifier",
- pkg.Encode(id0),
- )
-
- makeGarbage := func(work *check.Absolute, wantErr error) error {
- if err := os.Mkdir(work.String(), 0700); err != nil {
- return err
- }
-
- mode := fs.FileMode(0)
- if wantErr == nil {
- mode = 0500
- }
-
- if err := os.MkdirAll(work.Append(
- "lib",
- "pkgconfig",
- ).String(), 0700); err != nil {
- return err
- }
-
- if err := os.WriteFile(work.Append(
- "lib",
- "check",
- ).String(), nil, 0400&mode); err != nil {
- return err
- }
-
- if err := os.Chmod(work.Append(
- "lib",
- "pkgconfig",
- ).String(), 0500&mode); err != nil {
- return err
- }
- if err := os.Chmod(work.Append(
- "lib",
- ).String(), 0500&mode); err != nil {
- return err
- }
-
- return wantErr
- }
-
- cureMany(t, c, []cureStep{
- {"initial directory", overrideChecksum{want.hash(), overrideIdent{id, &stubArtifact{
- kind: pkg.KindTar,
- cure: makeSample,
- }}}, wantPathname, want, pkg.WNew, nil},
-
- {"identical identifier", overrideChecksum{want.hash(), overrideIdent{id, &stubArtifact{
- kind: pkg.KindTar,
- }}}, wantPathname, want, pkg.WCache, nil},
-
- {"identical checksum", overrideIdent{id0, &stubArtifact{
- kind: pkg.KindTar,
- cure: makeSample,
- }}, wantPathname0, want, pkg.WNew, nil},
-
- {"cure fault", overrideIdent{pkg.ID{0xff, 0}, &stubArtifact{
- kind: pkg.KindTar,
- cure: func(t *pkg.TContext) error {
- return makeGarbage(t.GetWorkDir(), stub.UniqueError(0xcafe))
- },
- }}, nil, nil, pkg.WNew, stub.UniqueError(0xcafe)},
-
- {"checksum mismatch", overrideChecksum{pkg.Checksum{}, overrideIdent{pkg.ID{0xff, 1}, &stubArtifact{
- kind: pkg.KindTar,
- cure: func(t *pkg.TContext) error {
- return makeGarbage(t.GetWorkDir(), nil)
- },
- }}}, nil, nil, pkg.WNew, &pkg.ChecksumMismatchError{
- Got: pkg.MustDecode(
- "CUx-3hSbTWPsbMfDhgalG4Ni_GmR9TnVX8F99tY_P5GtkYvczg9RrF5zO0jX9XYT",
- ),
- }},
-
- {"cache hit bad type", newStubFile(
- pkg.KindHTTPGet,
- pkg.ID{0xff, 2},
- new(want.hash()),
- testdata, nil,
- ), nil, nil, pkg.WCache, pkg.InvalidFileModeError(
- fs.ModeDir | 0500,
- )},
-
- {"openFile directory", overrideIdent{pkg.ID{0xff, 3}, &stubArtifact{
- kind: pkg.KindTar,
- cure: func(t *pkg.TContext) error {
- r, err := t.Open(overrideChecksumFile{checksum: want.hash()})
- if err != nil {
- panic(err)
- }
- _, err = io.ReadAll(r)
- return err
- },
- }}, nil, nil, pkg.WNew, &os.PathError{
- Op: "read",
- Path: base.Append(
- "checksum",
- pkg.Encode(want.hash()),
- ).String(),
- Err: syscall.EISDIR,
- }},
-
- {"no output", overrideIdent{pkg.ID{0xff, 4}, &stubArtifact{
- kind: pkg.KindTar,
- cure: func(t *pkg.TContext) error {
- return nil
- },
- }}, nil, nil, pkg.WNew, pkg.NoOutputError{}},
-
- {"file output", overrideIdent{pkg.ID{0xff, 5}, &stubArtifact{
- kind: pkg.KindTar,
- cure: func(t *pkg.TContext) error {
- return os.WriteFile(t.GetWorkDir().String(), []byte{0}, 0400)
- },
- }}, nil, nil, pkg.WNew, errors.New("non-file artifact produced regular file")},
-
- {"symlink output", overrideIdent{pkg.ID{0xff, 6}, &stubArtifact{
- kind: pkg.KindTar,
- cure: func(t *pkg.TContext) error {
- return os.Symlink(
- t.GetWorkDir().String(),
- t.GetWorkDir().String(),
- )
- },
- }}, nil, nil, pkg.WNew, pkg.InvalidFileModeError(
- fs.ModeSymlink | 0777,
- )},
-
- {"alternative", &stubArtifactF{
- kind: pkg.KindExec,
- params: []byte("substitutable artifact"),
- deps: []pkg.Artifact{newStubFile(
- pkg.KindHTTPGet,
- pkg.ID{0xff, 8},
- nil,
- []byte("substitutable dependency"),
- nil,
- )},
-
- cure: func(f *pkg.FContext) error {
- return makeSample(&f.TContext)
- },
- }, base.Append(
- "identifier",
- "gIH5eti07nBAhVti3ZTn8EIGOBCZWWvNpxg5CmCZlDzIC4mBdomPmQLeEpf1IQg9",
- ), want, pkg.WNew, nil},
-
- {"substitutable", &stubArtifactF{
- kind: pkg.KindExec,
- params: []byte("substitutable artifact"),
- deps: []pkg.Artifact{newStubFile(
- pkg.KindHTTPGet,
- pkg.ID{0xff, 10},
- nil,
- []byte("substitutable dependency"),
- nil,
- )},
-
- cure: func(f *pkg.FContext) error {
- panic("substitution missed")
- },
- }, base.Append(
- "identifier",
- "VGjpp7NVw3OYLpgOQumfM0KcJgY3suz6torykUczcg4bGT24ySkPn5hy-4dNqqkR",
- ), want, pkg.WSubstitute, nil},
- })
-
- if c0, err := pkg.Open(
- t.Context(),
- message.New(nil),
- base, &skipLock,
- ); err != nil {
- t.Fatalf("open: error = %v", err)
- } else {
- t.Cleanup(c.Close)
- cureMany(t, c0, []cureStep{
- {"substitutable", &stubArtifactF{
- kind: pkg.KindExec,
- params: []byte("substitutable artifact"),
- deps: []pkg.Artifact{newStubFile(
- pkg.KindHTTPGet,
- pkg.ID{0xff, 0xff, 0xfd, 0xfd},
- nil,
- []byte("substitutable dependency"),
- nil,
- )},
-
- cure: func(f *pkg.FContext) error {
- panic("substitution missed")
- },
- }, base.Append(
- "identifier",
- "zeZ4JEZ0atAKl6Am67cBID6-KR18nZGgeYfU4qTuYaWhQC4eAn0dyTXdIBH9Bos8",
- ), want, pkg.WSubstitute, nil},
- })
- }
-
- if dents, err := os.ReadDir(base.Append("status").String()); err != nil {
- t.Fatal(err)
- } else if len(dents) > 0 {
- t.Errorf("ReadDir: %v", dents)
- }
-
- }, expectsFS{
- ".": {Mode: fs.ModeDir | 0700},
-
- "checksum": {Mode: fs.ModeDir | 0700},
- "checksum/7lfQ4QwSpV8nw7IDh0JiQ_jqUPrPv3_Vfie034RxsSy-cy4vO8DVvxgpx2LW08oO": {Mode: 0400, Data: []byte("substitutable dependency")},
- "checksum/qRN6in76LndiiOZJheHkwyW8UT1N5-f-bXvHfDvwrMw2fSkOoZdh8pWE1qhLk65b": {Mode: fs.ModeDir | 0500},
- "checksum/qRN6in76LndiiOZJheHkwyW8UT1N5-f-bXvHfDvwrMw2fSkOoZdh8pWE1qhLk65b/check": {Mode: 0400, Data: []byte{0, 0}},
- "checksum/qRN6in76LndiiOZJheHkwyW8UT1N5-f-bXvHfDvwrMw2fSkOoZdh8pWE1qhLk65b/lib": {Mode: fs.ModeDir | 0700},
- "checksum/qRN6in76LndiiOZJheHkwyW8UT1N5-f-bXvHfDvwrMw2fSkOoZdh8pWE1qhLk65b/lib/pkgconfig": {Mode: fs.ModeDir | 0700},
- "checksum/qRN6in76LndiiOZJheHkwyW8UT1N5-f-bXvHfDvwrMw2fSkOoZdh8pWE1qhLk65b/lib/libedac.so": {Mode: fs.ModeSymlink | 0777, Data: []byte("/proc/nonexistent/libedac.so")},
-
- "identifier": {Mode: fs.ModeDir | 0700},
- "identifier/HnySzeLQvSBZuTUcvfmLEX_OmH4yJWWH788NxuLuv7kVn8_uPM6Ks4rqFWM2NZJY": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/qRN6in76LndiiOZJheHkwyW8UT1N5-f-bXvHfDvwrMw2fSkOoZdh8pWE1qhLk65b")},
- "identifier/Zx5ZG9BAwegNT3zQwCySuI2ktCXxNgxirkGLFjW4FW06PtojYVaCdtEw8yuntPLa": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/qRN6in76LndiiOZJheHkwyW8UT1N5-f-bXvHfDvwrMw2fSkOoZdh8pWE1qhLk65b")},
- "identifier/zeZ4JEZ0atAKl6Am67cBID6-KR18nZGgeYfU4qTuYaWhQC4eAn0dyTXdIBH9Bos8": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/qRN6in76LndiiOZJheHkwyW8UT1N5-f-bXvHfDvwrMw2fSkOoZdh8pWE1qhLk65b")},
- "identifier/___9_QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/7lfQ4QwSpV8nw7IDh0JiQ_jqUPrPv3_Vfie034RxsSy-cy4vO8DVvxgpx2LW08oO")},
- "identifier/_wgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/7lfQ4QwSpV8nw7IDh0JiQ_jqUPrPv3_Vfie034RxsSy-cy4vO8DVvxgpx2LW08oO")},
- "identifier/_woAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/7lfQ4QwSpV8nw7IDh0JiQ_jqUPrPv3_Vfie034RxsSy-cy4vO8DVvxgpx2LW08oO")},
- "identifier/VGjpp7NVw3OYLpgOQumfM0KcJgY3suz6torykUczcg4bGT24ySkPn5hy-4dNqqkR": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/qRN6in76LndiiOZJheHkwyW8UT1N5-f-bXvHfDvwrMw2fSkOoZdh8pWE1qhLk65b")},
- "identifier/gIH5eti07nBAhVti3ZTn8EIGOBCZWWvNpxg5CmCZlDzIC4mBdomPmQLeEpf1IQg9": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/qRN6in76LndiiOZJheHkwyW8UT1N5-f-bXvHfDvwrMw2fSkOoZdh8pWE1qhLk65b")},
-
- "substitute": {Mode: fs.ModeDir | 0700},
- "substitute/nWPg893oqn_YNN8kgfZrs_LVLwP90e0mKxqU8UwoazQh-yBPwhoviD7of6YALx-M": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/qRN6in76LndiiOZJheHkwyW8UT1N5-f-bXvHfDvwrMw2fSkOoZdh8pWE1qhLk65b")},
-
- "work": {Mode: fs.ModeDir | 0700},
- }},
-
- {"pending", pkg.CValidateKnown, nil, func(t *testing.T, base *check.Absolute, c *pkg.Cache) {
- wantErr := stub.UniqueError(0xcafe)
- n, ready := make(chan struct{}), make(chan struct{})
- go func() {
- if _, _, err := c.Cure(overrideIdent{pkg.ID{0xff}, &stubArtifact{
- kind: pkg.KindTar,
- cure: func(t *pkg.TContext) error {
- close(ready)
- <-n
- return wantErr
- },
- }}); !reflect.DeepEqual(err, wantErr) {
- panic(fmt.Sprintf("Cure: error = %v, want %v", err, wantErr))
- }
- }()
-
- <-ready
- wCureDone := make(chan struct{})
- go func() {
- if _, _, err := c.Cure(overrideIdent{pkg.ID{0xff}, &stubArtifact{
- kind: pkg.KindTar,
- }}); !reflect.DeepEqual(err, wantErr) {
- panic(fmt.Sprintf("Cure: error = %v, want %v", err, wantErr))
- }
- close(wCureDone)
- }()
-
- // check cache activity while a cure is blocking
- cureMany(t, c, []cureStep{
- {"error passthrough", newStubFile(
- pkg.KindHTTPGet,
- pkg.ID{0xff, 1},
- nil,
- nil, stub.UniqueError(0xbad),
- ), nil, nil, pkg.WNew, stub.UniqueError(0xbad)},
-
- {"file output", overrideIdent{pkg.ID{0xff, 2}, &stubArtifact{
- kind: pkg.KindTar,
- cure: func(t *pkg.TContext) error {
- return os.WriteFile(
- t.GetWorkDir().String(),
- []byte{0},
- 0400,
- )
- },
- }}, nil, nil, pkg.WNew, errors.New(
- "non-file artifact produced regular file",
- )},
- })
-
- wantErrScrub := &pkg.ScrubError{
- Errs: map[unique.Handle[string]][]error{
- base.Handle(): {errors.New("scrub began with pending artifacts")},
- },
- }
- if err := c.Scrub(1 << 6); !reflect.DeepEqual(err, wantErrScrub) {
- t.Fatalf("Scrub: error = %#v, want %#v", err, wantErrScrub)
- }
-
- notify := c.Done(unique.Make(pkg.ID{0xff}))
- go close(n)
- if notify != nil {
- <-notify
- }
- for c.Done(unique.Make(pkg.ID{0xff})) != nil {
- }
- <-wCureDone
- }, expectsFS{
- ".": {Mode: fs.ModeDir | 0700},
- "checksum": {Mode: fs.ModeDir | 0700},
- "identifier": {Mode: fs.ModeDir | 0700},
- "substitute": {Mode: fs.ModeDir | 0700},
- "work": {Mode: fs.ModeDir | 0700},
- }},
-
- {"cancel abort block", pkg.CValidateKnown, nil, func(t *testing.T, base *check.Absolute, c *pkg.Cache) {
- var wg sync.WaitGroup
- defer wg.Wait()
-
- var started sync.WaitGroup
- defer started.Wait()
-
- blockCures := func(d byte, e stub.UniqueError, n int) {
- started.Add(n)
- for i := range n {
- wg.Go(func() {
- if _, _, err := c.Cure(overrideIdent{pkg.ID{d, byte(i)}, &stubArtifact{
- kind: pkg.KindTar,
- cure: func(t *pkg.TContext) error {
- started.Done()
- <-t.Unwrap().Done()
- return e + stub.UniqueError(i)
- },
- }}); !reflect.DeepEqual(err, e+stub.UniqueError(i)) {
- panic(err)
- }
- })
- }
- started.Wait()
- }
-
- blockCures(0xfd, 0xbad, 16)
- c.Abort()
- wg.Wait()
-
- blockCures(0xfd, 0xcafe, 16)
- c.Abort()
- wg.Wait()
-
- blockCures(0xff, 0xbad, 1)
- if !c.Cancel(unique.Make(pkg.ID{0xff})) {
- t.Fatal("missed cancellation")
- }
- wg.Wait()
-
- blockCures(0xff, 0xcafe, 1)
- if !c.Cancel(unique.Make(pkg.ID{0xff})) {
- t.Fatal("missed cancellation")
- }
- wg.Wait()
-
- for c.Cancel(unique.Make(pkg.ID{0xff})) {
- }
-
- c.Close()
- c.Abort()
- }, expectsFS{
- ".": {Mode: fs.ModeDir | 0700},
- "checksum": {Mode: fs.ModeDir | 0700},
- "identifier": {Mode: fs.ModeDir | 0700},
- "substitute": {Mode: fs.ModeDir | 0700},
- "work": {Mode: fs.ModeDir | 0700},
- }},
-
- {"no assume checksum", 0, nil, func(t *testing.T, base *check.Absolute, c *pkg.Cache) {
- makeGarbage := func(work *check.Absolute, wantErr error) error {
- if err := os.Mkdir(work.String(), 0700); err != nil {
- return err
- }
-
- if err := os.WriteFile(work.Append(
- "check",
- ).String(), nil, 0400); err != nil {
- return err
- }
-
- return wantErr
- }
-
- want := expectsChecksum(pkg.MustDecode(
- "Aubi5EG4_Y8DhL9bQ3Q4HFBhLRF7X5gt9D3CNCQfT-TeBtlRXc7Zi_JYZEMoCC7M",
- ))
-
- cureMany(t, c, []cureStep{
- {"create", overrideChecksum{want.hash(), overrideIdent{pkg.ID{0xff, 0}, &stubArtifact{
- kind: pkg.KindTar,
- cure: func(t *pkg.TContext) error {
- return makeGarbage(t.GetWorkDir(), nil)
- },
- }}}, base.Append(
- "identifier",
- pkg.Encode(pkg.ID{0xff, 0}),
- ), want, pkg.WNew, nil},
-
- {"reject", overrideChecksum{want.hash(), overrideIdent{pkg.ID{0xfe, 1}, &stubArtifact{
- kind: pkg.KindTar,
- cure: func(t *pkg.TContext) error {
- return makeGarbage(t.GetWorkDir(), stub.UniqueError(0xbad))
- },
- }}}, nil, nil, pkg.WNew, stub.UniqueError(0xbad)},
-
- {"match", overrideChecksum{want.hash(), overrideIdent{pkg.ID{0xff, 1}, &stubArtifact{
- kind: pkg.KindTar,
- cure: func(t *pkg.TContext) error {
- return makeGarbage(t.GetWorkDir(), nil)
- },
- }}}, base.Append(
- "identifier",
- pkg.Encode(pkg.ID{0xff, 1}),
- ), want, pkg.WNew, nil},
- })
- }, expectsFS{
- ".": {Mode: fs.ModeDir | 0700},
-
- "checksum": {Mode: fs.ModeDir | 0700},
- "checksum/Aubi5EG4_Y8DhL9bQ3Q4HFBhLRF7X5gt9D3CNCQfT-TeBtlRXc7Zi_JYZEMoCC7M": {Mode: fs.ModeDir | 0500},
- "checksum/Aubi5EG4_Y8DhL9bQ3Q4HFBhLRF7X5gt9D3CNCQfT-TeBtlRXc7Zi_JYZEMoCC7M/check": {Mode: 0400, Data: []byte{}},
-
- "identifier": {Mode: fs.ModeDir | 0700},
- "identifier/_wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/Aubi5EG4_Y8DhL9bQ3Q4HFBhLRF7X5gt9D3CNCQfT-TeBtlRXc7Zi_JYZEMoCC7M")},
- "identifier/_wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/Aubi5EG4_Y8DhL9bQ3Q4HFBhLRF7X5gt9D3CNCQfT-TeBtlRXc7Zi_JYZEMoCC7M")},
-
- "substitute": {Mode: fs.ModeDir | 0700},
-
- "work": {Mode: fs.ModeDir | 0700},
- }},
-
- {"scrub", 0, nil, func(t *testing.T, base *check.Absolute, c *pkg.Cache) {
- cureMany(t, c, []cureStep{
- {"bad measured file", newStubFile(
- pkg.KindHTTPGet,
- pkg.Checksum{0xfe, 0},
- &pkg.Checksum{0xff, 0},
- []byte{0}, nil,
- ), base.Append(
- "identifier",
- pkg.Encode(pkg.Checksum{0xfe, 0}),
- ), expectsChecksum{0xff, 0}, pkg.WNew, nil},
- })
-
- for _, p := range [][]string{
- {"identifier", "invalid"},
- {"identifier", pkg.Encode(pkg.ID{0xfe, 0xff})},
- {"checksum", "invalid"},
- } {
- if err := os.WriteFile(
- base.Append(p...).String(),
- nil,
- 0400,
- ); err != nil {
- t.Fatal(err)
- }
- }
-
- for _, p := range [][]string{
- {"../nonexistent", "checksum", pkg.Encode(pkg.Checksum{0xff, 0xff})},
- {"../nonexistent", "identifier", pkg.Encode(pkg.Checksum{0xfe, 0xfe})},
- } {
- if err := os.Symlink(
- p[0],
- base.Append(p[1:]...).String(),
- ); err != nil {
- t.Fatal(err)
- }
- }
-
- wantErr := newWantScrubError(base)
- if err := c.Scrub(1 << 6); !reflect.DeepEqual(err, wantErr) {
- t.Fatalf("Scrub: error =\n%s\nwant\n%s", err, wantErr)
- }
- }, expectsFS{
- ".": {Mode: fs.ModeDir | 0700},
- "checksum": {Mode: fs.ModeDir | 0700},
- "identifier": {Mode: fs.ModeDir | 0700},
- "substitute": {Mode: fs.ModeDir | 0700},
- "work": {Mode: fs.ModeDir | 0700},
- }},
-
- {"status substitute clean", 0, nil, func(t *testing.T, base *check.Absolute, c *pkg.Cache) {
- destroyed := &stubArtifactF{
- kind: pkg.KindExec,
- params: []byte("destroyed"),
- deps: []pkg.Artifact{
- pkg.NewFile("destroyed-input", []byte("destroyed")),
- },
- cure: func(f *pkg.FContext) error {
- if w, err := f.GetStatusWriter(); err != nil {
- return err
- } else if _, err = w.Write([]byte("destroyed")); err != nil {
- return err
- }
-
- p := f.GetWorkDir()
- if err := os.MkdirAll(p.String(), 0755); err != nil {
- return err
- }
- return os.WriteFile(p.Append("result").String(), nil, 0444)
- },
- }
- substituted := new(*destroyed)
- substituted.deps = []pkg.Artifact{
- pkg.NewFile("destroyed-input-0", []byte("destroyed")),
- }
- substituted.cure = func(*pkg.FContext) error {
- panic("substitutable cure reached")
- }
-
- cureMany(t, c, []cureStep{
- {"destroyed", destroyed, base.Append(
- "identifier",
- pkg.Encode(c.Ident(destroyed).Value()),
- ), expectsFS{
- ".": {Mode: fs.ModeDir | 0500},
- "result": {Mode: 0444},
- }, pkg.WNew, nil},
-
- {"substituted", substituted, base.Append(
- "identifier",
- pkg.Encode(c.Ident(substituted).Value()),
- ), expectsFS{
- ".": {Mode: fs.ModeDir | 0500},
- "result": {Mode: 0444},
- }, pkg.WSubstitute, nil},
- })
- }, expectsFS{
- ".": {Mode: fs.ModeDir | 0700},
-
- "checksum": {Mode: fs.ModeDir | 0700},
- "checksum/UjZSrgz7_B7XMd9fHU7jM33UZhWlFgX0rz7JZbCBYR28bCS7jr_CAJdcDhi52ruE": {Mode: fs.ModeDir | 0500},
- "checksum/UjZSrgz7_B7XMd9fHU7jM33UZhWlFgX0rz7JZbCBYR28bCS7jr_CAJdcDhi52ruE/result": {Mode: 0444},
- "checksum/wILUy2izpj2sgKJVhGUGIAde1XVuqvp5BpFMIQHanT5Q8R6jK4QPVSrJsjZh-njV": {Mode: 0400, Data: []byte("destroyed")},
-
- "identifier": {Mode: fs.ModeDir | 0700},
- "identifier/CLyyxJWn1yUGFs_0KnJ4ZSU2hH4-elvGFRB36x14LrNrKBJPxvORhL9O4Rc7oeYU": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/wILUy2izpj2sgKJVhGUGIAde1XVuqvp5BpFMIQHanT5Q8R6jK4QPVSrJsjZh-njV")},
- "identifier/arv8a6z4i0x6pUb5Z2T-3iE4ETvyZj-uReHGKsS7uiBgMgKNEOzTGG3LIZb8vp0L": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/wILUy2izpj2sgKJVhGUGIAde1XVuqvp5BpFMIQHanT5Q8R6jK4QPVSrJsjZh-njV")},
- "identifier/heRgWhNJmhm898V68kw0ta76t4rP1o29tYW_TrdyBWXGfo37K3QWA7Z-JkLXAwcn": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/UjZSrgz7_B7XMd9fHU7jM33UZhWlFgX0rz7JZbCBYR28bCS7jr_CAJdcDhi52ruE")},
- "identifier/q-VoVBI3IjcWTqwIokpi3y05CP113CHgHslc-XWnhOvDULwzVc3q9Y5xOCm_YyLZ": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/UjZSrgz7_B7XMd9fHU7jM33UZhWlFgX0rz7JZbCBYR28bCS7jr_CAJdcDhi52ruE")},
-
- "status": {Mode: fs.ModeDir | 0700},
- "status/q-VoVBI3IjcWTqwIokpi3y05CP113CHgHslc-XWnhOvDULwzVc3q9Y5xOCm_YyLZ": {Mode: fs.ModeSymlink | 0777, Data: []byte("dP-6_wIDRRouOaOF-nkBy-IaUbLdYHbOUTrptu7j_qfW01mnHSjYJ0oykUmvUd2x")},
- "status/heRgWhNJmhm898V68kw0ta76t4rP1o29tYW_TrdyBWXGfo37K3QWA7Z-JkLXAwcn": {Mode: 0400, Data: []byte(statusHeader + "destroyed")},
- "status/dP-6_wIDRRouOaOF-nkBy-IaUbLdYHbOUTrptu7j_qfW01mnHSjYJ0oykUmvUd2x": {Mode: 0400, Data: []byte(statusHeader + "destroyed")},
-
- "substitute": {Mode: fs.ModeDir | 0700},
- "substitute/dP-6_wIDRRouOaOF-nkBy-IaUbLdYHbOUTrptu7j_qfW01mnHSjYJ0oykUmvUd2x": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/UjZSrgz7_B7XMd9fHU7jM33UZhWlFgX0rz7JZbCBYR28bCS7jr_CAJdcDhi52ruE")},
-
- "work": {Mode: fs.ModeDir | 0700},
- }},
-
- {"extern", 0, nil, func(t *testing.T, base *check.Absolute, c *pkg.Cache) {
- a := &stubArtifactF{
- kind: pkg.KindExec,
- params: []byte("extern"),
- }
- wantIdent := c.Ident(a)
- wantOutput := expectsFS{
- ".": {Mode: fs.ModeDir | 0500},
- "result": {Mode: fs.ModeSymlink | 0777, Data: []byte("/proc/nonexistent")},
- }
- var wantChecksum pkg.Checksum
- if err := pkg.SumFS(
- &wantChecksum,
- fstest.MapFS(wantOutput),
- ".",
- ); err != nil {
- t.Fatal(err)
- }
- wantChecksumH := unique.Make(wantChecksum)
-
- _a := &stubArtifactF{
- kind: pkg.KindExec,
- params: []byte("extern substitute"),
- deps: []pkg.Artifact{pkg.NewFile("", nil)},
- }
- _wantIdent := c.Ident(_a)
- _wantOutput := expectsFS{
- ".": {Mode: fs.ModeDir | 0500},
- }
- var _wantChecksum pkg.Checksum
- if err := pkg.SumFS(
- &_wantChecksum,
- fstest.MapFS(_wantOutput),
- ".",
- ); err != nil {
- t.Fatal(err)
- }
- _wantChecksumH := unique.Make(_wantChecksum)
-
- kca := pkg.NewExec(
- "", "",
- new(pkg.Checksum), 0, false, false,
- fhs.AbsRoot, nil, fhs.AbsRoot, nil,
- )
- kcIdent := c.Ident(kca)
-
- c.SetExternal(stubExtern{
- artifact: map[unique.Handle[pkg.ID]]pkg.Checksum{
- wantIdent: wantChecksum,
- _wantIdent: _wantChecksum,
- kcIdent: wantChecksum,
- },
- checksum: map[unique.Handle[pkg.Checksum]]fstest.MapFS{
- wantChecksumH: fstest.MapFS(wantOutput),
- _wantChecksumH: fstest.MapFS(_wantOutput),
- },
- status: map[unique.Handle[pkg.ID]]string{
- wantIdent: "\x00",
- kcIdent: "unreachable",
- },
- })
-
- cureMany(t, c, []cureStep{
- {"extern", a, base.Append(
- "identifier",
- pkg.Encode(wantIdent.Value()),
- ), wantOutput, pkg.WExternal, nil},
-
- {"substitute", _a, base.Append(
- "identifier",
- pkg.Encode(_wantIdent.Value()),
- ), _wantOutput, pkg.WExternal, nil},
-
- {"mismatch", kca, nil, nil, pkg.WExternal, &pkg.ChecksumMismatchError{
- Got: wantChecksum,
- }},
- })
- }, expectsFS{
- ".": {Mode: fs.ModeDir | 0700},
-
- "checksum": {Mode: fs.ModeDir | 0700},
- "checksum/MGWmEfjut2QE2xPJwTsmUzpff4BN_FEnQ7T0j7gvUCCiugJQNwqt9m151fm9D1yU": {Mode: fs.ModeDir | 0500},
- "checksum/OLBgp1GsljhM2TJ-sbHjaiH9txEUvgdDTAzHv2P24donTt6_529l-9Ua0vFImLlb": {Mode: 0400},
- "checksum/fHkl_RuHOoc4rso__nV-qreikovd6Yhrq5mpBlkf5hmPGaxDlik2bYOQ4dhUQjtl": {Mode: fs.ModeDir | 0500},
- "checksum/fHkl_RuHOoc4rso__nV-qreikovd6Yhrq5mpBlkf5hmPGaxDlik2bYOQ4dhUQjtl/result": {Mode: fs.ModeSymlink | 0777, Data: []byte("/proc/nonexistent")},
-
- "identifier": {Mode: fs.ModeDir | 0700},
- "identifier/k8yyhlBV3JpYzzywAnrRWkfp2TmgIDNC6FqMFwrrR2x0C3unBLveDNKgigOjG9MM": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/MGWmEfjut2QE2xPJwTsmUzpff4BN_FEnQ7T0j7gvUCCiugJQNwqt9m151fm9D1yU")},
- "identifier/Xys8hPpJsKirZmTTuT7SwQ6661TCp_ZRu8iUjPPD7pC5E3ll7xw4zhNlZ2PVcz_-": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/fHkl_RuHOoc4rso__nV-qreikovd6Yhrq5mpBlkf5hmPGaxDlik2bYOQ4dhUQjtl")},
- "identifier/8sInO_dhPW9kweit7jVuH_vtMkRxlZT7XE4_yEKPZmpGkgVxkmxz0OpXgbMsH6ET": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/MGWmEfjut2QE2xPJwTsmUzpff4BN_FEnQ7T0j7gvUCCiugJQNwqt9m151fm9D1yU")},
- "identifier/ofaXbB5gIza_7W4Rzo5XDe_8FwlCPKWn3TBcmGgFAkkTWMl5GXGmOzX89Jd2Mk2A": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/OLBgp1GsljhM2TJ-sbHjaiH9txEUvgdDTAzHv2P24donTt6_529l-9Ua0vFImLlb")},
- "identifier/8VL-egZySw-RbnHZtxGWdf5Z2v9S9CihrdFwa54Bc5EYMQcEgWEem7QrdCTWlCb8": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/fHkl_RuHOoc4rso__nV-qreikovd6Yhrq5mpBlkf5hmPGaxDlik2bYOQ4dhUQjtl")},
-
- "status": {Mode: fs.ModeDir | 0700},
- "status/8VL-egZySw-RbnHZtxGWdf5Z2v9S9CihrdFwa54Bc5EYMQcEgWEem7QrdCTWlCb8": {Mode: 0400, Data: []byte("\x00")},
-
- "substitute": {Mode: fs.ModeDir | 0700},
- "substitute/socGRnhdsJlJ4Z01ZwHFZdLzFH0rWvoaJrylcUKtvhBdGsE7VoYl-vdUuvfK8B4I": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/MGWmEfjut2QE2xPJwTsmUzpff4BN_FEnQ7T0j7gvUCCiugJQNwqt9m151fm9D1yU")},
-
- "work": {Mode: fs.ModeDir | 0700},
- }},
-
- {"extern shallow", pkg.CExternShallow, nil, func(t *testing.T, base *check.Absolute, c *pkg.Cache) {
- a := &stubArtifactF{
- kind: pkg.KindExec,
- params: []byte("extern"),
- }
- wantIdent := c.Ident(a)
- wantOutput := expectsFS{
- ".": {Mode: fs.ModeDir | 0500},
- "result": {Mode: fs.ModeSymlink | 0777, Data: []byte("/proc/nonexistent")},
- }
- var wantChecksum pkg.Checksum
- if err := pkg.SumFS(
- &wantChecksum,
- fstest.MapFS(wantOutput),
- ".",
- ); err != nil {
- t.Fatal(err)
- }
- wantChecksumH := unique.Make(wantChecksum)
-
- _a := &stubArtifactF{
- kind: pkg.KindExec,
- params: []byte("extern substitute"),
- deps: []pkg.Artifact{pkg.NewFile("", nil)},
- }
- _wantIdent := c.Ident(_a)
- _wantOutput := expectsFS{
- ".": {Mode: fs.ModeDir | 0500},
- }
- var _wantChecksum pkg.Checksum
- if err := pkg.SumFS(
- &_wantChecksum,
- fstest.MapFS(_wantOutput),
- ".",
- ); err != nil {
- t.Fatal(err)
- }
- _wantChecksumH := unique.Make(_wantChecksum)
-
- kca := pkg.NewExec(
- "", "",
- new(pkg.Checksum), 0, false, false,
- fhs.AbsRoot, nil, fhs.AbsRoot, nil,
- )
- kcIdent := c.Ident(kca)
-
- fia := &stubArtifactF{
- kind: pkg.KindExec,
- params: []byte("flood input"),
- deps: []pkg.Artifact{_a},
- }
- fiaIdent := c.Ident(fia)
-
- flia := &stubArtifactF{
- kind: pkg.KindExec,
- params: []byte("flood input local"),
- deps: []pkg.Artifact{_a},
- }
- fliaIdent := c.Ident(flia)
-
- h := &stubArtifactF{
- kind: pkg.KindExec,
- params: []byte("hanging input"),
- }
-
- fhia := &stubArtifactF{
- kind: pkg.KindExec,
- params: []byte("flood input local"),
- deps: []pkg.Artifact{h},
- }
- fhiaIdent := c.Ident(fhia)
-
- c.SetExternal(stubExtern{
- artifact: map[unique.Handle[pkg.ID]]pkg.Checksum{
- wantIdent: wantChecksum,
- _wantIdent: _wantChecksum,
- kcIdent: wantChecksum,
- fiaIdent: wantChecksum,
- fliaIdent: wantChecksum,
- fhiaIdent: wantChecksum,
- },
- checksum: map[unique.Handle[pkg.Checksum]]fstest.MapFS{
- wantChecksumH: fstest.MapFS(wantOutput),
- _wantChecksumH: fstest.MapFS(_wantOutput),
- },
- status: map[unique.Handle[pkg.ID]]string{
- wantIdent: "\x00",
- kcIdent: "unreachable",
- },
- })
-
- cureMany(t, c, []cureStep{
- {"extern", a, base.Append(
- "identifier",
- pkg.Encode(wantIdent.Value()),
- ), wantOutput, pkg.WExternal, nil},
-
- {"flood shallow extern", fia, base.Append(
- "identifier",
- pkg.Encode(fiaIdent.Value()),
- ), wantOutput, pkg.WExternal, nil},
-
- {"substitute", _a, base.Append(
- "identifier",
- pkg.Encode(_wantIdent.Value()),
- ), _wantOutput, pkg.WExternal, nil},
-
- {"flood shallow local", flia, base.Append(
- "identifier",
- pkg.Encode(fliaIdent.Value()),
- ), wantOutput, pkg.WExternal, nil},
-
- {"flood shallow hanging", fhia, nil, nil,
- pkg.WNew, pkg.HangingInputError(c.Ident(h))},
-
- {"mismatch", kca, nil, nil, pkg.WExternal, &pkg.ChecksumMismatchError{
- Got: wantChecksum,
- }},
- })
- }, expectsFS{
- ".": {Mode: fs.ModeDir | 0700},
-
- "checksum": {Mode: fs.ModeDir | 0700},
- "checksum/MGWmEfjut2QE2xPJwTsmUzpff4BN_FEnQ7T0j7gvUCCiugJQNwqt9m151fm9D1yU": {Mode: fs.ModeDir | 0500},
- "checksum/fHkl_RuHOoc4rso__nV-qreikovd6Yhrq5mpBlkf5hmPGaxDlik2bYOQ4dhUQjtl": {Mode: fs.ModeDir | 0500},
- "checksum/fHkl_RuHOoc4rso__nV-qreikovd6Yhrq5mpBlkf5hmPGaxDlik2bYOQ4dhUQjtl/result": {Mode: fs.ModeSymlink | 0777, Data: []byte("/proc/nonexistent")},
-
- "identifier": {Mode: fs.ModeDir | 0700},
- "identifier/3fYJjSiWhklt7TK9MPVLGk5_8AIU8ostTcFPXULJf_qeAVG6pmC-Cqqu4ZhEXRxn": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/fHkl_RuHOoc4rso__nV-qreikovd6Yhrq5mpBlkf5hmPGaxDlik2bYOQ4dhUQjtl")},
- "identifier/8VL-egZySw-RbnHZtxGWdf5Z2v9S9CihrdFwa54Bc5EYMQcEgWEem7QrdCTWlCb8": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/fHkl_RuHOoc4rso__nV-qreikovd6Yhrq5mpBlkf5hmPGaxDlik2bYOQ4dhUQjtl")},
- "identifier/8sInO_dhPW9kweit7jVuH_vtMkRxlZT7XE4_yEKPZmpGkgVxkmxz0OpXgbMsH6ET": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/MGWmEfjut2QE2xPJwTsmUzpff4BN_FEnQ7T0j7gvUCCiugJQNwqt9m151fm9D1yU")},
- "identifier/Xys8hPpJsKirZmTTuT7SwQ6661TCp_ZRu8iUjPPD7pC5E3ll7xw4zhNlZ2PVcz_-": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/fHkl_RuHOoc4rso__nV-qreikovd6Yhrq5mpBlkf5hmPGaxDlik2bYOQ4dhUQjtl")},
- "identifier/k8yyhlBV3JpYzzywAnrRWkfp2TmgIDNC6FqMFwrrR2x0C3unBLveDNKgigOjG9MM": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/MGWmEfjut2QE2xPJwTsmUzpff4BN_FEnQ7T0j7gvUCCiugJQNwqt9m151fm9D1yU")},
- "identifier/mXlNz_v77nW7jstn_rJn4RL7dCQlkakM0y-HjO6tkDubtzaj-wCmW1hIr2Gk64_O": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/fHkl_RuHOoc4rso__nV-qreikovd6Yhrq5mpBlkf5hmPGaxDlik2bYOQ4dhUQjtl")},
-
- "status": {Mode: fs.ModeDir | 0700},
- "status/8VL-egZySw-RbnHZtxGWdf5Z2v9S9CihrdFwa54Bc5EYMQcEgWEem7QrdCTWlCb8": {Mode: 0400, Data: []byte("\x00")},
-
- "substitute": {Mode: fs.ModeDir | 0700},
- "substitute/socGRnhdsJlJ4Z01ZwHFZdLzFH0rWvoaJrylcUKtvhBdGsE7VoYl-vdUuvfK8B4I": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/MGWmEfjut2QE2xPJwTsmUzpff4BN_FEnQ7T0j7gvUCCiugJQNwqt9m151fm9D1yU")},
- "substitute/MccYezQ4pshkeBV4w_aAEIwvZdKHL3OAgAkR3ouZ43EF94Ur1HBHaN7njPfJAj50": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/fHkl_RuHOoc4rso__nV-qreikovd6Yhrq5mpBlkf5hmPGaxDlik2bYOQ4dhUQjtl")},
- "substitute/VV5W0_DiA1iylaqbKFThp1ZpV_y1ccVS1XyqDnDaXoHQ-EEyPI4XFrQHcHOF2hWG": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/fHkl_RuHOoc4rso__nV-qreikovd6Yhrq5mpBlkf5hmPGaxDlik2bYOQ4dhUQjtl")},
-
- "work": {Mode: fs.ModeDir | 0700},
- }},
- }
- checkWithCache(t, testCases)
-}
-
-func TestErrors(t *testing.T) {
- t.Parallel()
-
- testCases := []struct {
- name string
- err error
- want string
- }{
- {"InvalidLookupError", pkg.InvalidLookupError{
- 0xff, 0xf0,
- }, "attempting to look up non-input artifact __AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"},
-
- {"InvalidArtifactError", pkg.InvalidArtifactError{
- 0xff, 0xfd,
- }, "artifact __0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA cannot be cured"},
-
- {"ChecksumMismatchError", &pkg.ChecksumMismatchError{
- Want: (pkg.Checksum)(bytes.Repeat([]byte{
- 0x75, 0xe6, 0x9d, 0x6d, 0xe7, 0x9f,
- }, 8)),
- }, "got AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" +
- " instead of deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef"},
-
- {"ResponseStatusError", pkg.ResponseStatusError(
- http.StatusNotAcceptable,
- ), "the requested URL returned non-OK status: Not Acceptable"},
-
- {"DisallowedTypeflagError", pkg.DisallowedTypeflagError(
- tar.TypeChar,
- ), "disallowed typeflag '3'"},
-
- {"InvalidFileModeError", pkg.InvalidFileModeError(
- fs.ModeSymlink | 0777,
- ), "artifact did not produce a regular file or directory"},
-
- {"NoOutputError", pkg.NoOutputError{
- // empty struct
- }, "artifact cured successfully but did not produce any output"},
-
- {"IRKindError", &pkg.IRKindError{
- Got: pkg.IRKindEnd,
- Want: pkg.IRKindIdent,
- Ancillary: 0xcafebabe,
- }, "got terminator IR value (0xcafebabe) instead of ident"},
- {"IRKindError invalid", &pkg.IRKindError{
- Got: 0xbeef,
- Want: pkg.IRKindIdent,
- Ancillary: 0xcafe,
- }, "got invalid kind 48879 IR value (0xcafe) instead of ident"},
-
- {"UnsupportedVariantError", pkg.UnsupportedVariantError(
- "rosa",
- ), `unsupported variant "rosa"`},
-
- {"UnsupportedArchError zero", pkg.UnsupportedArchError(""),
- "invalid architecture name"},
- {"UnsupportedArchError", pkg.UnsupportedArchError("riscv64"),
- "unsupported architecture riscv64"},
- }
- for _, tc := range testCases {
- t.Run(tc.name, func(t *testing.T) {
- t.Parallel()
-
- if got := tc.err.Error(); got != tc.want {
- t.Errorf("Error: %q, want %q", got, tc.want)
- }
- })
- }
-}
-
-func TestScrubError(t *testing.T) {
- t.Parallel()
-
- testCases := []struct {
- name string
- err pkg.ScrubError
- want string
- unwrap []error
- }{
- {"sample", *newWantScrubError(
- fhs.AbsVarLib.Append("cure"),
- ), `checksum mismatches:
-got vsAhtPNo4waRNOASwrQwcIPTqb3SBuJOXw2G4T1mNmVZM-wrQTRllmgXqcIIoRcX instead of _wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-
-dangling identifiers:
-_gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-_v4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-_v8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-
-errors during scrub:
- /var/lib/cure/checksum/__8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA:
- artifact did not produce a regular file or directory
- /var/lib/cure/checksum/invalid:
- illegal base64 data at input byte 4
- /var/lib/cure/identifier/_v8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA:
- readlink /var/lib/cure/identifier/_v8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA: invalid argument
- /var/lib/cure/identifier/invalid:
- illegal base64 data at input byte 4
- /var/lib/cure/nonexistent:
- illegal base64 data at input byte 8
-`, []error{
- &pkg.ChecksumMismatchError{Got: pkg.MustDecode(
- "vsAhtPNo4waRNOASwrQwcIPTqb3SBuJOXw2G4T1mNmVZM-wrQTRllmgXqcIIoRcX",
- ), Want: pkg.Checksum{0xff, 0}},
-
- pkg.InvalidFileModeError(fs.ModeSymlink),
- base64.CorruptInputError(4),
-
- &os.PathError{
- Op: "readlink",
- Path: fhs.AbsVarLib.Append("cure").Append(
- "identifier",
- pkg.Encode(pkg.ID{0xfe, 0xff}),
- ).String(),
- Err: syscall.EINVAL,
- },
-
- base64.CorruptInputError(4),
- base64.CorruptInputError(8),
- }},
-
- {"full", pkg.ScrubError{
- ChecksumMismatches: []pkg.ChecksumMismatchError{
- {Want: pkg.MustDecode("CH3AiUrCCcVOjOYLaMKKK1Da78989JtfHeIsxMzWOQFiN4mrCLDYpoDxLWqJWCUN")},
- },
- DanglingIdentifiers: []pkg.ID{
- (pkg.ID)(bytes.Repeat([]byte{0x75, 0xe6, 0x9d, 0x6d, 0xe7, 0x9f}, 8)),
- (pkg.ID)(bytes.Repeat([]byte{0x71, 0xa7, 0xde, 0x6d, 0xa6, 0xde}, 8)),
- },
- Errs: map[unique.Handle[string]][]error{
- unique.Make("/proc/nonexistent"): {
- stub.UniqueError(0xcafe),
- stub.UniqueError(0xbad),
- stub.UniqueError(0xff),
- },
- },
- }, `checksum mismatches:
-got AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA instead of CH3AiUrCCcVOjOYLaMKKK1Da78989JtfHeIsxMzWOQFiN4mrCLDYpoDxLWqJWCUN
-
-dangling identifiers:
-deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef
-cafebabecafebabecafebabecafebabecafebabecafebabecafebabecafebabe
-
-errors during scrub:
- /proc/nonexistent:
- unique error 51966 injected by the test suite
- unique error 2989 injected by the test suite
- unique error 255 injected by the test suite
-`, []error{
- &pkg.ChecksumMismatchError{Want: pkg.MustDecode("CH3AiUrCCcVOjOYLaMKKK1Da78989JtfHeIsxMzWOQFiN4mrCLDYpoDxLWqJWCUN")},
- stub.UniqueError(0xcafe),
- stub.UniqueError(0xbad),
- stub.UniqueError(0xff),
- }},
- }
- for _, tc := range testCases {
- t.Run(tc.name, func(t *testing.T) {
- t.Parallel()
-
- if got := tc.err.Error(); got != tc.want {
- t.Errorf("Error:\n\n%s\n\nwant\n\n%s", got, tc.want)
- }
-
- if unwrap := tc.err.Unwrap(); !reflect.DeepEqual(unwrap, tc.unwrap) {
- t.Errorf("Unwrap: %#v, want %#v", unwrap, tc.unwrap)
- }
- })
- }
-}
-
-func TestInputError(t *testing.T) {
- t.Parallel()
-
- makeIdent := func(ident ...byte) pkg.Artifact {
- var a overrideIdent
- copy(a.id[:], ident)
- // does not compare equal
- a.TrivialArtifact = new(stubArtifact)
- return a
- }
-
- testCases := []struct {
- name string
- err pkg.InputError
- want string
- unwrap []error
- }{
- {"simple", pkg.InputError{
- makeIdent(0xff, 9): stub.UniqueError(0xbad09),
- makeIdent(0xff, 0): stub.UniqueError(0xbad00),
- makeIdent(0xff, 0xf): stub.UniqueError(0xbad0f),
- makeIdent(0xff, 1): stub.UniqueError(0xbad01),
- }, `errors curing inputs:
- _wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA: unique error 765184 injected by the test suite
- _wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA: unique error 765185 injected by the test suite
- _wkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA: unique error 765193 injected by the test suite
- _w8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA: unique error 765199 injected by the test suite`, []error{
- stub.UniqueError(0xbad00),
- stub.UniqueError(0xbad01),
- stub.UniqueError(0xbad09),
- stub.UniqueError(0xbad0f),
- }},
-
- {"dedup", pkg.InputError{
- makeIdent(0xff, 9): stub.UniqueError(0xbad09),
- makeIdent(0xff, 9): stub.UniqueError(0xbad09),
- makeIdent(0xff, 9): stub.UniqueError(0xbad09),
- makeIdent(0xff, 0): stub.UniqueError(0xbad00),
- makeIdent(0xff, 0): stub.UniqueError(0xbad00),
- makeIdent(0xff, 1): stub.UniqueError(0xbad01),
- }, `errors curing inputs:
- _wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA: unique error 765184 injected by the test suite
- _wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA: unique error 765185 injected by the test suite
- _wkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA: unique error 765193 injected by the test suite`, []error{
- stub.UniqueError(0xbad00),
- stub.UniqueError(0xbad01),
- stub.UniqueError(0xbad09),
- }},
- }
- for _, tc := range testCases {
- t.Run(tc.name, func(t *testing.T) {
- t.Parallel()
-
- if got := tc.err.Error(); got != tc.want {
- t.Errorf("Error:\n%s\nwant\n%s", got, tc.want)
- }
-
- if unwrap := tc.err.Unwrap(); !reflect.DeepEqual(unwrap, tc.unwrap) {
- t.Errorf("Unwrap: %#v, want %#v", unwrap, tc.unwrap)
- }
- })
- }
-}
-
-// earlyFailureF is a [FloodArtifact] with a large dependency graph resulting in
-// a large [DependencyCureError].
-type earlyFailureF int
-
-func (earlyFailureF) Kind() pkg.Kind { return pkg.KindExec }
-func (earlyFailureF) Params(*pkg.IContext) {}
-func (earlyFailureF) IsExclusive() bool { return false }
-
-func (a earlyFailureF) Inputs() []pkg.Artifact {
- deps := make([]pkg.Artifact, a)
- for i := range deps {
- deps[i] = a - 1
- }
- return deps
-}
-
-func (a earlyFailureF) Cure(*pkg.FContext) error {
- if a != 0 {
- panic("unexpected cure on " + strconv.Itoa(int(a)))
- }
- return stub.UniqueError(0xcafe)
-}
-
-func BenchmarkEarlyDCE(b *testing.B) {
- msg := message.New(log.New(os.Stderr, "dce: ", 0))
- msg.SwapVerbose(testing.Verbose())
-
- for b.Loop() {
- b.StopTimer()
- c, err := pkg.Open(b.Context(), msg, check.MustAbs(b.TempDir()), nil)
- if err != nil {
- b.Fatal(err)
- }
- b.StartTimer()
- _, _, err = c.Cure(earlyFailureF(8))
- b.StopTimer()
- if !errors.Is(err, stub.UniqueError(0xcafe)) {
- b.Fatalf("Cure: error = %v", err)
- }
- c.Close()
- b.StartTimer()
- }
-}
-
-func TestDependencyCureErrorEarly(t *testing.T) {
- t.Parallel()
-
- checkWithCache(t, []cacheTestCase{
- {"early", 0, nil, func(t *testing.T, _ *check.Absolute, c *pkg.Cache) {
- _, _, err := c.Cure(earlyFailureF(8))
- if !errors.Is(err, stub.UniqueError(0xcafe)) {
- t.Fatalf("Cure: error = %v", err)
- }
- }, expectsFS{
- ".": {Mode: fs.ModeDir | 0700},
- "checksum": {Mode: fs.ModeDir | 0700},
- "identifier": {Mode: fs.ModeDir | 0700},
- "substitute": {Mode: fs.ModeDir | 0700},
- "work": {Mode: fs.ModeDir | 0700},
- }},
- })
-}
-
-func TestOpen(t *testing.T) {
- t.Parallel()
-
- t.Run("nonexistent", func(t *testing.T) {
- t.Parallel()
-
- wantErr := &os.PathError{
- Op: "mkdir",
- Path: container.Nonexistent,
- Err: syscall.ENOENT,
- }
- if _, err := pkg.Open(
- t.Context(),
- message.New(nil),
- check.MustAbs(container.Nonexistent),
- nil,
- ); !reflect.DeepEqual(err, wantErr) {
- t.Errorf("Open: error = %#v, want %#v", err, wantErr)
- }
- })
-
- t.Run("permission", func(t *testing.T) {
- t.Parallel()
-
- tempDir := check.MustAbs(t.TempDir())
- if err := os.Chmod(tempDir.String(), 0); err != nil {
- t.Fatal(err)
- } else {
- t.Cleanup(func() {
- if err = os.Chmod(tempDir.String(), 0700); err != nil {
- t.Fatal(err)
- }
- })
- }
-
- wantErr := &os.PathError{
- Op: "mkdir",
- Path: tempDir.Append("cache").String(),
- Err: syscall.EACCES,
- }
- if _, err := pkg.Open(
- t.Context(),
- message.New(nil),
- tempDir.Append("cache"),
- nil,
- ); !reflect.DeepEqual(err, wantErr) {
- t.Errorf("Open: error = %#v, want %#v", err, wantErr)
- }
- })
-
- t.Run("dirty", func(t *testing.T) {
- t.Parallel()
-
- tempDir := check.MustAbs(t.TempDir())
- if err := os.MkdirAll(tempDir.Append(
- "cache",
- "work",
- "dirty",
- ).String(), 0755); err != nil {
- t.Fatal(err)
- }
-
- wantErr := errors.New("work is not empty, scrub likely required")
- if _, err := pkg.Open(
- t.Context(),
- message.New(nil),
- tempDir.Append("cache"),
- nil,
- ); !reflect.DeepEqual(err, wantErr) {
- t.Errorf("Open: error = %#v, want %#v", err, wantErr)
- }
- })
-
- t.Run("scratch", func(t *testing.T) {
- t.Parallel()
-
- tempDir := check.MustAbs(t.TempDir())
- if err := os.MkdirAll(tempDir.Append(
- "cache",
- "scratch",
- ).String(), 0755); err != nil {
- t.Fatal(err)
- }
-
- wantErr := errors.New("scratch is present, scrub likely required")
- if _, err := pkg.Open(
- t.Context(),
- message.New(nil),
- tempDir.Append("cache"), nil,
- ); !reflect.DeepEqual(err, wantErr) {
- t.Errorf("Open: error = %#v, want %#v", err, wantErr)
- }
- })
-}
-
-func TestExtensionRegister(t *testing.T) {
- extensionOld := extension
- openedOld := opened
- t.Cleanup(func() { extension = extensionOld; opened = openedOld })
- extension = ""
- opened = false
-
- t.Run("set", func(t *testing.T) {
- t.Cleanup(func() { extension = "" })
-
- const want = "rosa"
- pkg.SetExtension(want)
- if got := pkg.Extension(); got != want {
- t.Fatalf("Extension: %q, want %q", got, want)
- }
- })
-
- t.Run("twice", func(t *testing.T) {
- t.Cleanup(func() { extension = "" })
-
- defer func() {
- const wantPanic = "attempting to set extension twice"
- if r := recover(); r != wantPanic {
- t.Errorf("panic: %#v, want %q", r, wantPanic)
- }
- }()
- pkg.SetExtension("rosa")
- pkg.SetExtension("rosa")
- })
-
- t.Run("invalid", func(t *testing.T) {
- defer func() {
- var wantPanic = pkg.ErrInvalidExtension
- if r := recover(); r != wantPanic {
- t.Errorf("panic: %#v, want %#v", r, wantPanic)
- }
- }()
- pkg.SetExtension(" ")
- })
-
- t.Run("opened", func(t *testing.T) {
- t.Cleanup(func() { opened = false })
-
- if _, err := pkg.Open(
- t.Context(),
- message.New(log.Default()),
- check.MustAbs(container.Nonexistent),
- nil,
- ); !errors.Is(err, os.ErrNotExist) {
- t.Fatalf("Open: error = %v", err)
- }
-
- t.Run("variant", func(t *testing.T) {
- defer func() {
- const wantPanic = "attempting to set extension after open"
- if r := recover(); r != wantPanic {
- t.Errorf("panic: %#v, want %q", r, wantPanic)
- }
- }()
- pkg.SetExtension("rosa")
- })
-
- t.Run("register", func(t *testing.T) {
- defer func() {
- const wantPanic = "attempting to register after open"
- if r := recover(); r != wantPanic {
- t.Errorf("panic: %#v, want %q", r, wantPanic)
- }
- }()
- pkg.Register(pkg.KindCustomOffset, nil)
- })
- })
-
- t.Run("incomplete", func(t *testing.T) {
- t.Cleanup(func() { delete(irArtifact, pkg.KindCustomOffset) })
-
- defer func() {
- const wantPanic = "attempting to open cache with incomplete variant setup"
- if r := recover(); r != wantPanic {
- t.Errorf("panic: %#v, want %q", r, wantPanic)
- }
- }()
- pkg.Register(pkg.KindCustomOffset, nil)
-
- t.Cleanup(func() { opened = false })
- _, _ = pkg.Open(nil, nil, nil, nil)
- panic("unreachable")
- })
-
- t.Run("create", func(t *testing.T) {
- t.Cleanup(func() { extension = "" })
- const want = "rosa"
- pkg.SetExtension(want)
-
- base := check.MustAbs(t.TempDir())
- t.Cleanup(func() { opened = false })
- if c, err := pkg.Open(t.Context(), nil, base, nil); err != nil {
- t.Fatal(err)
- } else {
- c.Close()
- }
-
- if got, err := os.ReadFile(base.Append("variant").String()); err != nil {
- t.Fatal(err)
- } else if string(got) != want {
- t.Fatalf("variant: %q", string(got))
- }
- })
-
- t.Run("access", func(t *testing.T) {
- base := check.MustAbs(t.TempDir())
- t.Cleanup(func() { opened = false })
-
- if err := os.WriteFile(base.Append("variant").String(), nil, 0); err != nil {
- t.Fatal(err)
- }
-
- wantErr := &os.PathError{
- Op: "open",
- Path: base.Append("variant").String(),
- Err: syscall.EACCES,
- }
- if _, err := pkg.Open(
- t.Context(), nil,
- base, nil,
- ); !reflect.DeepEqual(err, wantErr) {
- t.Fatalf("Open: error = %v, want %v", err, wantErr)
- }
- })
-
- t.Run("promote", func(t *testing.T) {
- t.Cleanup(func() { extension = "" })
- const want = "rosa"
- pkg.SetExtension(want)
-
- base := check.MustAbs(t.TempDir())
- t.Cleanup(func() { opened = false })
-
- variantPath := base.Append("variant")
- if err := os.WriteFile(variantPath.String(), nil, 0600); err != nil {
- t.Fatal(err)
- }
-
- if _, err := pkg.Open(
- t.Context(), nil,
- base,
- nil,
- ); !reflect.DeepEqual(err, pkg.ErrWouldPromote) {
- t.Fatalf("Open: error = %v", err)
- }
-
- if p, err := os.ReadFile(variantPath.String()); err != nil {
- t.Fatal(err)
- } else if len(p) != 0 {
- t.Fatalf("variant: %q", string(p))
- }
-
- if c, err := pkg.Open(
- t.Context(), nil,
- base, &pkg.CacheAttr{Flags: pkg.CPromoteVariant},
- ); err != nil {
- t.Fatalf("Open: error = %v", err)
- } else {
- c.Close()
- }
-
- if p, err := os.ReadFile(variantPath.String()); err != nil {
- t.Fatal(err)
- } else if string(p) != want {
- t.Fatalf("variant: %q, want %q", string(p), want)
- }
- })
-
- t.Run("open invalid", func(t *testing.T) {
- base := check.MustAbs(t.TempDir())
- t.Cleanup(func() { opened = false })
-
- variantPath := base.Append("variant")
- if err := os.WriteFile(variantPath.String(), make([]byte, 129), 0400); err != nil {
- t.Fatal(err)
- }
-
- if _, err := pkg.Open(
- t.Context(), nil,
- base, nil,
- ); !reflect.DeepEqual(err, pkg.ErrInvalidExtension) {
- t.Fatalf("Open: error = %v", err)
- }
- })
-
- t.Run("unsupported", func(t *testing.T) {
- base := check.MustAbs(t.TempDir())
- t.Cleanup(func() { opened = false })
-
- variantPath := base.Append("variant")
- if err := os.WriteFile(variantPath.String(), []byte("rosa"), 0400); err != nil {
- t.Fatal(err)
- }
-
- if _, err := pkg.Open(
- t.Context(), nil,
- base, nil,
- ); !reflect.DeepEqual(err, pkg.UnsupportedVariantError("rosa")) {
- t.Fatalf("Open: error = %v", err)
- }
- })
-}
diff --git a/internal/pkg/tar.go b/internal/pkg/tar.go
deleted file mode 100644
index 9a8c4b76..00000000
--- a/internal/pkg/tar.go
+++ /dev/null
@@ -1,226 +0,0 @@
-package pkg
-
-import (
- "archive/tar"
- "errors"
- "fmt"
- "io"
- "io/fs"
- "os"
- "path/filepath"
-)
-
-// A tarArtifact is an [Artifact] unpacking a tarball backed by a [FileArtifact].
-type tarArtifact struct {
- // Caller-supplied backing tarball.
- f Artifact
-}
-
-var _ CuresExempt = new(tarArtifact)
-
-// tarArtifactNamed embeds tarArtifact for a [fmt.Stringer] tarball.
-type tarArtifactNamed struct {
- tarArtifact
- // Copied from tarArtifact.f.
- name string
-}
-
-var _ fmt.Stringer = new(tarArtifactNamed)
-
-// String returns the name of the underlying [Artifact] prefixed with unpack.
-func (a *tarArtifactNamed) String() string { return "unpack-" + a.name }
-
-// NewTar returns a new [Artifact] unpacking the tar stream produced by the
-// backing [Artifact]. The source [Artifact] must be a [FileArtifact].
-func NewTar(a Artifact) Artifact {
- ta := tarArtifact{a}
- if s, ok := a.(fmt.Stringer); ok {
- if name := s.String(); name != "" {
- return &tarArtifactNamed{ta, name}
- }
- }
- return &ta
-}
-
-// Kind returns the hardcoded [Kind] constant.
-func (a *tarArtifact) Kind() Kind { return KindTar }
-
-// Params is a noop.
-func (a *tarArtifact) Params(*IContext) {}
-
-func init() {
- register(KindTar, func(r *IRReader) Artifact {
- a := NewTar(r.Next())
- if _, ok := r.Finalise(); ok {
- panic(ErrUnexpectedChecksum)
- }
- return a
- })
-}
-
-// Inputs returns a slice containing the backing file.
-func (a *tarArtifact) Inputs() []Artifact {
- return []Artifact{a.f}
-}
-
-// IsExclusive returns false: decompressor and tar reader are fully sequential.
-func (a *tarArtifact) IsExclusive() bool { return false }
-
-// A DisallowedTypeflagError describes a disallowed typeflag encountered while
-// unpacking a tarball.
-type DisallowedTypeflagError byte
-
-func (e DisallowedTypeflagError) Error() string {
- return "disallowed typeflag '" + string(e) + "'"
-}
-
-// Cure cures the [Artifact], producing a directory located at work.
-func (a *tarArtifact) Cure(t *TContext) (err error) {
- var r io.ReadCloser
- if r, err = t.Open(a.f); err != nil {
- return
- }
-
- defer func() {
- closeErr := r.Close()
- if err == nil {
- err = closeErr
- }
- }()
-
- type dirTargetPerm struct {
- path string
- mode fs.FileMode
- }
- var madeDirectories []dirTargetPerm
-
- if err = os.MkdirAll(t.GetTempDir().String(), 0700); err != nil {
- return
- }
- var root *os.Root
- if root, err = os.OpenRoot(t.GetTempDir().String()); err != nil {
- return
- }
- defer func() {
- closeErr := root.Close()
- if err == nil {
- err = closeErr
- }
- }()
-
- var header *tar.Header
- tr := tar.NewReader(r)
- for header, err = tr.Next(); err == nil; header, err = tr.Next() {
- typeflag := header.Typeflag
- if typeflag == 0 {
- if len(header.Name) > 0 && header.Name[len(header.Name)-1] == '/' {
- typeflag = tar.TypeDir
- } else {
- typeflag = tar.TypeReg
- }
- }
-
- if typeflag >= '0' && typeflag <= '9' && typeflag != tar.TypeDir {
- if err = root.MkdirAll(filepath.Dir(header.Name), 0700); err != nil {
- return
- }
- }
-
- switch typeflag {
- case tar.TypeReg:
- var f *os.File
- if f, err = root.OpenFile(
- header.Name,
- os.O_CREATE|os.O_EXCL|os.O_WRONLY,
- header.FileInfo().Mode()&0500,
- ); err != nil {
- return
- }
- if _, err = io.Copy(f, tr); err != nil {
- _ = f.Close()
- return
- } else if err = f.Close(); err != nil {
- return
- }
- break
-
- case tar.TypeLink:
- if err = root.Link(
- header.Linkname,
- header.Name,
- ); err != nil {
- return
- }
- break
-
- case tar.TypeSymlink:
- if err = root.Symlink(
- header.Linkname,
- header.Name,
- ); err != nil {
- return
- }
- break
-
- case tar.TypeDir:
- madeDirectories = append(madeDirectories, dirTargetPerm{
- path: header.Name,
- mode: header.FileInfo().Mode(),
- })
- if err = root.MkdirAll(header.Name, 0700); err != nil {
- return
- }
- break
-
- case tar.TypeChar:
- t.GetMessage().Verbosef(
- "%sskipping character device %d, %d %q%s",
- t.cache.sgrWarn, header.Devmajor, header.Devminor, header.Name, t.cache.sgrRes,
- )
- continue
-
- case tar.TypeXGlobalHeader:
- continue // ignore
-
- default:
- return DisallowedTypeflagError(typeflag)
- }
- }
- if errors.Is(err, io.EOF) {
- err = nil
- }
- if err == nil {
- for _, e := range madeDirectories {
- if err = root.Chmod(e.path, e.mode&0500); err != nil {
- return
- }
- }
- } else {
- return
- }
-
- temp := t.GetTempDir()
- if err = os.Chmod(temp.String(), 0700); err != nil {
- return
- }
-
- var entries []os.DirEntry
- if entries, err = os.ReadDir(temp.String()); err != nil {
- return
- }
-
- if len(entries) == 1 && entries[0].IsDir() {
- p := temp.Append(entries[0].Name())
- if err = os.Chmod(p.String(), 0700); err != nil {
- return
- }
- err = os.Rename(p.String(), t.GetWorkDir().String())
- } else {
- err = os.Rename(temp.String(), t.GetWorkDir().String())
- }
- return
-}
-
-// CuresExempt exempts the cheap [KindTar] implementation often at the end of a
-// [FileArtifact] pipeline.
-func (*tarArtifact) CuresExempt() {}
diff --git a/internal/pkg/tar_test.go b/internal/pkg/tar_test.go
deleted file mode 100644
index 1f280e9c..00000000
--- a/internal/pkg/tar_test.go
+++ /dev/null
@@ -1,225 +0,0 @@
-package pkg_test
-
-import (
- "archive/tar"
- "bytes"
- "crypto/sha512"
- "errors"
- "io/fs"
- "net/http"
- "os"
- "testing"
- "testing/fstest"
-
- "hakurei.app/check"
- "hakurei.app/internal/pkg"
- "hakurei.app/internal/stub"
-)
-
-func TestTar(t *testing.T) {
- t.Parallel()
-
- want := expectsFS{
- ".": {Mode: fs.ModeDir | 0500},
-
- "checksum": {Mode: fs.ModeDir | 0500},
- "checksum/1TL00Qb8dcqayX7wTO8WNaraHvY6b-KCsctLDTrb64QBCmxj_-byK1HdIUwMaFEP": {Mode: fs.ModeDir | 0500},
- "checksum/1TL00Qb8dcqayX7wTO8WNaraHvY6b-KCsctLDTrb64QBCmxj_-byK1HdIUwMaFEP/check": {Mode: 0400, Data: []byte{0, 0}},
- "checksum/1TL00Qb8dcqayX7wTO8WNaraHvY6b-KCsctLDTrb64QBCmxj_-byK1HdIUwMaFEP/lib": {Mode: fs.ModeDir | 0500},
- "checksum/1TL00Qb8dcqayX7wTO8WNaraHvY6b-KCsctLDTrb64QBCmxj_-byK1HdIUwMaFEP/lib/pkgconfig": {Mode: fs.ModeDir | 0500},
- "checksum/1TL00Qb8dcqayX7wTO8WNaraHvY6b-KCsctLDTrb64QBCmxj_-byK1HdIUwMaFEP/lib/libedac.so": {Mode: fs.ModeSymlink | 0777, Data: []byte("/proc/nonexistent/libedac.so")},
-
- "identifier": {Mode: fs.ModeDir | 0500},
- "identifier/HnySzeLQvSBZuTUcvfmLEX_OmH4yJWWH788NxuLuv7kVn8_uPM6Ks4rqFWM2NZJY": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/1TL00Qb8dcqayX7wTO8WNaraHvY6b-KCsctLDTrb64QBCmxj_-byK1HdIUwMaFEP")},
- "identifier/Zx5ZG9BAwegNT3zQwCySuI2ktCXxNgxirkGLFjW4FW06PtojYVaCdtEw8yuntPLa": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/1TL00Qb8dcqayX7wTO8WNaraHvY6b-KCsctLDTrb64QBCmxj_-byK1HdIUwMaFEP")},
-
- "work": {Mode: fs.ModeDir | 0500},
- }
- wantEncode := pkg.Encode(want.hash())
-
- wantExpand := expectsFS{
- ".": {Mode: fs.ModeDir | 0500},
-
- "libedac.so": {Mode: fs.ModeSymlink | 0777, Data: []byte("/proc/nonexistent/libedac.so")},
- }
- wantExpandEncode := pkg.Encode(wantExpand.hash())
-
- checkWithCache(t, []cacheTestCase{
- {"http", 0, nil, func(t *testing.T, base *check.Absolute, c *pkg.Cache) {
- checkTarHTTP(t, base, c, fstest.MapFS{
- ".": {Mode: fs.ModeDir | 0700},
-
- "checksum": {Mode: fs.ModeDir | 0700},
- "checksum/1TL00Qb8dcqayX7wTO8WNaraHvY6b-KCsctLDTrb64QBCmxj_-byK1HdIUwMaFEP": {Mode: fs.ModeDir | 0700},
- "checksum/1TL00Qb8dcqayX7wTO8WNaraHvY6b-KCsctLDTrb64QBCmxj_-byK1HdIUwMaFEP/check": {Mode: 0400, Data: []byte{0, 0}},
- "checksum/1TL00Qb8dcqayX7wTO8WNaraHvY6b-KCsctLDTrb64QBCmxj_-byK1HdIUwMaFEP/lib": {Mode: fs.ModeDir | 0700},
- "checksum/1TL00Qb8dcqayX7wTO8WNaraHvY6b-KCsctLDTrb64QBCmxj_-byK1HdIUwMaFEP/lib/pkgconfig": {Mode: fs.ModeDir | 0700},
- "checksum/1TL00Qb8dcqayX7wTO8WNaraHvY6b-KCsctLDTrb64QBCmxj_-byK1HdIUwMaFEP/lib/libedac.so": {Mode: fs.ModeSymlink | 0777, Data: []byte("/proc/nonexistent/libedac.so")},
-
- "identifier": {Mode: fs.ModeDir | 0700},
- "identifier/HnySzeLQvSBZuTUcvfmLEX_OmH4yJWWH788NxuLuv7kVn8_uPM6Ks4rqFWM2NZJY": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/1TL00Qb8dcqayX7wTO8WNaraHvY6b-KCsctLDTrb64QBCmxj_-byK1HdIUwMaFEP")},
- "identifier/Zx5ZG9BAwegNT3zQwCySuI2ktCXxNgxirkGLFjW4FW06PtojYVaCdtEw8yuntPLa": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/1TL00Qb8dcqayX7wTO8WNaraHvY6b-KCsctLDTrb64QBCmxj_-byK1HdIUwMaFEP")},
-
- "work": {Mode: fs.ModeDir | 0700},
- }, want)
- }, expectsFS{
- ".": {Mode: fs.ModeDir | 0700},
-
- "checksum": {Mode: fs.ModeDir | 0700},
- "checksum/" + wantEncode: {Mode: fs.ModeDir | 0500},
- "checksum/" + wantEncode + "/checksum": {Mode: fs.ModeDir | 0500},
- "checksum/" + wantEncode + "/checksum/1TL00Qb8dcqayX7wTO8WNaraHvY6b-KCsctLDTrb64QBCmxj_-byK1HdIUwMaFEP": {Mode: fs.ModeDir | 0500},
- "checksum/" + wantEncode + "/checksum/1TL00Qb8dcqayX7wTO8WNaraHvY6b-KCsctLDTrb64QBCmxj_-byK1HdIUwMaFEP/check": {Mode: 0400, Data: []byte{0, 0}},
- "checksum/" + wantEncode + "/checksum/1TL00Qb8dcqayX7wTO8WNaraHvY6b-KCsctLDTrb64QBCmxj_-byK1HdIUwMaFEP/lib": {Mode: fs.ModeDir | 0500},
- "checksum/" + wantEncode + "/checksum/1TL00Qb8dcqayX7wTO8WNaraHvY6b-KCsctLDTrb64QBCmxj_-byK1HdIUwMaFEP/lib/libedac.so": {Mode: fs.ModeSymlink | 0777, Data: []byte("/proc/nonexistent/libedac.so")},
- "checksum/" + wantEncode + "/checksum/1TL00Qb8dcqayX7wTO8WNaraHvY6b-KCsctLDTrb64QBCmxj_-byK1HdIUwMaFEP/lib/pkgconfig": {Mode: fs.ModeDir | 0500},
- "checksum/" + wantEncode + "/identifier": {Mode: fs.ModeDir | 0500},
- "checksum/" + wantEncode + "/identifier/HnySzeLQvSBZuTUcvfmLEX_OmH4yJWWH788NxuLuv7kVn8_uPM6Ks4rqFWM2NZJY": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/1TL00Qb8dcqayX7wTO8WNaraHvY6b-KCsctLDTrb64QBCmxj_-byK1HdIUwMaFEP")},
- "checksum/" + wantEncode + "/identifier/Zx5ZG9BAwegNT3zQwCySuI2ktCXxNgxirkGLFjW4FW06PtojYVaCdtEw8yuntPLa": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/1TL00Qb8dcqayX7wTO8WNaraHvY6b-KCsctLDTrb64QBCmxj_-byK1HdIUwMaFEP")},
- "checksum/" + wantEncode + "/work": {Mode: fs.ModeDir | 0500},
-
- "identifier": {Mode: fs.ModeDir | 0700},
- "identifier/snWp53xxNdx6cV5KSJqzyVWzLlTsFd8udOisIu8Rgxly09mGcxufYCoQ5CQrHDyZ": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/" + wantEncode)},
- "identifier/v9DUj2R4YK_3ae0m9VuUYI-HJysDDCENu1k10thxioycRzFH1Qejw5bBGukm4IdL": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/" + wantEncode)},
-
- "substitute": {Mode: fs.ModeDir | 0700},
-
- "temp": {Mode: fs.ModeDir | 0700},
- "work": {Mode: fs.ModeDir | 0700},
- }},
-
- {"http expand", 0, nil, func(t *testing.T, base *check.Absolute, c *pkg.Cache) {
- checkTarHTTP(t, base, c, fstest.MapFS{
- ".": {Mode: fs.ModeDir | 0700},
-
- "lib": {Mode: fs.ModeDir | 0700},
- "lib/libedac.so": {Mode: fs.ModeSymlink | 0777, Data: []byte("/proc/nonexistent/libedac.so")},
- }, wantExpand)
- }, expectsFS{
- ".": {Mode: fs.ModeDir | 0700},
-
- "checksum": {Mode: fs.ModeDir | 0700},
- "checksum/" + wantExpandEncode: {Mode: fs.ModeDir | 0500},
- "checksum/" + wantExpandEncode + "/libedac.so": {Mode: fs.ModeSymlink | 0777, Data: []byte("/proc/nonexistent/libedac.so")},
-
- "identifier": {Mode: fs.ModeDir | 0700},
- "identifier/1SuvgGltcsgqps9tWqjULG8RCdpx_6KVWXdsMd5xPKvdtysOxqpE-3bLu4j0WpGk": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/" + wantExpandEncode)},
- "identifier/snWp53xxNdx6cV5KSJqzyVWzLlTsFd8udOisIu8Rgxly09mGcxufYCoQ5CQrHDyZ": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/" + wantExpandEncode)},
-
- "substitute": {Mode: fs.ModeDir | 0700},
-
- "temp": {Mode: fs.ModeDir | 0700},
- "work": {Mode: fs.ModeDir | 0700},
- }},
- })
-}
-
-func checkTarHTTP(
- t *testing.T,
- base *check.Absolute,
- c *pkg.Cache,
- testdataFsys fs.FS,
- want expectsKnown,
-) {
- var testdata string
- {
- var buf bytes.Buffer
- w := tar.NewWriter(&buf)
- if err := w.AddFS(testdataFsys); err != nil {
- t.Fatalf("AddFS: error = %v", err)
- }
- if err := w.Close(); err != nil {
- t.Fatalf("Close: error = %v", err)
- }
- testdata = buf.String()
- }
-
- testdataChecksum := func() pkg.Checksum {
- h := sha512.New384()
- h.Write([]byte(testdata))
- return (pkg.Checksum)(h.Sum(nil))
- }()
-
- var transport http.Transport
- client := http.Client{Transport: &transport}
- transport.RegisterProtocol("file", http.NewFileTransportFS(fstest.MapFS{
- "testdata": {Data: []byte(testdata), Mode: 0400},
- }))
-
- tarDir := stubArtifact{
- kind: pkg.KindExec,
- params: []byte("directory containing a single regular file"),
- cure: func(t *pkg.TContext) error {
- work := t.GetWorkDir()
- if err := os.MkdirAll(work.String(), 0700); err != nil {
- return err
- }
- return os.WriteFile(
- work.Append("sample.tar.gz").String(),
- []byte(testdata),
- 0400,
- )
- },
- }
- tarDirMulti := stubArtifact{
- kind: pkg.KindExec,
- params: []byte("directory containing a multiple entries"),
- cure: func(t *pkg.TContext) error {
- work := t.GetWorkDir()
- if err := os.MkdirAll(work.Append(
- "garbage",
- ).String(), 0700); err != nil {
- return err
- }
- return os.WriteFile(
- work.Append("sample.tar.gz").String(),
- []byte(testdata),
- 0400,
- )
- },
- }
- tarDirType := stubArtifact{
- kind: pkg.KindExec,
- params: []byte("directory containing a symbolic link"),
- cure: func(t *pkg.TContext) error {
- work := t.GetWorkDir()
- if err := os.MkdirAll(work.String(), 0700); err != nil {
- return err
- }
- return os.Symlink(
- work.String(),
- work.Append("sample.tar.gz").String(),
- )
- },
- }
- // destroy these to avoid including it in flatten test case
- defer newDestroyArtifactFunc(&tarDir)(t, base, c)
- defer newDestroyArtifactFunc(&tarDirMulti)(t, base, c)
- defer newDestroyArtifactFunc(&tarDirType)(t, base, c)
-
- cureMany(t, c, []cureStep{
- {"file", pkg.NewTar(pkg.NewHTTPGet(
- &client,
- "file:///testdata",
- testdataChecksum,
- )), ignorePathname, want, pkg.WNew, nil},
-
- {"directory", pkg.NewTar(&tarDir), ignorePathname, want, pkg.WNew, nil},
-
- {"multiple entries", pkg.NewTar(&tarDirMulti), nil, nil, pkg.WNew, errors.New(
- "input directory does not contain a single regular file",
- )},
-
- {"bad type", pkg.NewTar(&tarDirType), nil, nil, pkg.WNew, errors.New(
- "input directory does not contain a single regular file",
- )},
-
- {"error passthrough", pkg.NewTar(&stubArtifact{
- kind: pkg.KindExec,
- params: []byte("doomed artifact"),
- cure: func(t *pkg.TContext) error {
- return stub.UniqueError(0xcafe)
- },
- }), nil, nil, pkg.WNew, stub.UniqueError(0xcafe)},
- })
-}
diff --git a/internal/rosa/builtins.go b/internal/rosa/builtins.go
index dbafa397..edca2333 100644
--- a/internal/rosa/builtins.go
+++ b/internal/rosa/builtins.go
@@ -9,7 +9,7 @@ import (
"strings"
"time"
- "hakurei.app/internal/pkg"
+ "hakurei.app/pkg"
)
const (
diff --git a/internal/rosa/etc.go b/internal/rosa/etc.go
index 18c9750b..0af51830 100644
--- a/internal/rosa/etc.go
+++ b/internal/rosa/etc.go
@@ -8,7 +8,7 @@ import (
"syscall"
"hakurei.app/fhs"
- "hakurei.app/internal/pkg"
+ "hakurei.app/pkg"
)
// cureEtc contains deterministic elements of /etc, made available as part of
diff --git a/internal/rosa/gentoo.go b/internal/rosa/gentoo.go
index a0a8e525..a08fd705 100644
--- a/internal/rosa/gentoo.go
+++ b/internal/rosa/gentoo.go
@@ -6,7 +6,7 @@ import (
"os"
"path/filepath"
- "hakurei.app/internal/pkg"
+ "hakurei.app/pkg"
)
// gentooOverlay are symlinks on top of a Gentoo LLVM stage3 tarball for
diff --git a/internal/rosa/git.go b/internal/rosa/git.go
index bda380ce..70d5b6f8 100644
--- a/internal/rosa/git.go
+++ b/internal/rosa/git.go
@@ -4,7 +4,7 @@ import (
"path"
"strings"
- "hakurei.app/internal/pkg"
+ "hakurei.app/pkg"
)
var (
diff --git a/internal/rosa/go.go b/internal/rosa/go.go
index 1b42447a..1127cf3d 100644
--- a/internal/rosa/go.go
+++ b/internal/rosa/go.go
@@ -3,7 +3,7 @@ package rosa
import (
"slices"
- "hakurei.app/internal/pkg"
+ "hakurei.app/pkg"
)
// newGo returns a specific version of the Go toolchain.
diff --git a/internal/rosa/llvm.go b/internal/rosa/llvm.go
index dddd6388..0882e7d8 100644
--- a/internal/rosa/llvm.go
+++ b/internal/rosa/llvm.go
@@ -5,7 +5,7 @@ import (
"slices"
"strings"
- "hakurei.app/internal/pkg"
+ "hakurei.app/pkg"
)
var (
diff --git a/internal/rosa/llvm_test.go b/internal/rosa/llvm_test.go
index 52562579..3152107c 100644
--- a/internal/rosa/llvm_test.go
+++ b/internal/rosa/llvm_test.go
@@ -3,8 +3,8 @@ package rosa_test
import (
"testing"
- "hakurei.app/internal/pkg"
"hakurei.app/internal/rosa"
+ "hakurei.app/pkg"
)
func TestLLVMInputs(t *testing.T) {
diff --git a/internal/rosa/mirror.go b/internal/rosa/mirror.go
index 80d4509c..4af931c7 100644
--- a/internal/rosa/mirror.go
+++ b/internal/rosa/mirror.go
@@ -17,8 +17,8 @@ import (
"syscall"
"unique"
- "hakurei.app/internal/pkg"
"hakurei.app/message"
+ "hakurei.app/pkg"
)
// Remote is an authenticated cache mirror.
diff --git a/internal/rosa/mirror_test.go b/internal/rosa/mirror_test.go
index 6c3ec92e..d45f9ae8 100644
--- a/internal/rosa/mirror_test.go
+++ b/internal/rosa/mirror_test.go
@@ -13,9 +13,9 @@ import (
"hakurei.app/check"
"hakurei.app/fhs"
- "hakurei.app/internal/pkg"
"hakurei.app/internal/rosa"
"hakurei.app/message"
+ "hakurei.app/pkg"
)
func TestMirror(t *testing.T) {
diff --git a/internal/rosa/package/hakurei.az b/internal/rosa/package/hakurei.az
index 24a2a7c9..0448c0f3 100644
--- a/internal/rosa/package/hakurei.az
+++ b/internal/rosa/package/hakurei.az
@@ -2,11 +2,11 @@ package hakurei-source {
description = "hakurei source tree";
exclude = true;
- version# = "0.4.7";
+ version# = "0.4.8";
output = remoteGit {
url = "https://git.gensokyo.uk/rosa/hakurei.git";
tag = "v"+version;
- checksum = "gQs-fBuPsYjGEBgxe3pSiqa7aMrqUkimi6iyjrhR6YKrOiZLfd4bFwiB9V8k3cKO";
+ checksum = "B6aoojyXblZ7eYwdc3Ak3wDbBpu63j8S79Gpiul9Obb8diqzBIJ2qNCgWVH6qLsc";
};
}
diff --git a/internal/rosa/package/kernel/package.az b/internal/rosa/package/kernel/package.az
index e2f6339e..bb0a4509 100644
--- a/internal/rosa/package/kernel/package.az
+++ b/internal/rosa/package/kernel/package.az
@@ -48,7 +48,7 @@ cat \
amd64 = "uwTZX3iLp6iPsR0-F0Jz2aUviLMMqv4xGQHoKeemo2HrNLD7fDlIDqqYT--i_5HJ";
arm64 = "A9EWzTGEChVLJVm5BP1GzpibdUddXUN2hIjAGkD-KQr5sc6RuEeIQle8VAiAYUqp";
- riscv64 = "IB1oG3tEAN15wjYl8S5ekYXVFYN7-rb3m2f1Kdi58dGqnrIBTG2r1qb1utb5D1lb";
+ riscv64 = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
};
inputs = [ rsync ];
}
diff --git a/internal/rosa/package/kernel/riscv64.config b/internal/rosa/package/kernel/riscv64.config
deleted file mode 100644
index 3edb9be9..00000000
--- a/internal/rosa/package/kernel/riscv64.config
+++ /dev/null
@@ -1,11969 +0,0 @@
-#
-# Automatically generated file; DO NOT EDIT.
-# Linux/riscv 6.18.47 Kernel Configuration
-#
-CONFIG_CC_VERSION_TEXT="clang version 23.1.0"
-CONFIG_GCC_VERSION=0
-CONFIG_CC_IS_CLANG=y
-CONFIG_CLANG_VERSION=230100
-CONFIG_AS_IS_LLVM=y
-CONFIG_AS_VERSION=230100
-CONFIG_LD_VERSION=0
-CONFIG_LD_IS_LLD=y
-CONFIG_LLD_VERSION=230100
-CONFIG_RUSTC_VERSION=0
-CONFIG_RUSTC_LLVM_VERSION=0
-CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y
-CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT=y
-CONFIG_TOOLS_SUPPORT_RELR=y
-CONFIG_CC_HAS_ASM_INLINE=y
-CONFIG_CC_HAS_ASSUME=y
-CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y
-CONFIG_CC_HAS_COUNTED_BY=y
-CONFIG_CC_HAS_MULTIDIMENSIONAL_NONSTRING=y
-CONFIG_LD_CAN_USE_KEEP_IN_OVERLAY=y
-CONFIG_PAHOLE_VERSION=0
-CONFIG_IRQ_WORK=y
-CONFIG_BUILDTIME_TABLE_SORT=y
-CONFIG_THREAD_INFO_IN_TASK=y
-
-#
-# General setup
-#
-CONFIG_INIT_ENV_ARG_LIMIT=32
-# CONFIG_COMPILE_TEST is not set
-CONFIG_WERROR=y
-CONFIG_LOCALVERSION=""
-CONFIG_LOCALVERSION_AUTO=y
-CONFIG_BUILD_SALT=""
-CONFIG_HAVE_KERNEL_GZIP=y
-CONFIG_HAVE_KERNEL_ZSTD=y
-# CONFIG_KERNEL_GZIP is not set
-CONFIG_KERNEL_ZSTD=y
-CONFIG_DEFAULT_INIT=""
-CONFIG_DEFAULT_HOSTNAME="rosa-early"
-CONFIG_SYSVIPC=y
-CONFIG_SYSVIPC_SYSCTL=y
-CONFIG_SYSVIPC_COMPAT=y
-CONFIG_POSIX_MQUEUE=y
-CONFIG_POSIX_MQUEUE_SYSCTL=y
-CONFIG_WATCH_QUEUE=y
-CONFIG_CROSS_MEMORY_ATTACH=y
-CONFIG_AUDIT=y
-CONFIG_HAVE_ARCH_AUDITSYSCALL=y
-CONFIG_AUDITSYSCALL=y
-
-#
-# IRQ subsystem
-#
-CONFIG_GENERIC_IRQ_SHOW=y
-CONFIG_GENERIC_IRQ_SHOW_LEVEL=y
-CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y
-CONFIG_GENERIC_PENDING_IRQ=y
-CONFIG_GENERIC_IRQ_MIGRATION=y
-CONFIG_HARDIRQS_SW_RESEND=y
-CONFIG_GENERIC_IRQ_CHIP=y
-CONFIG_IRQ_DOMAIN=y
-CONFIG_IRQ_SIM=y
-CONFIG_IRQ_DOMAIN_HIERARCHY=y
-CONFIG_GENERIC_IRQ_IPI=y
-CONFIG_GENERIC_IRQ_IPI_MUX=y
-CONFIG_GENERIC_MSI_IRQ=y
-CONFIG_GENERIC_IRQ_MATRIX_ALLOCATOR=y
-CONFIG_IRQ_FORCED_THREADING=y
-CONFIG_SPARSE_IRQ=y
-# CONFIG_GENERIC_IRQ_DEBUGFS is not set
-# end of IRQ subsystem
-
-CONFIG_GENERIC_IRQ_MULTI_HANDLER=y
-CONFIG_GENERIC_TIME_VSYSCALL=y
-CONFIG_GENERIC_CLOCKEVENTS=y
-CONFIG_ARCH_HAS_TICK_BROADCAST=y
-CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
-CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK=y
-CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y
-CONFIG_CONTEXT_TRACKING=y
-CONFIG_CONTEXT_TRACKING_IDLE=y
-
-#
-# Timers subsystem
-#
-CONFIG_TICK_ONESHOT=y
-CONFIG_NO_HZ_COMMON=y
-# CONFIG_HZ_PERIODIC is not set
-# CONFIG_NO_HZ_IDLE is not set
-CONFIG_NO_HZ_FULL=y
-CONFIG_CONTEXT_TRACKING_USER=y
-# CONFIG_CONTEXT_TRACKING_USER_FORCE is not set
-CONFIG_NO_HZ=y
-CONFIG_HIGH_RES_TIMERS=y
-CONFIG_POSIX_AUX_CLOCKS=y
-# end of Timers subsystem
-
-CONFIG_BPF=y
-CONFIG_HAVE_EBPF_JIT=y
-
-#
-# BPF subsystem
-#
-CONFIG_BPF_SYSCALL=y
-CONFIG_BPF_JIT=y
-# CONFIG_BPF_JIT_ALWAYS_ON is not set
-CONFIG_BPF_UNPRIV_DEFAULT_OFF=y
-# CONFIG_BPF_PRELOAD is not set
-CONFIG_BPF_LSM=y
-# end of BPF subsystem
-
-CONFIG_PREEMPT_BUILD=y
-CONFIG_ARCH_HAS_PREEMPT_LAZY=y
-# CONFIG_PREEMPT_NONE is not set
-# CONFIG_PREEMPT_VOLUNTARY is not set
-# CONFIG_PREEMPT is not set
-CONFIG_PREEMPT_LAZY=y
-# CONFIG_PREEMPT_RT is not set
-CONFIG_PREEMPT_COUNT=y
-CONFIG_PREEMPTION=y
-CONFIG_PREEMPT_DYNAMIC=y
-
-#
-# CPU/Task time and stats accounting
-#
-CONFIG_VIRT_CPU_ACCOUNTING=y
-CONFIG_VIRT_CPU_ACCOUNTING_GEN=y
-CONFIG_IRQ_TIME_ACCOUNTING=y
-CONFIG_HAVE_SCHED_AVG_IRQ=y
-CONFIG_BSD_PROCESS_ACCT=y
-CONFIG_BSD_PROCESS_ACCT_V3=y
-CONFIG_TASKSTATS=y
-CONFIG_TASK_DELAY_ACCT=y
-CONFIG_TASK_XACCT=y
-CONFIG_TASK_IO_ACCOUNTING=y
-CONFIG_PSI=y
-# CONFIG_PSI_DEFAULT_DISABLED is not set
-# end of CPU/Task time and stats accounting
-
-CONFIG_CPU_ISOLATION=y
-
-#
-# RCU Subsystem
-#
-CONFIG_TREE_RCU=y
-CONFIG_PREEMPT_RCU=y
-# CONFIG_RCU_EXPERT is not set
-CONFIG_TREE_SRCU=y
-CONFIG_TASKS_RCU_GENERIC=y
-CONFIG_NEED_TASKS_RCU=y
-CONFIG_TASKS_RCU=y
-CONFIG_TASKS_TRACE_RCU=y
-CONFIG_RCU_STALL_COMMON=y
-CONFIG_RCU_NEED_SEGCBLIST=y
-CONFIG_RCU_NOCB_CPU=y
-# CONFIG_RCU_NOCB_CPU_DEFAULT_ALL is not set
-CONFIG_RCU_LAZY=y
-# CONFIG_RCU_LAZY_DEFAULT_OFF is not set
-# end of RCU Subsystem
-
-CONFIG_IKCONFIG=y
-CONFIG_IKCONFIG_PROC=y
-CONFIG_IKHEADERS=m
-CONFIG_LOG_BUF_SHIFT=18
-CONFIG_LOG_CPU_MAX_BUF_SHIFT=12
-CONFIG_PRINTK_INDEX=y
-CONFIG_GENERIC_SCHED_CLOCK=y
-
-#
-# Scheduler features
-#
-CONFIG_UCLAMP_TASK=y
-CONFIG_UCLAMP_BUCKETS_COUNT=5
-# CONFIG_SCHED_PROXY_EXEC is not set
-# end of Scheduler features
-
-CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y
-CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH=y
-CONFIG_CC_HAS_INT128=y
-CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough"
-CONFIG_GCC10_NO_ARRAY_BOUNDS=y
-CONFIG_GCC_NO_STRINGOP_OVERFLOW=y
-CONFIG_ARCH_SUPPORTS_INT128=y
-CONFIG_NUMA_BALANCING=y
-CONFIG_NUMA_BALANCING_DEFAULT_ENABLED=y
-CONFIG_SLAB_OBJ_EXT=y
-CONFIG_CGROUPS=y
-CONFIG_PAGE_COUNTER=y
-# CONFIG_CGROUP_FAVOR_DYNMODS is not set
-CONFIG_MEMCG=y
-# CONFIG_MEMCG_V1 is not set
-CONFIG_BLK_CGROUP=y
-CONFIG_CGROUP_WRITEBACK=y
-CONFIG_CGROUP_SCHED=y
-CONFIG_GROUP_SCHED_WEIGHT=y
-CONFIG_GROUP_SCHED_BANDWIDTH=y
-CONFIG_FAIR_GROUP_SCHED=y
-CONFIG_CFS_BANDWIDTH=y
-# CONFIG_RT_GROUP_SCHED is not set
-CONFIG_SCHED_MM_CID=y
-CONFIG_UCLAMP_TASK_GROUP=y
-CONFIG_CGROUP_PIDS=y
-CONFIG_CGROUP_RDMA=y
-CONFIG_CGROUP_DMEM=y
-CONFIG_CGROUP_FREEZER=y
-CONFIG_CGROUP_HUGETLB=y
-CONFIG_CPUSETS=y
-# CONFIG_CPUSETS_V1 is not set
-CONFIG_CGROUP_DEVICE=y
-CONFIG_CGROUP_CPUACCT=y
-CONFIG_CGROUP_PERF=y
-CONFIG_CGROUP_BPF=y
-CONFIG_CGROUP_MISC=y
-CONFIG_CGROUP_DEBUG=y
-CONFIG_SOCK_CGROUP_DATA=y
-CONFIG_NAMESPACES=y
-CONFIG_UTS_NS=y
-CONFIG_TIME_NS=y
-CONFIG_IPC_NS=y
-# CONFIG_USER_NS is not set
-CONFIG_PID_NS=y
-CONFIG_NET_NS=y
-CONFIG_CHECKPOINT_RESTORE=y
-CONFIG_SCHED_AUTOGROUP=y
-CONFIG_RELAY=y
-CONFIG_BLK_DEV_INITRD=y
-CONFIG_INITRAMFS_SOURCE=""
-CONFIG_RD_GZIP=y
-CONFIG_RD_BZIP2=y
-# CONFIG_RD_LZMA is not set
-# CONFIG_RD_XZ is not set
-# CONFIG_RD_LZO is not set
-# CONFIG_RD_LZ4 is not set
-CONFIG_RD_ZSTD=y
-# CONFIG_BOOT_CONFIG is not set
-CONFIG_INITRAMFS_PRESERVE_MTIME=y
-CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y
-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-CONFIG_LD_ORPHAN_WARN=y
-CONFIG_LD_ORPHAN_WARN_LEVEL="error"
-CONFIG_SYSCTL=y
-CONFIG_SYSCTL_EXCEPTION_TRACE=y
-CONFIG_SYSCTL_ARCH_UNALIGN_ALLOW=y
-CONFIG_SYSFS_SYSCALL=y
-CONFIG_EXPERT=y
-CONFIG_MULTIUSER=y
-CONFIG_SGETMASK_SYSCALL=y
-CONFIG_FHANDLE=y
-CONFIG_POSIX_TIMERS=y
-CONFIG_PRINTK=y
-CONFIG_BUG=y
-CONFIG_ELF_CORE=y
-# CONFIG_BASE_SMALL is not set
-CONFIG_FUTEX=y
-CONFIG_FUTEX_PI=y
-CONFIG_FUTEX_PRIVATE_HASH=y
-CONFIG_FUTEX_MPOL=y
-CONFIG_EPOLL=y
-CONFIG_SIGNALFD=y
-CONFIG_TIMERFD=y
-CONFIG_EVENTFD=y
-CONFIG_SHMEM=y
-CONFIG_AIO=y
-CONFIG_IO_URING=y
-CONFIG_IO_URING_MOCK_FILE=m
-CONFIG_ADVISE_SYSCALLS=y
-CONFIG_MEMBARRIER=y
-CONFIG_KCMP=y
-CONFIG_RSEQ=y
-# CONFIG_DEBUG_RSEQ is not set
-CONFIG_CACHESTAT_SYSCALL=y
-CONFIG_KALLSYMS=y
-# CONFIG_KALLSYMS_SELFTEST is not set
-CONFIG_KALLSYMS_ALL=y
-CONFIG_ARCH_HAS_MEMBARRIER_CALLBACKS=y
-CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y
-CONFIG_ARCH_SUPPORTS_MSEAL_SYSTEM_MAPPINGS=y
-CONFIG_HAVE_PERF_EVENTS=y
-CONFIG_GUEST_PERF_EVENTS=y
-
-#
-# Kernel Performance Events And Counters
-#
-CONFIG_PERF_EVENTS=y
-# CONFIG_DEBUG_PERF_USE_VMALLOC is not set
-# end of Kernel Performance Events And Counters
-
-CONFIG_SYSTEM_DATA_VERIFICATION=y
-CONFIG_PROFILING=y
-CONFIG_TRACEPOINTS=y
-
-#
-# Kexec and crash features
-#
-CONFIG_CRASH_RESERVE=y
-CONFIG_VMCORE_INFO=y
-CONFIG_KEXEC_CORE=y
-CONFIG_KEXEC_ELF=y
-CONFIG_KEXEC=y
-CONFIG_KEXEC_FILE=y
-CONFIG_CRASH_DUMP=y
-CONFIG_CRASH_DM_CRYPT=y
-CONFIG_CRASH_DM_CRYPT_CONFIGS=y
-# end of Kexec and crash features
-# end of General setup
-
-CONFIG_64BIT=y
-CONFIG_RISCV=y
-CONFIG_RUSTC_SUPPORTS_RISCV=y
-CONFIG_CLANG_SUPPORTS_DYNAMIC_FTRACE=y
-CONFIG_HAVE_SHADOW_CALL_STACK=y
-CONFIG_ARCH_MMAP_RND_BITS_MIN=18
-CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=8
-CONFIG_ARCH_MMAP_RND_BITS_MAX=24
-CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=17
-CONFIG_RISCV_SBI=y
-CONFIG_MMU=y
-CONFIG_ARCH_SPARSEMEM_ENABLE=y
-CONFIG_ARCH_SELECT_MEMORY_MODEL=y
-CONFIG_ARCH_SUPPORTS_UPROBES=y
-CONFIG_STACKTRACE_SUPPORT=y
-CONFIG_GENERIC_BUG=y
-CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_GENERIC_CSUM=y
-CONFIG_GENERIC_HWEIGHT=y
-CONFIG_FIX_EARLYCON_MEM=y
-CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000
-CONFIG_PGTABLE_LEVELS=5
-CONFIG_LOCKDEP_SUPPORT=y
-CONFIG_RISCV_DMA_NONCOHERENT=y
-CONFIG_RISCV_NONSTANDARD_CACHE_OPS=y
-CONFIG_AS_HAS_INSN=y
-CONFIG_AS_HAS_OPTION_ARCH=y
-
-#
-# SoC selection
-#
-CONFIG_ARCH_ANDES=y
-CONFIG_ARCH_ESWIN=y
-CONFIG_ARCH_MICROCHIP_POLARFIRE=y
-CONFIG_ARCH_MICROCHIP=y
-CONFIG_ARCH_RENESAS=y
-CONFIG_ARCH_SIFIVE=y
-CONFIG_ARCH_SOPHGO=y
-CONFIG_ARCH_SPACEMIT=y
-CONFIG_ARCH_STARFIVE=y
-CONFIG_SOC_STARFIVE=y
-CONFIG_ARCH_SUNXI=y
-CONFIG_ARCH_THEAD=y
-CONFIG_ARCH_VIRT=y
-CONFIG_ARCH_CANAAN=y
-# end of SoC selection
-
-#
-# CPU errata selection
-#
-CONFIG_ERRATA_ANDES=y
-# CONFIG_ERRATA_MIPS is not set
-CONFIG_ERRATA_SIFIVE=y
-CONFIG_ERRATA_SIFIVE_CIP_453=y
-CONFIG_ERRATA_SIFIVE_CIP_1200=y
-CONFIG_ERRATA_THEAD=y
-CONFIG_ERRATA_THEAD_MAE=y
-CONFIG_ERRATA_THEAD_CMO=y
-CONFIG_ERRATA_THEAD_PMU=y
-CONFIG_ERRATA_THEAD_GHOSTWRITE=y
-# end of CPU errata selection
-
-#
-# Platform type
-#
-# CONFIG_NONPORTABLE is not set
-CONFIG_ARCH_RV64I=y
-# CONFIG_CMODEL_MEDLOW is not set
-CONFIG_CMODEL_MEDANY=y
-CONFIG_MODULE_SECTIONS=y
-CONFIG_SMP=y
-CONFIG_NR_CPUS=384
-CONFIG_HOTPLUG_CPU=y
-CONFIG_TUNE_GENERIC=y
-CONFIG_NUMA=y
-CONFIG_NODES_SHIFT=6
-# CONFIG_RISCV_TICKET_SPINLOCKS is not set
-CONFIG_RISCV_COMBO_SPINLOCKS=y
-CONFIG_RISCV_ALTERNATIVE=y
-CONFIG_RISCV_ALTERNATIVE_EARLY=y
-CONFIG_RISCV_ISA_C=y
-CONFIG_RISCV_ISA_SUPM=y
-CONFIG_RISCV_ISA_SVNAPOT=y
-CONFIG_RISCV_ISA_SVPBMT=y
-CONFIG_TOOLCHAIN_HAS_V=y
-CONFIG_RISCV_ISA_V=y
-CONFIG_RISCV_ISA_V_DEFAULT_ENABLE=y
-CONFIG_RISCV_ISA_V_UCOPY_THRESHOLD=768
-CONFIG_RISCV_ISA_V_PREEMPTIVE=y
-CONFIG_RISCV_ISA_ZAWRS=y
-CONFIG_TOOLCHAIN_HAS_ZABHA=y
-CONFIG_RISCV_ISA_ZABHA=y
-CONFIG_TOOLCHAIN_HAS_ZACAS=y
-CONFIG_RISCV_ISA_ZACAS=y
-CONFIG_TOOLCHAIN_HAS_ZBB=y
-CONFIG_TOOLCHAIN_HAS_VECTOR_CRYPTO=y
-CONFIG_TOOLCHAIN_HAS_ZBA=y
-CONFIG_RISCV_ISA_ZBA=y
-CONFIG_RISCV_ISA_ZBB=y
-CONFIG_TOOLCHAIN_HAS_ZBC=y
-CONFIG_RISCV_ISA_ZBC=y
-CONFIG_TOOLCHAIN_HAS_ZBKB=y
-CONFIG_RISCV_ISA_ZBKB=y
-CONFIG_RISCV_ISA_ZICBOM=y
-CONFIG_RISCV_ISA_ZICBOZ=y
-CONFIG_RISCV_ISA_ZICBOP=y
-CONFIG_FPU=y
-CONFIG_IRQ_STACKS=y
-CONFIG_THREAD_SIZE_ORDER=2
-CONFIG_RISCV_MISALIGNED=y
-CONFIG_RISCV_SCALAR_MISALIGNED=y
-CONFIG_RISCV_VECTOR_MISALIGNED=y
-CONFIG_RISCV_PROBE_UNALIGNED_ACCESS=y
-# CONFIG_RISCV_EMULATED_UNALIGNED_ACCESS is not set
-CONFIG_RISCV_PROBE_VECTOR_UNALIGNED_ACCESS=y
-
-#
-# Vendor extensions
-#
-CONFIG_RISCV_ISA_VENDOR_EXT=y
-
-#
-# Andes
-#
-CONFIG_RISCV_ISA_VENDOR_EXT_ANDES=y
-# end of Andes
-
-#
-# MIPS
-#
-CONFIG_RISCV_ISA_VENDOR_EXT_MIPS=y
-# end of MIPS
-
-#
-# SiFive
-#
-CONFIG_RISCV_ISA_VENDOR_EXT_SIFIVE=y
-# end of SiFive
-
-#
-# T-Head
-#
-CONFIG_RISCV_ISA_VENDOR_EXT_THEAD=y
-CONFIG_RISCV_ISA_XTHEADVECTOR=y
-# end of T-Head
-# end of Vendor extensions
-# end of Platform type
-
-#
-# Kernel features
-#
-# CONFIG_HZ_100 is not set
-# CONFIG_HZ_250 is not set
-# CONFIG_HZ_300 is not set
-CONFIG_HZ_1000=y
-CONFIG_HZ=1000
-CONFIG_SCHED_HRTICK=y
-# CONFIG_RISCV_SBI_V01 is not set
-# CONFIG_RISCV_BOOT_SPINWAIT is not set
-CONFIG_ARCH_SUPPORTS_KEXEC=y
-CONFIG_ARCH_SELECTS_KEXEC=y
-CONFIG_ARCH_SUPPORTS_KEXEC_FILE=y
-CONFIG_ARCH_SELECTS_KEXEC_FILE=y
-CONFIG_ARCH_SUPPORTS_KEXEC_PURGATORY=y
-CONFIG_ARCH_SUPPORTS_CRASH_DUMP=y
-CONFIG_ARCH_DEFAULT_CRASH_DUMP=y
-CONFIG_ARCH_HAS_GENERIC_CRASHKERNEL_RESERVATION=y
-CONFIG_COMPAT=y
-CONFIG_PARAVIRT=y
-CONFIG_PARAVIRT_TIME_ACCOUNTING=y
-CONFIG_RELOCATABLE=y
-CONFIG_RANDOMIZE_BASE=y
-# end of Kernel features
-
-#
-# Boot options
-#
-CONFIG_CMDLINE=""
-CONFIG_EFI_STUB=y
-CONFIG_EFI=y
-CONFIG_DMI=y
-CONFIG_CC_HAVE_STACKPROTECTOR_TLS=y
-CONFIG_STACKPROTECTOR_PER_TASK=y
-CONFIG_RISCV_ISA_FALLBACK=y
-# end of Boot options
-
-CONFIG_PORTABLE=y
-CONFIG_ARCH_PROC_KCORE_TEXT=y
-
-#
-# Power management options
-#
-CONFIG_SUSPEND=y
-CONFIG_SUSPEND_FREEZER=y
-# CONFIG_SUSPEND_SKIP_SYNC is not set
-CONFIG_HIBERNATE_CALLBACKS=y
-CONFIG_HIBERNATION=y
-CONFIG_HIBERNATION_SNAPSHOT_DEV=y
-CONFIG_HIBERNATION_COMP_LZO=y
-# CONFIG_HIBERNATION_COMP_LZ4 is not set
-CONFIG_HIBERNATION_DEF_COMP="lzo"
-CONFIG_PM_STD_PARTITION=""
-CONFIG_PM_SLEEP=y
-CONFIG_PM_SLEEP_SMP=y
-# CONFIG_PM_AUTOSLEEP is not set
-# CONFIG_PM_USERSPACE_AUTOSLEEP is not set
-CONFIG_PM_WAKELOCKS=y
-CONFIG_PM_WAKELOCKS_LIMIT=100
-CONFIG_PM_WAKELOCKS_GC=y
-CONFIG_PM=y
-CONFIG_PM_DEBUG=y
-CONFIG_PM_ADVANCED_DEBUG=y
-# CONFIG_PM_TEST_SUSPEND is not set
-CONFIG_PM_SLEEP_DEBUG=y
-# CONFIG_DPM_WATCHDOG is not set
-CONFIG_PM_CLK=y
-CONFIG_PM_GENERIC_DOMAINS=y
-CONFIG_WQ_POWER_EFFICIENT_DEFAULT=y
-CONFIG_PM_GENERIC_DOMAINS_SLEEP=y
-CONFIG_PM_GENERIC_DOMAINS_OF=y
-CONFIG_CPU_PM=y
-CONFIG_ENERGY_MODEL=y
-CONFIG_ARCH_HIBERNATION_POSSIBLE=y
-CONFIG_ARCH_HIBERNATION_HEADER=y
-CONFIG_ARCH_SUSPEND_POSSIBLE=y
-# end of Power management options
-
-#
-# CPU Power Management
-#
-
-#
-# CPU Idle
-#
-CONFIG_CPU_IDLE=y
-CONFIG_CPU_IDLE_MULTIPLE_DRIVERS=y
-# CONFIG_CPU_IDLE_GOV_LADDER is not set
-CONFIG_CPU_IDLE_GOV_MENU=y
-# CONFIG_CPU_IDLE_GOV_TEO is not set
-CONFIG_DT_IDLE_STATES=y
-CONFIG_DT_IDLE_GENPD=y
-
-#
-# RISC-V CPU Idle Drivers
-#
-CONFIG_RISCV_SBI_CPUIDLE=y
-# end of RISC-V CPU Idle Drivers
-# end of CPU Idle
-
-#
-# CPU Frequency scaling
-#
-CONFIG_CPU_FREQ=y
-CONFIG_CPU_FREQ_GOV_ATTR_SET=y
-CONFIG_CPU_FREQ_GOV_COMMON=y
-CONFIG_CPU_FREQ_STAT=y
-CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
-# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set
-# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
-# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set
-# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
-# CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set
-CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
-CONFIG_CPU_FREQ_GOV_POWERSAVE=m
-CONFIG_CPU_FREQ_GOV_USERSPACE=m
-CONFIG_CPU_FREQ_GOV_ONDEMAND=m
-CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
-CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y
-
-#
-# CPU frequency scaling drivers
-#
-CONFIG_CPUFREQ_DT=m
-CONFIG_CPUFREQ_VIRT=m
-CONFIG_CPUFREQ_DT_PLATDEV=y
-CONFIG_ARM_ALLWINNER_SUN50I_CPUFREQ_NVMEM=m
-CONFIG_ACPI_CPPC_CPUFREQ=m
-CONFIG_ACPI_CPPC_CPUFREQ_FIE=y
-# end of CPU Frequency scaling
-# end of CPU Power Management
-
-CONFIG_KVM_COMMON=y
-CONFIG_HAVE_KVM_IRQCHIP=y
-CONFIG_HAVE_KVM_IRQ_ROUTING=y
-CONFIG_HAVE_KVM_DIRTY_RING=y
-CONFIG_HAVE_KVM_DIRTY_RING_ACQ_REL=y
-CONFIG_KVM_MMIO=y
-CONFIG_HAVE_KVM_MSI=y
-CONFIG_HAVE_KVM_READONLY_MEM=y
-CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT=y
-CONFIG_HAVE_KVM_VCPU_ASYNC_IOCTL=y
-CONFIG_VIRT_XFER_TO_GUEST_WORK=y
-CONFIG_KVM_GENERIC_HARDWARE_ENABLING=y
-CONFIG_KVM_GENERIC_MMU_NOTIFIER=y
-CONFIG_VIRTUALIZATION=y
-CONFIG_KVM=m
-CONFIG_ARCH_SUPPORTS_ACPI=y
-CONFIG_ACPI=y
-CONFIG_ACPI_GENERIC_GSI=y
-CONFIG_ACPI_TABLE_LIB=y
-CONFIG_ACPI_THERMAL_LIB=y
-# CONFIG_ACPI_DEBUGGER is not set
-CONFIG_ACPI_SPCR_TABLE=y
-CONFIG_ACPI_EC=y
-CONFIG_ACPI_EC_DEBUGFS=m
-CONFIG_ACPI_AC=m
-CONFIG_ACPI_BATTERY=m
-CONFIG_ACPI_BUTTON=m
-CONFIG_ACPI_TINY_POWER_BUTTON=m
-CONFIG_ACPI_TINY_POWER_BUTTON_SIGNAL=38
-CONFIG_ACPI_VIDEO=m
-CONFIG_ACPI_FAN=m
-CONFIG_ACPI_TAD=m
-CONFIG_ACPI_DOCK=y
-CONFIG_ACPI_PROCESSOR_IDLE=y
-CONFIG_ACPI_MCFG=y
-CONFIG_ACPI_CPPC_LIB=y
-CONFIG_ACPI_PROCESSOR=y
-CONFIG_ACPI_IPMI=m
-CONFIG_ACPI_THERMAL=m
-CONFIG_ACPI_CUSTOM_DSDT_FILE=""
-CONFIG_ACPI_DEBUG=y
-# CONFIG_ACPI_PCI_SLOT is not set
-CONFIG_ACPI_CONTAINER=y
-CONFIG_ACPI_HOTPLUG_MEMORY=y
-CONFIG_ACPI_HED=y
-CONFIG_ACPI_BGRT=y
-CONFIG_ACPI_REDUCED_HARDWARE_ONLY=y
-CONFIG_ACPI_NHLT=y
-CONFIG_ACPI_NFIT=m
-# CONFIG_NFIT_SECURITY_DEBUG is not set
-CONFIG_ACPI_NUMA=y
-CONFIG_ACPI_HMAT=y
-CONFIG_ACPI_WATCHDOG=y
-CONFIG_ACPI_CONFIGFS=m
-CONFIG_ACPI_PFRUT=m
-CONFIG_ACPI_RIMT=y
-CONFIG_ACPI_PPTT=y
-CONFIG_ACPI_PCC=y
-# CONFIG_ACPI_FFH is not set
-CONFIG_PMIC_OPREGION=y
-CONFIG_CPU_MITIGATIONS=y
-
-#
-# General architecture-dependent options
-#
-CONFIG_ARCH_SUPPORTS_SCHED_MC=y
-CONFIG_SCHED_MC=y
-CONFIG_HOTPLUG_CORE_SYNC=y
-CONFIG_HOTPLUG_CORE_SYNC_DEAD=y
-CONFIG_GENERIC_IRQ_ENTRY=y
-CONFIG_GENERIC_SYSCALL=y
-CONFIG_GENERIC_ENTRY=y
-CONFIG_KPROBES=y
-CONFIG_JUMP_LABEL=y
-# CONFIG_STATIC_KEYS_SELFTEST is not set
-CONFIG_UPROBES=y
-CONFIG_HAVE_64BIT_ALIGNED_ACCESS=y
-CONFIG_KRETPROBES=y
-CONFIG_KRETPROBE_ON_RETHOOK=y
-CONFIG_HAVE_KPROBES=y
-CONFIG_HAVE_KRETPROBES=y
-CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y
-CONFIG_TRACE_IRQFLAGS_SUPPORT=y
-CONFIG_HAVE_ARCH_TRACEHOOK=y
-CONFIG_HAVE_DMA_CONTIGUOUS=y
-CONFIG_GENERIC_SMP_IDLE_THREAD=y
-CONFIG_GENERIC_IDLE_POLL_SETUP=y
-CONFIG_ARCH_HAS_FORTIFY_SOURCE=y
-CONFIG_ARCH_HAS_SET_MEMORY=y
-CONFIG_ARCH_HAS_SET_DIRECT_MAP=y
-CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y
-CONFIG_ARCH_WANTS_NO_INSTR=y
-CONFIG_HAVE_ASM_MODVERSIONS=y
-CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
-CONFIG_HAVE_RSEQ=y
-CONFIG_HAVE_RUST=y
-CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y
-CONFIG_HAVE_PERF_REGS=y
-CONFIG_HAVE_PERF_USER_STACK_DUMP=y
-CONFIG_HAVE_ARCH_JUMP_LABEL=y
-CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y
-CONFIG_MMU_GATHER_TABLE_FREE=y
-CONFIG_MMU_GATHER_RCU_TABLE_FREE=y
-CONFIG_MMU_LAZY_TLB_REFCOUNT=y
-CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y
-CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y
-CONFIG_ARCH_WEAK_RELEASE_ACQUIRE=y
-CONFIG_HAVE_ARCH_SECCOMP=y
-CONFIG_HAVE_ARCH_SECCOMP_FILTER=y
-CONFIG_SECCOMP=y
-CONFIG_SECCOMP_FILTER=y
-# CONFIG_SECCOMP_CACHE_DEBUG is not set
-CONFIG_HAVE_ARCH_KSTACK_ERASE=y
-CONFIG_HAVE_STACKPROTECTOR=y
-CONFIG_STACKPROTECTOR=y
-CONFIG_STACKPROTECTOR_STRONG=y
-CONFIG_ARCH_SUPPORTS_SHADOW_CALL_STACK=y
-# CONFIG_SHADOW_CALL_STACK is not set
-CONFIG_ARCH_SUPPORTS_LTO_CLANG=y
-CONFIG_ARCH_SUPPORTS_LTO_CLANG_THIN=y
-CONFIG_HAS_LTO_CLANG=y
-CONFIG_LTO_NONE=y
-# CONFIG_LTO_CLANG_FULL is not set
-# CONFIG_LTO_CLANG_THIN is not set
-CONFIG_ARCH_SUPPORTS_CFI=y
-CONFIG_ARCH_USES_CFI_TRAPS=y
-CONFIG_CFI=y
-# CONFIG_CFI_ICALL_NORMALIZE_INTEGERS is not set
-CONFIG_HAVE_CFI_ICALL_NORMALIZE_INTEGERS=y
-# CONFIG_CFI_PERMISSIVE is not set
-CONFIG_HAVE_CONTEXT_TRACKING_USER=y
-CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y
-CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y
-CONFIG_HAVE_MOVE_PUD=y
-CONFIG_HAVE_MOVE_PMD=y
-CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y
-CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD=y
-CONFIG_HAVE_ARCH_HUGE_VMAP=y
-CONFIG_HAVE_ARCH_HUGE_VMALLOC=y
-CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y
-CONFIG_ARCH_WANT_PMD_MKWRITE=y
-CONFIG_HAVE_MOD_ARCH_SPECIFIC=y
-CONFIG_MODULES_USE_ELF_RELA=y
-CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK=y
-CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=y
-CONFIG_SOFTIRQ_ON_OWN_STACK=y
-CONFIG_ARCH_HAS_ELF_RANDOMIZE=y
-CONFIG_HAVE_ARCH_MMAP_RND_BITS=y
-CONFIG_ARCH_MMAP_RND_BITS=24
-CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS=y
-CONFIG_ARCH_MMAP_RND_COMPAT_BITS=8
-CONFIG_HAVE_PAGE_SIZE_4KB=y
-CONFIG_PAGE_SIZE_4KB=y
-CONFIG_PAGE_SIZE_LESS_THAN_64KB=y
-CONFIG_PAGE_SIZE_LESS_THAN_256KB=y
-CONFIG_PAGE_SHIFT=12
-CONFIG_ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT=y
-CONFIG_CLONE_BACKWARDS=y
-CONFIG_COMPAT_32BIT_TIME=y
-CONFIG_ARCH_SUPPORTS_RT=y
-CONFIG_HAVE_ARCH_VMAP_STACK=y
-CONFIG_VMAP_STACK=y
-CONFIG_HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET=y
-CONFIG_RANDOMIZE_KSTACK_OFFSET=y
-# CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT is not set
-CONFIG_ARCH_OPTIONAL_KERNEL_RWX=y
-CONFIG_ARCH_OPTIONAL_KERNEL_RWX_DEFAULT=y
-CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y
-CONFIG_STRICT_KERNEL_RWX=y
-CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y
-CONFIG_STRICT_MODULE_RWX=y
-CONFIG_ARCH_USE_MEMREMAP_PROT=y
-# CONFIG_LOCK_EVENT_COUNTS is not set
-CONFIG_ARCH_HAS_VDSO_ARCH_DATA=y
-CONFIG_HAVE_PREEMPT_DYNAMIC=y
-CONFIG_HAVE_PREEMPT_DYNAMIC_KEY=y
-CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y
-CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y
-CONFIG_ARCH_SUPPORTS_PAGE_TABLE_CHECK=y
-CONFIG_DYNAMIC_SIGFRAME=y
-CONFIG_ARCH_HAS_HW_PTE_YOUNG=y
-CONFIG_ARCH_HAS_KERNEL_FPU_SUPPORT=y
-CONFIG_ARCH_VMLINUX_NEEDS_RELOCS=y
-CONFIG_HAVE_GENERIC_TIF_BITS=y
-
-#
-# GCOV-based kernel profiling
-#
-# CONFIG_GCOV_KERNEL is not set
-CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y
-# end of GCOV-based kernel profiling
-
-CONFIG_HAVE_GCC_PLUGINS=y
-CONFIG_FUNCTION_ALIGNMENT_4B=y
-CONFIG_FUNCTION_ALIGNMENT=4
-CONFIG_CC_HAS_SANE_FUNCTION_ALIGNMENT=y
-# end of General architecture-dependent options
-
-CONFIG_RT_MUTEXES=y
-CONFIG_MODULE_SIG_FORMAT=y
-CONFIG_MODULES=y
-# CONFIG_MODULE_DEBUG is not set
-# CONFIG_MODULE_FORCE_LOAD is not set
-CONFIG_MODULE_UNLOAD=y
-CONFIG_MODULE_FORCE_UNLOAD=y
-# CONFIG_MODULE_UNLOAD_TAINT_TRACKING is not set
-CONFIG_MODVERSIONS=y
-CONFIG_GENKSYMS=y
-# CONFIG_GENDWARFKSYMS is not set
-CONFIG_ASM_MODVERSIONS=y
-# CONFIG_EXTENDED_MODVERSIONS is not set
-CONFIG_BASIC_MODVERSIONS=y
-# CONFIG_MODULE_SRCVERSION_ALL is not set
-CONFIG_MODULE_SIG=y
-CONFIG_MODULE_SIG_FORCE=y
-CONFIG_MODULE_SIG_ALL=y
-# CONFIG_MODULE_SIG_SHA1 is not set
-# CONFIG_MODULE_SIG_SHA256 is not set
-# CONFIG_MODULE_SIG_SHA384 is not set
-CONFIG_MODULE_SIG_SHA512=y
-# CONFIG_MODULE_SIG_SHA3_256 is not set
-# CONFIG_MODULE_SIG_SHA3_384 is not set
-# CONFIG_MODULE_SIG_SHA3_512 is not set
-CONFIG_MODULE_SIG_HASH="sha512"
-CONFIG_MODULE_COMPRESS=y
-# CONFIG_MODULE_COMPRESS_GZIP is not set
-# CONFIG_MODULE_COMPRESS_XZ is not set
-CONFIG_MODULE_COMPRESS_ZSTD=y
-CONFIG_MODULE_COMPRESS_ALL=y
-# CONFIG_MODULE_DECOMPRESS is not set
-# CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set
-CONFIG_MODPROBE_PATH="/system/sbin/modprobe"
-# CONFIG_TRIM_UNUSED_KSYMS is not set
-CONFIG_MODULES_TREE_LOOKUP=y
-CONFIG_BLOCK=y
-CONFIG_BLOCK_LEGACY_AUTOLOAD=y
-CONFIG_BLK_RQ_ALLOC_TIME=y
-CONFIG_BLK_CGROUP_RWSTAT=y
-CONFIG_BLK_DEV_BSG_COMMON=y
-CONFIG_BLK_ICQ=y
-CONFIG_BLK_DEV_BSGLIB=y
-CONFIG_BLK_DEV_INTEGRITY=y
-CONFIG_BLK_DEV_WRITE_MOUNTED=y
-CONFIG_BLK_DEV_ZONED=y
-CONFIG_BLK_DEV_THROTTLING=y
-CONFIG_BLK_WBT=y
-CONFIG_BLK_WBT_MQ=y
-CONFIG_BLK_CGROUP_IOLATENCY=y
-# CONFIG_BLK_CGROUP_FC_APPID is not set
-CONFIG_BLK_CGROUP_IOCOST=y
-CONFIG_BLK_CGROUP_IOPRIO=y
-CONFIG_BLK_DEBUG_FS=y
-CONFIG_BLK_SED_OPAL=y
-CONFIG_BLK_INLINE_ENCRYPTION=y
-CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y
-
-#
-# Partition Types
-#
-CONFIG_PARTITION_ADVANCED=y
-# CONFIG_ACORN_PARTITION is not set
-# CONFIG_AIX_PARTITION is not set
-# CONFIG_OSF_PARTITION is not set
-# CONFIG_AMIGA_PARTITION is not set
-# CONFIG_ATARI_PARTITION is not set
-# CONFIG_MAC_PARTITION is not set
-CONFIG_MSDOS_PARTITION=y
-CONFIG_BSD_DISKLABEL=y
-# CONFIG_MINIX_SUBPARTITION is not set
-# CONFIG_SOLARIS_X86_PARTITION is not set
-# CONFIG_UNIXWARE_DISKLABEL is not set
-# CONFIG_LDM_PARTITION is not set
-# CONFIG_SGI_PARTITION is not set
-# CONFIG_ULTRIX_PARTITION is not set
-# CONFIG_SUN_PARTITION is not set
-# CONFIG_KARMA_PARTITION is not set
-CONFIG_EFI_PARTITION=y
-# CONFIG_SYSV68_PARTITION is not set
-# CONFIG_CMDLINE_PARTITION is not set
-CONFIG_OF_PARTITION=y
-# end of Partition Types
-
-CONFIG_BLK_PM=y
-CONFIG_BLOCK_HOLDER_DEPRECATED=y
-CONFIG_BLK_MQ_STACKING=y
-
-#
-# IO Schedulers
-#
-CONFIG_MQ_IOSCHED_DEADLINE=y
-CONFIG_MQ_IOSCHED_KYBER=y
-CONFIG_IOSCHED_BFQ=m
-CONFIG_BFQ_GROUP_IOSCHED=y
-# CONFIG_BFQ_CGROUP_DEBUG is not set
-# end of IO Schedulers
-
-CONFIG_PREEMPT_NOTIFIERS=y
-CONFIG_PADATA=y
-CONFIG_ASN1=y
-CONFIG_UNINLINE_SPIN_UNLOCK=y
-CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y
-CONFIG_MUTEX_SPIN_ON_OWNER=y
-CONFIG_RWSEM_SPIN_ON_OWNER=y
-CONFIG_LOCK_SPIN_ON_OWNER=y
-CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y
-CONFIG_QUEUED_SPINLOCKS=y
-CONFIG_ARCH_USE_QUEUED_RWLOCKS=y
-CONFIG_QUEUED_RWLOCKS=y
-CONFIG_ARCH_HAS_MMIOWB=y
-CONFIG_MMIOWB=y
-CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE=y
-CONFIG_ARCH_HAS_PREPARE_SYNC_CORE_CMD=y
-CONFIG_ARCH_HAS_SYNC_CORE_BEFORE_USERMODE=y
-CONFIG_ARCH_HAS_SYSCALL_WRAPPER=y
-CONFIG_FREEZER=y
-
-#
-# Executable file formats
-#
-CONFIG_BINFMT_ELF=y
-CONFIG_COMPAT_BINFMT_ELF=y
-CONFIG_ELFCORE=y
-CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y
-CONFIG_BINFMT_SCRIPT=y
-CONFIG_ARCH_HAS_BINFMT_FLAT=y
-# CONFIG_BINFMT_FLAT is not set
-CONFIG_BINFMT_MISC=y
-CONFIG_COREDUMP=y
-CONFIG_ARCH_HAS_ELF_CORE_EFLAGS=y
-# end of Executable file formats
-
-#
-# Memory Management options
-#
-CONFIG_SWAP=y
-CONFIG_ZSWAP=y
-# CONFIG_ZSWAP_DEFAULT_ON is not set
-# CONFIG_ZSWAP_SHRINKER_DEFAULT_ON is not set
-# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_DEFLATE is not set
-# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_LZO is not set
-# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_842 is not set
-# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_LZ4 is not set
-# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_LZ4HC is not set
-CONFIG_ZSWAP_COMPRESSOR_DEFAULT_ZSTD=y
-CONFIG_ZSWAP_COMPRESSOR_DEFAULT="zstd"
-CONFIG_ZSMALLOC=y
-
-#
-# Zsmalloc allocator options
-#
-
-#
-# Zsmalloc is a common backend allocator for zswap & zram
-#
-# CONFIG_ZSMALLOC_STAT is not set
-CONFIG_ZSMALLOC_CHAIN_SIZE=8
-# end of Zsmalloc allocator options
-
-#
-# Slab allocator options
-#
-CONFIG_SLUB=y
-CONFIG_KVFREE_RCU_BATCHED=y
-# CONFIG_SLUB_TINY is not set
-CONFIG_SLAB_MERGE_DEFAULT=y
-CONFIG_SLAB_FREELIST_RANDOM=y
-CONFIG_SLAB_FREELIST_HARDENED=y
-CONFIG_SLAB_BUCKETS=y
-# CONFIG_SLUB_STATS is not set
-CONFIG_SLUB_CPU_PARTIAL=y
-CONFIG_RANDOM_KMALLOC_CACHES=y
-# end of Slab allocator options
-
-CONFIG_SHUFFLE_PAGE_ALLOCATOR=y
-# CONFIG_COMPAT_BRK is not set
-CONFIG_SELECT_MEMORY_MODEL=y
-CONFIG_SPARSEMEM_MANUAL=y
-CONFIG_SPARSEMEM=y
-CONFIG_SPARSEMEM_EXTREME=y
-CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
-CONFIG_SPARSEMEM_VMEMMAP=y
-CONFIG_ARCH_WANT_OPTIMIZE_DAX_VMEMMAP=y
-CONFIG_ARCH_WANT_OPTIMIZE_HUGETLB_VMEMMAP=y
-CONFIG_HAVE_GUP_FAST=y
-CONFIG_ARCH_KEEP_MEMBLOCK=y
-CONFIG_NUMA_KEEP_MEMINFO=y
-CONFIG_MEMORY_ISOLATION=y
-CONFIG_EXCLUSIVE_SYSTEM_RAM=y
-CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
-CONFIG_MEMORY_HOTPLUG=y
-CONFIG_MHP_DEFAULT_ONLINE_TYPE_OFFLINE=y
-# CONFIG_MHP_DEFAULT_ONLINE_TYPE_ONLINE_AUTO is not set
-# CONFIG_MHP_DEFAULT_ONLINE_TYPE_ONLINE_KERNEL is not set
-# CONFIG_MHP_DEFAULT_ONLINE_TYPE_ONLINE_MOVABLE is not set
-CONFIG_MEMORY_HOTREMOVE=y
-CONFIG_MHP_MEMMAP_ON_MEMORY=y
-CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y
-CONFIG_SPLIT_PTE_PTLOCKS=y
-CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y
-CONFIG_SPLIT_PMD_PTLOCKS=y
-CONFIG_MEMORY_BALLOON=y
-CONFIG_BALLOON_COMPACTION=y
-CONFIG_COMPACTION=y
-CONFIG_COMPACT_UNEVICTABLE_DEFAULT=1
-CONFIG_PAGE_REPORTING=y
-CONFIG_MIGRATION=y
-CONFIG_DEVICE_MIGRATION=y
-CONFIG_ARCH_ENABLE_HUGEPAGE_MIGRATION=y
-CONFIG_ARCH_ENABLE_THP_MIGRATION=y
-CONFIG_CONTIG_ALLOC=y
-CONFIG_PCP_BATCH_SCALE_MAX=5
-CONFIG_PHYS_ADDR_T_64BIT=y
-CONFIG_MMU_NOTIFIER=y
-CONFIG_KSM=y
-CONFIG_DEFAULT_MMAP_MIN_ADDR=65536
-CONFIG_ARCH_WANTS_THP_SWAP=y
-# CONFIG_PERSISTENT_HUGE_ZERO_FOLIO is not set
-CONFIG_MM_ID=y
-CONFIG_TRANSPARENT_HUGEPAGE=y
-# CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS is not set
-CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
-# CONFIG_TRANSPARENT_HUGEPAGE_NEVER is not set
-CONFIG_THP_SWAP=y
-# CONFIG_READ_ONLY_THP_FOR_FS is not set
-# CONFIG_NO_PAGE_MAPCOUNT is not set
-CONFIG_PAGE_MAPCOUNT=y
-CONFIG_PGTABLE_HAS_HUGE_LEAVES=y
-CONFIG_HAVE_GIGANTIC_FOLIOS=y
-CONFIG_ARCH_SUPPORTS_HUGE_PFNMAP=y
-CONFIG_ARCH_SUPPORTS_PMD_PFNMAP=y
-CONFIG_ARCH_SUPPORTS_PUD_PFNMAP=y
-CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y
-CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y
-CONFIG_USE_PERCPU_NUMA_NODE_ID=y
-CONFIG_HAVE_SETUP_PER_CPU_AREA=y
-CONFIG_CMA=y
-# CONFIG_CMA_DEBUGFS is not set
-# CONFIG_CMA_SYSFS is not set
-CONFIG_CMA_AREAS=20
-CONFIG_PAGE_BLOCK_MAX_ORDER=10
-CONFIG_GENERIC_EARLY_IOREMAP=y
-# CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set
-CONFIG_PAGE_IDLE_FLAG=y
-CONFIG_IDLE_PAGE_TRACKING=y
-CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y
-CONFIG_ZONE_DMA32=y
-CONFIG_ZONE_DEVICE=y
-CONFIG_HMM_MIRROR=y
-CONFIG_GET_FREE_REGION=y
-CONFIG_DEVICE_PRIVATE=y
-CONFIG_VMAP_PFN=y
-CONFIG_VM_EVENT_COUNTERS=y
-# CONFIG_PERCPU_STATS is not set
-# CONFIG_GUP_TEST is not set
-CONFIG_DMAPOOL_TEST=m
-CONFIG_ARCH_HAS_PTE_SPECIAL=y
-CONFIG_MEMFD_CREATE=y
-CONFIG_SECRETMEM=y
-# CONFIG_ANON_VMA_NAME is not set
-CONFIG_HAVE_ARCH_USERFAULTFD_MINOR=y
-CONFIG_USERFAULTFD=y
-CONFIG_LRU_GEN=y
-CONFIG_LRU_GEN_ENABLED=y
-# CONFIG_LRU_GEN_STATS is not set
-CONFIG_LRU_GEN_WALKS_MMU=y
-CONFIG_ARCH_SUPPORTS_PER_VMA_LOCK=y
-CONFIG_PER_VMA_LOCK=y
-CONFIG_LOCK_MM_AND_FIND_VMA=y
-CONFIG_EXECMEM=y
-CONFIG_NUMA_MEMBLKS=y
-# CONFIG_NUMA_EMU is not set
-
-#
-# Data Access Monitoring
-#
-CONFIG_DAMON=y
-CONFIG_DAMON_VADDR=y
-CONFIG_DAMON_PADDR=y
-CONFIG_DAMON_SYSFS=y
-CONFIG_DAMON_RECLAIM=y
-CONFIG_DAMON_LRU_SORT=y
-CONFIG_DAMON_STAT=y
-# CONFIG_DAMON_STAT_ENABLED_DEFAULT is not set
-# end of Data Access Monitoring
-# end of Memory Management options
-
-CONFIG_NET=y
-CONFIG_COMPAT_NETLINK_MESSAGES=y
-CONFIG_NET_INGRESS=y
-CONFIG_NET_EGRESS=y
-CONFIG_NET_XGRESS=y
-CONFIG_NET_REDIRECT=y
-CONFIG_SKB_DECRYPTED=y
-CONFIG_SKB_EXTENSIONS=y
-CONFIG_NET_DEVMEM=y
-CONFIG_NET_SHAPER=y
-CONFIG_NET_CRC32C=y
-
-#
-# Networking options
-#
-CONFIG_PACKET=m
-CONFIG_PACKET_DIAG=m
-CONFIG_INET_PSP=y
-CONFIG_UNIX=y
-CONFIG_AF_UNIX_OOB=y
-CONFIG_UNIX_DIAG=m
-CONFIG_TLS=m
-CONFIG_TLS_DEVICE=y
-# CONFIG_TLS_TOE is not set
-CONFIG_XFRM=y
-CONFIG_XFRM_OFFLOAD=y
-CONFIG_XFRM_ALGO=m
-CONFIG_XFRM_USER=m
-CONFIG_XFRM_INTERFACE=m
-# CONFIG_XFRM_SUB_POLICY is not set
-# CONFIG_XFRM_MIGRATE is not set
-# CONFIG_XFRM_STATISTICS is not set
-CONFIG_XFRM_AH=m
-CONFIG_XFRM_ESP=m
-CONFIG_XFRM_IPCOMP=m
-CONFIG_NET_KEY=m
-# CONFIG_NET_KEY_MIGRATE is not set
-CONFIG_XFRM_IPTFS=m
-CONFIG_XFRM_ESPINTCP=y
-CONFIG_SMC=m
-CONFIG_SMC_DIAG=m
-CONFIG_DIBS=m
-# CONFIG_DIBS_LO is not set
-CONFIG_XDP_SOCKETS=y
-CONFIG_XDP_SOCKETS_DIAG=m
-CONFIG_NET_HANDSHAKE=y
-CONFIG_INET=y
-CONFIG_IP_MULTICAST=y
-CONFIG_IP_ADVANCED_ROUTER=y
-# CONFIG_IP_FIB_TRIE_STATS is not set
-CONFIG_IP_MULTIPLE_TABLES=y
-CONFIG_IP_ROUTE_MULTIPATH=y
-CONFIG_IP_ROUTE_VERBOSE=y
-CONFIG_IP_ROUTE_CLASSID=y
-# CONFIG_IP_PNP is not set
-CONFIG_NET_IPIP=m
-CONFIG_NET_IPGRE_DEMUX=m
-CONFIG_NET_IP_TUNNEL=m
-CONFIG_NET_IPGRE=m
-# CONFIG_NET_IPGRE_BROADCAST is not set
-CONFIG_IP_MROUTE_COMMON=y
-CONFIG_IP_MROUTE=y
-CONFIG_IP_MROUTE_MULTIPLE_TABLES=y
-CONFIG_IP_PIMSM_V1=y
-CONFIG_IP_PIMSM_V2=y
-CONFIG_SYN_COOKIES=y
-CONFIG_NET_IPVTI=m
-CONFIG_NET_UDP_TUNNEL=m
-CONFIG_NET_FOU=m
-CONFIG_NET_FOU_IP_TUNNELS=y
-CONFIG_INET_AH=m
-CONFIG_INET_ESP=m
-CONFIG_INET_ESP_OFFLOAD=m
-CONFIG_INET_ESPINTCP=y
-CONFIG_INET_IPCOMP=m
-CONFIG_INET_TABLE_PERTURB_ORDER=16
-CONFIG_INET_XFRM_TUNNEL=m
-CONFIG_INET_TUNNEL=m
-CONFIG_INET_DIAG=m
-CONFIG_INET_TCP_DIAG=m
-CONFIG_INET_UDP_DIAG=m
-CONFIG_INET_RAW_DIAG=m
-CONFIG_INET_DIAG_DESTROY=y
-CONFIG_TCP_CONG_ADVANCED=y
-CONFIG_TCP_CONG_BIC=m
-CONFIG_TCP_CONG_CUBIC=y
-CONFIG_TCP_CONG_WESTWOOD=m
-CONFIG_TCP_CONG_HTCP=m
-CONFIG_TCP_CONG_HSTCP=m
-CONFIG_TCP_CONG_HYBLA=m
-CONFIG_TCP_CONG_VEGAS=m
-CONFIG_TCP_CONG_NV=m
-CONFIG_TCP_CONG_SCALABLE=m
-CONFIG_TCP_CONG_LP=m
-CONFIG_TCP_CONG_VENO=m
-CONFIG_TCP_CONG_YEAH=m
-CONFIG_TCP_CONG_ILLINOIS=m
-CONFIG_TCP_CONG_DCTCP=m
-CONFIG_TCP_CONG_CDG=m
-CONFIG_TCP_CONG_BBR=m
-CONFIG_DEFAULT_CUBIC=y
-# CONFIG_DEFAULT_RENO is not set
-CONFIG_DEFAULT_TCP_CONG="cubic"
-CONFIG_TCP_SIGPOOL=y
-CONFIG_TCP_MD5SIG=y
-CONFIG_IPV6=m
-CONFIG_IPV6_ROUTER_PREF=y
-CONFIG_IPV6_ROUTE_INFO=y
-CONFIG_IPV6_OPTIMISTIC_DAD=y
-CONFIG_INET6_AH=m
-CONFIG_INET6_ESP=m
-CONFIG_INET6_ESP_OFFLOAD=m
-CONFIG_INET6_ESPINTCP=y
-CONFIG_INET6_IPCOMP=m
-CONFIG_IPV6_MIP6=m
-CONFIG_IPV6_ILA=m
-CONFIG_INET6_XFRM_TUNNEL=m
-CONFIG_INET6_TUNNEL=m
-CONFIG_IPV6_VTI=m
-CONFIG_IPV6_SIT=m
-# CONFIG_IPV6_SIT_6RD is not set
-CONFIG_IPV6_NDISC_NODETYPE=y
-CONFIG_IPV6_TUNNEL=m
-CONFIG_IPV6_GRE=m
-CONFIG_IPV6_FOU=m
-CONFIG_IPV6_FOU_TUNNEL=m
-CONFIG_IPV6_MULTIPLE_TABLES=y
-CONFIG_IPV6_SUBTREES=y
-CONFIG_IPV6_MROUTE=y
-CONFIG_IPV6_MROUTE_MULTIPLE_TABLES=y
-CONFIG_IPV6_PIMSM_V2=y
-CONFIG_IPV6_SEG6_LWTUNNEL=y
-CONFIG_IPV6_SEG6_HMAC=y
-# CONFIG_IPV6_RPL_LWTUNNEL is not set
-# CONFIG_IPV6_IOAM6_LWTUNNEL is not set
-CONFIG_NETLABEL=y
-CONFIG_MPTCP=y
-CONFIG_INET_MPTCP_DIAG=m
-CONFIG_NETWORK_SECMARK=y
-CONFIG_NET_PTP_CLASSIFY=y
-# CONFIG_NETWORK_PHY_TIMESTAMPING is not set
-CONFIG_NETFILTER=y
-CONFIG_NETFILTER_ADVANCED=y
-CONFIG_BRIDGE_NETFILTER=m
-
-#
-# Core Netfilter Configuration
-#
-CONFIG_NETFILTER_INGRESS=y
-CONFIG_NETFILTER_EGRESS=y
-CONFIG_NETFILTER_SKIP_EGRESS=y
-CONFIG_NETFILTER_NETLINK=m
-CONFIG_NETFILTER_FAMILY_BRIDGE=y
-CONFIG_NETFILTER_FAMILY_ARP=y
-CONFIG_NETFILTER_BPF_LINK=y
-CONFIG_NETFILTER_NETLINK_HOOK=m
-CONFIG_NETFILTER_NETLINK_ACCT=m
-CONFIG_NETFILTER_NETLINK_QUEUE=m
-CONFIG_NETFILTER_NETLINK_LOG=m
-CONFIG_NETFILTER_NETLINK_OSF=m
-CONFIG_NF_CONNTRACK=m
-CONFIG_NF_LOG_SYSLOG=m
-CONFIG_NETFILTER_CONNCOUNT=m
-CONFIG_NF_CONNTRACK_MARK=y
-CONFIG_NF_CONNTRACK_SECMARK=y
-CONFIG_NF_CONNTRACK_ZONES=y
-CONFIG_NF_CONNTRACK_PROCFS=y
-CONFIG_NF_CONNTRACK_EVENTS=y
-CONFIG_NF_CONNTRACK_TIMEOUT=y
-CONFIG_NF_CONNTRACK_TIMESTAMP=y
-CONFIG_NF_CONNTRACK_LABELS=y
-CONFIG_NF_CONNTRACK_OVS=y
-CONFIG_NF_CT_PROTO_GRE=y
-CONFIG_NF_CT_PROTO_SCTP=y
-CONFIG_NF_CT_PROTO_UDPLITE=y
-CONFIG_NF_CONNTRACK_AMANDA=m
-CONFIG_NF_CONNTRACK_FTP=m
-CONFIG_NF_CONNTRACK_H323=m
-CONFIG_NF_CONNTRACK_IRC=m
-CONFIG_NF_CONNTRACK_BROADCAST=m
-CONFIG_NF_CONNTRACK_NETBIOS_NS=m
-CONFIG_NF_CONNTRACK_SNMP=m
-CONFIG_NF_CONNTRACK_PPTP=m
-CONFIG_NF_CONNTRACK_SANE=m
-CONFIG_NF_CONNTRACK_SIP=m
-CONFIG_NF_CONNTRACK_TFTP=m
-CONFIG_NF_CT_NETLINK=m
-CONFIG_NF_CT_NETLINK_TIMEOUT=m
-CONFIG_NF_CT_NETLINK_HELPER=m
-CONFIG_NETFILTER_NETLINK_GLUE_CT=y
-CONFIG_NF_NAT=m
-CONFIG_NF_NAT_AMANDA=m
-CONFIG_NF_NAT_FTP=m
-CONFIG_NF_NAT_IRC=m
-CONFIG_NF_NAT_SIP=m
-CONFIG_NF_NAT_TFTP=m
-CONFIG_NF_NAT_REDIRECT=y
-CONFIG_NF_NAT_MASQUERADE=y
-CONFIG_NF_NAT_OVS=y
-CONFIG_NETFILTER_SYNPROXY=m
-CONFIG_NF_TABLES=m
-CONFIG_NF_TABLES_INET=y
-CONFIG_NF_TABLES_NETDEV=y
-CONFIG_NFT_NUMGEN=m
-CONFIG_NFT_CT=m
-# CONFIG_NFT_EXTHDR_DCCP is not set
-CONFIG_NFT_FLOW_OFFLOAD=m
-CONFIG_NFT_CONNLIMIT=m
-CONFIG_NFT_LOG=m
-CONFIG_NFT_LIMIT=m
-CONFIG_NFT_MASQ=m
-CONFIG_NFT_REDIR=m
-CONFIG_NFT_NAT=m
-CONFIG_NFT_TUNNEL=m
-CONFIG_NFT_QUEUE=m
-CONFIG_NFT_QUOTA=m
-CONFIG_NFT_REJECT=m
-CONFIG_NFT_REJECT_INET=m
-CONFIG_NFT_COMPAT=m
-CONFIG_NFT_HASH=m
-CONFIG_NFT_FIB=m
-CONFIG_NFT_FIB_INET=m
-CONFIG_NFT_XFRM=m
-CONFIG_NFT_SOCKET=m
-CONFIG_NFT_OSF=m
-CONFIG_NFT_TPROXY=m
-CONFIG_NFT_SYNPROXY=m
-CONFIG_NF_DUP_NETDEV=m
-CONFIG_NFT_DUP_NETDEV=m
-CONFIG_NFT_FWD_NETDEV=m
-CONFIG_NFT_FIB_NETDEV=m
-CONFIG_NFT_REJECT_NETDEV=m
-CONFIG_NF_FLOW_TABLE_INET=m
-CONFIG_NF_FLOW_TABLE=m
-CONFIG_NF_FLOW_TABLE_PROCFS=y
-CONFIG_NETFILTER_XTABLES=m
-# CONFIG_NETFILTER_XTABLES_COMPAT is not set
-# CONFIG_NETFILTER_XTABLES_LEGACY is not set
-
-#
-# Xtables combined modules
-#
-CONFIG_NETFILTER_XT_MARK=m
-CONFIG_NETFILTER_XT_CONNMARK=m
-CONFIG_NETFILTER_XT_SET=m
-
-#
-# Xtables targets
-#
-CONFIG_NETFILTER_XT_TARGET_AUDIT=m
-CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m
-CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
-CONFIG_NETFILTER_XT_TARGET_CONNMARK=m
-CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=m
-CONFIG_NETFILTER_XT_TARGET_CT=m
-CONFIG_NETFILTER_XT_TARGET_DSCP=m
-CONFIG_NETFILTER_XT_TARGET_HL=m
-CONFIG_NETFILTER_XT_TARGET_HMARK=m
-CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m
-CONFIG_NETFILTER_XT_TARGET_LED=m
-CONFIG_NETFILTER_XT_TARGET_LOG=m
-CONFIG_NETFILTER_XT_TARGET_MARK=m
-CONFIG_NETFILTER_XT_NAT=m
-CONFIG_NETFILTER_XT_TARGET_NETMAP=m
-CONFIG_NETFILTER_XT_TARGET_NFLOG=m
-CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m
-CONFIG_NETFILTER_XT_TARGET_RATEEST=m
-CONFIG_NETFILTER_XT_TARGET_REDIRECT=m
-CONFIG_NETFILTER_XT_TARGET_MASQUERADE=m
-CONFIG_NETFILTER_XT_TARGET_TEE=m
-CONFIG_NETFILTER_XT_TARGET_TPROXY=m
-CONFIG_NETFILTER_XT_TARGET_SECMARK=m
-CONFIG_NETFILTER_XT_TARGET_TCPMSS=m
-CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m
-
-#
-# Xtables matches
-#
-CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m
-CONFIG_NETFILTER_XT_MATCH_BPF=m
-CONFIG_NETFILTER_XT_MATCH_CGROUP=m
-CONFIG_NETFILTER_XT_MATCH_CLUSTER=m
-CONFIG_NETFILTER_XT_MATCH_COMMENT=m
-CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m
-CONFIG_NETFILTER_XT_MATCH_CONNLABEL=m
-CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m
-CONFIG_NETFILTER_XT_MATCH_CONNMARK=m
-CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m
-CONFIG_NETFILTER_XT_MATCH_CPU=m
-CONFIG_NETFILTER_XT_MATCH_DCCP=m
-CONFIG_NETFILTER_XT_MATCH_DEVGROUP=m
-CONFIG_NETFILTER_XT_MATCH_DSCP=m
-CONFIG_NETFILTER_XT_MATCH_ECN=m
-CONFIG_NETFILTER_XT_MATCH_ESP=m
-CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m
-CONFIG_NETFILTER_XT_MATCH_HELPER=m
-CONFIG_NETFILTER_XT_MATCH_HL=m
-CONFIG_NETFILTER_XT_MATCH_IPCOMP=m
-CONFIG_NETFILTER_XT_MATCH_IPRANGE=m
-CONFIG_NETFILTER_XT_MATCH_IPVS=m
-CONFIG_NETFILTER_XT_MATCH_L2TP=m
-CONFIG_NETFILTER_XT_MATCH_LENGTH=m
-CONFIG_NETFILTER_XT_MATCH_LIMIT=m
-CONFIG_NETFILTER_XT_MATCH_MAC=m
-CONFIG_NETFILTER_XT_MATCH_MARK=m
-CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
-CONFIG_NETFILTER_XT_MATCH_NFACCT=m
-CONFIG_NETFILTER_XT_MATCH_OSF=m
-CONFIG_NETFILTER_XT_MATCH_OWNER=m
-CONFIG_NETFILTER_XT_MATCH_POLICY=m
-CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m
-CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
-CONFIG_NETFILTER_XT_MATCH_QUOTA=m
-CONFIG_NETFILTER_XT_MATCH_RATEEST=m
-CONFIG_NETFILTER_XT_MATCH_REALM=m
-CONFIG_NETFILTER_XT_MATCH_RECENT=m
-CONFIG_NETFILTER_XT_MATCH_SCTP=m
-CONFIG_NETFILTER_XT_MATCH_SOCKET=m
-CONFIG_NETFILTER_XT_MATCH_STATE=m
-CONFIG_NETFILTER_XT_MATCH_STATISTIC=m
-CONFIG_NETFILTER_XT_MATCH_STRING=m
-CONFIG_NETFILTER_XT_MATCH_TCPMSS=m
-CONFIG_NETFILTER_XT_MATCH_TIME=m
-CONFIG_NETFILTER_XT_MATCH_U32=m
-# end of Core Netfilter Configuration
-
-CONFIG_IP_SET=m
-CONFIG_IP_SET_MAX=256
-CONFIG_IP_SET_BITMAP_IP=m
-CONFIG_IP_SET_BITMAP_IPMAC=m
-CONFIG_IP_SET_BITMAP_PORT=m
-CONFIG_IP_SET_HASH_IP=m
-CONFIG_IP_SET_HASH_IPMARK=m
-CONFIG_IP_SET_HASH_IPPORT=m
-CONFIG_IP_SET_HASH_IPPORTIP=m
-CONFIG_IP_SET_HASH_IPPORTNET=m
-CONFIG_IP_SET_HASH_IPMAC=m
-CONFIG_IP_SET_HASH_MAC=m
-CONFIG_IP_SET_HASH_NETPORTNET=m
-CONFIG_IP_SET_HASH_NET=m
-CONFIG_IP_SET_HASH_NETNET=m
-CONFIG_IP_SET_HASH_NETPORT=m
-CONFIG_IP_SET_HASH_NETIFACE=m
-CONFIG_IP_SET_LIST_SET=m
-CONFIG_IP_VS=m
-CONFIG_IP_VS_IPV6=y
-# CONFIG_IP_VS_DEBUG is not set
-CONFIG_IP_VS_TAB_BITS=12
-
-#
-# IPVS transport protocol load balancing support
-#
-CONFIG_IP_VS_PROTO_TCP=y
-CONFIG_IP_VS_PROTO_UDP=y
-CONFIG_IP_VS_PROTO_AH_ESP=y
-CONFIG_IP_VS_PROTO_ESP=y
-CONFIG_IP_VS_PROTO_AH=y
-# CONFIG_IP_VS_PROTO_SCTP is not set
-
-#
-# IPVS scheduler
-#
-CONFIG_IP_VS_RR=m
-CONFIG_IP_VS_WRR=m
-CONFIG_IP_VS_LC=m
-CONFIG_IP_VS_WLC=m
-CONFIG_IP_VS_FO=m
-CONFIG_IP_VS_OVF=m
-CONFIG_IP_VS_LBLC=m
-CONFIG_IP_VS_LBLCR=m
-CONFIG_IP_VS_DH=m
-CONFIG_IP_VS_SH=m
-CONFIG_IP_VS_MH=m
-CONFIG_IP_VS_SED=m
-CONFIG_IP_VS_NQ=m
-CONFIG_IP_VS_TWOS=m
-
-#
-# IPVS SH scheduler
-#
-CONFIG_IP_VS_SH_TAB_BITS=8
-
-#
-# IPVS MH scheduler
-#
-CONFIG_IP_VS_MH_TAB_INDEX=12
-
-#
-# IPVS application helper
-#
-CONFIG_IP_VS_FTP=m
-CONFIG_IP_VS_NFCT=y
-CONFIG_IP_VS_PE_SIP=m
-
-#
-# IP: Netfilter Configuration
-#
-CONFIG_NF_DEFRAG_IPV4=m
-CONFIG_NF_SOCKET_IPV4=m
-CONFIG_NF_TPROXY_IPV4=m
-CONFIG_NF_TABLES_IPV4=y
-CONFIG_NFT_REJECT_IPV4=m
-CONFIG_NFT_DUP_IPV4=m
-CONFIG_NFT_FIB_IPV4=m
-CONFIG_NF_TABLES_ARP=y
-CONFIG_NF_DUP_IPV4=m
-CONFIG_NF_LOG_ARP=m
-CONFIG_NF_LOG_IPV4=m
-CONFIG_NF_REJECT_IPV4=m
-CONFIG_NF_NAT_SNMP_BASIC=m
-CONFIG_NF_NAT_PPTP=m
-CONFIG_NF_NAT_H323=m
-CONFIG_IP_NF_IPTABLES=m
-CONFIG_IP_NF_MATCH_AH=m
-CONFIG_IP_NF_MATCH_ECN=m
-CONFIG_IP_NF_MATCH_RPFILTER=m
-CONFIG_IP_NF_MATCH_TTL=m
-CONFIG_IP_NF_TARGET_REJECT=m
-CONFIG_IP_NF_TARGET_SYNPROXY=m
-CONFIG_IP_NF_TARGET_ECN=m
-CONFIG_NFT_COMPAT_ARP=m
-CONFIG_IP_NF_ARP_MANGLE=m
-# end of IP: Netfilter Configuration
-
-#
-# IPv6: Netfilter Configuration
-#
-CONFIG_NF_SOCKET_IPV6=m
-CONFIG_NF_TPROXY_IPV6=m
-CONFIG_NF_TABLES_IPV6=y
-CONFIG_NFT_REJECT_IPV6=m
-CONFIG_NFT_DUP_IPV6=m
-CONFIG_NFT_FIB_IPV6=m
-CONFIG_NF_DUP_IPV6=m
-CONFIG_NF_REJECT_IPV6=m
-CONFIG_NF_LOG_IPV6=m
-CONFIG_IP6_NF_IPTABLES=m
-CONFIG_IP6_NF_MATCH_AH=m
-CONFIG_IP6_NF_MATCH_EUI64=m
-CONFIG_IP6_NF_MATCH_FRAG=m
-CONFIG_IP6_NF_MATCH_OPTS=m
-CONFIG_IP6_NF_MATCH_HL=m
-CONFIG_IP6_NF_MATCH_IPV6HEADER=m
-CONFIG_IP6_NF_MATCH_MH=m
-CONFIG_IP6_NF_MATCH_RPFILTER=m
-CONFIG_IP6_NF_MATCH_RT=m
-CONFIG_IP6_NF_MATCH_SRH=m
-CONFIG_IP6_NF_TARGET_REJECT=m
-CONFIG_IP6_NF_TARGET_SYNPROXY=m
-CONFIG_IP6_NF_TARGET_NPT=m
-# end of IPv6: Netfilter Configuration
-
-CONFIG_NF_DEFRAG_IPV6=m
-CONFIG_NF_TABLES_BRIDGE=m
-CONFIG_NFT_BRIDGE_META=m
-CONFIG_NFT_BRIDGE_REJECT=m
-CONFIG_NF_CONNTRACK_BRIDGE=m
-CONFIG_BRIDGE_NF_EBTABLES=m
-CONFIG_BRIDGE_EBT_802_3=m
-CONFIG_BRIDGE_EBT_AMONG=m
-CONFIG_BRIDGE_EBT_ARP=m
-CONFIG_BRIDGE_EBT_IP=m
-CONFIG_BRIDGE_EBT_IP6=m
-CONFIG_BRIDGE_EBT_LIMIT=m
-CONFIG_BRIDGE_EBT_MARK=m
-CONFIG_BRIDGE_EBT_PKTTYPE=m
-CONFIG_BRIDGE_EBT_STP=m
-CONFIG_BRIDGE_EBT_VLAN=m
-CONFIG_BRIDGE_EBT_ARPREPLY=m
-CONFIG_BRIDGE_EBT_DNAT=m
-CONFIG_BRIDGE_EBT_MARK_T=m
-CONFIG_BRIDGE_EBT_REDIRECT=m
-CONFIG_BRIDGE_EBT_SNAT=m
-CONFIG_BRIDGE_EBT_LOG=m
-CONFIG_BRIDGE_EBT_NFLOG=m
-CONFIG_IP_SCTP=m
-CONFIG_SCTP_DBG_OBJCNT=y
-CONFIG_SCTP_DEFAULT_COOKIE_HMAC_SHA256=y
-# CONFIG_SCTP_DEFAULT_COOKIE_HMAC_NONE is not set
-CONFIG_INET_SCTP_DIAG=m
-CONFIG_RDS=m
-CONFIG_RDS_RDMA=m
-CONFIG_RDS_TCP=m
-# CONFIG_RDS_DEBUG is not set
-CONFIG_TIPC=m
-# CONFIG_TIPC_MEDIA_IB is not set
-CONFIG_TIPC_MEDIA_UDP=y
-CONFIG_TIPC_CRYPTO=y
-CONFIG_TIPC_DIAG=m
-CONFIG_ATM=m
-CONFIG_ATM_CLIP=m
-# CONFIG_ATM_CLIP_NO_ICMP is not set
-CONFIG_ATM_LANE=m
-CONFIG_ATM_MPOA=m
-CONFIG_ATM_BR2684=m
-# CONFIG_ATM_BR2684_IPFILTER is not set
-CONFIG_L2TP=m
-CONFIG_L2TP_DEBUGFS=m
-CONFIG_L2TP_V3=y
-CONFIG_L2TP_IP=m
-CONFIG_L2TP_ETH=m
-CONFIG_STP=m
-CONFIG_BRIDGE=m
-CONFIG_BRIDGE_IGMP_SNOOPING=y
-CONFIG_BRIDGE_VLAN_FILTERING=y
-# CONFIG_BRIDGE_MRP is not set
-# CONFIG_BRIDGE_CFM is not set
-CONFIG_NET_DSA=m
-CONFIG_NET_DSA_TAG_NONE=m
-CONFIG_NET_DSA_TAG_AR9331=m
-CONFIG_NET_DSA_TAG_BRCM_COMMON=m
-CONFIG_NET_DSA_TAG_BRCM=m
-CONFIG_NET_DSA_TAG_BRCM_LEGACY=m
-CONFIG_NET_DSA_TAG_BRCM_LEGACY_FCS=m
-CONFIG_NET_DSA_TAG_BRCM_PREPEND=m
-CONFIG_NET_DSA_TAG_HELLCREEK=m
-CONFIG_NET_DSA_TAG_GSWIP=m
-CONFIG_NET_DSA_TAG_DSA_COMMON=m
-CONFIG_NET_DSA_TAG_DSA=m
-CONFIG_NET_DSA_TAG_EDSA=m
-CONFIG_NET_DSA_TAG_MTK=m
-CONFIG_NET_DSA_TAG_KSZ=m
-CONFIG_NET_DSA_TAG_OCELOT=m
-CONFIG_NET_DSA_TAG_OCELOT_8021Q=m
-CONFIG_NET_DSA_TAG_QCA=m
-CONFIG_NET_DSA_TAG_RTL4_A=m
-CONFIG_NET_DSA_TAG_RTL8_4=m
-CONFIG_NET_DSA_TAG_RZN1_A5PSW=m
-CONFIG_NET_DSA_TAG_LAN9303=m
-CONFIG_NET_DSA_TAG_SJA1105=m
-CONFIG_NET_DSA_TAG_TRAILER=m
-CONFIG_NET_DSA_TAG_VSC73XX_8021Q=m
-CONFIG_NET_DSA_TAG_XRS700X=m
-CONFIG_VLAN_8021Q=m
-# CONFIG_VLAN_8021Q_GVRP is not set
-# CONFIG_VLAN_8021Q_MVRP is not set
-CONFIG_LLC=m
-CONFIG_LLC2=m
-CONFIG_ATALK=m
-CONFIG_X25=m
-CONFIG_LAPB=m
-CONFIG_PHONET=m
-CONFIG_6LOWPAN=m
-# CONFIG_6LOWPAN_DEBUGFS is not set
-CONFIG_6LOWPAN_NHC=m
-CONFIG_6LOWPAN_NHC_DEST=m
-CONFIG_6LOWPAN_NHC_FRAGMENT=m
-CONFIG_6LOWPAN_NHC_HOP=m
-CONFIG_6LOWPAN_NHC_IPV6=m
-CONFIG_6LOWPAN_NHC_MOBILITY=m
-CONFIG_6LOWPAN_NHC_ROUTING=m
-CONFIG_6LOWPAN_NHC_UDP=m
-CONFIG_6LOWPAN_GHC_EXT_HDR_HOP=m
-CONFIG_6LOWPAN_GHC_UDP=m
-CONFIG_6LOWPAN_GHC_ICMPV6=m
-CONFIG_6LOWPAN_GHC_EXT_HDR_DEST=m
-CONFIG_6LOWPAN_GHC_EXT_HDR_FRAG=m
-CONFIG_6LOWPAN_GHC_EXT_HDR_ROUTE=m
-CONFIG_IEEE802154=m
-# CONFIG_IEEE802154_NL802154_EXPERIMENTAL is not set
-CONFIG_IEEE802154_SOCKET=m
-CONFIG_IEEE802154_6LOWPAN=m
-CONFIG_MAC802154=m
-CONFIG_NET_SCHED=y
-
-#
-# Queueing/Scheduling
-#
-CONFIG_NET_SCH_HTB=m
-CONFIG_NET_SCH_HFSC=m
-CONFIG_NET_SCH_PRIO=m
-CONFIG_NET_SCH_MULTIQ=m
-CONFIG_NET_SCH_RED=m
-CONFIG_NET_SCH_SFB=m
-CONFIG_NET_SCH_SFQ=m
-CONFIG_NET_SCH_TEQL=m
-CONFIG_NET_SCH_TBF=m
-CONFIG_NET_SCH_CBS=m
-CONFIG_NET_SCH_ETF=m
-CONFIG_NET_SCH_MQPRIO_LIB=m
-CONFIG_NET_SCH_TAPRIO=m
-CONFIG_NET_SCH_GRED=m
-CONFIG_NET_SCH_NETEM=m
-CONFIG_NET_SCH_DRR=m
-CONFIG_NET_SCH_MQPRIO=m
-CONFIG_NET_SCH_SKBPRIO=m
-CONFIG_NET_SCH_CHOKE=m
-CONFIG_NET_SCH_QFQ=m
-CONFIG_NET_SCH_CODEL=m
-CONFIG_NET_SCH_FQ_CODEL=m
-CONFIG_NET_SCH_CAKE=m
-CONFIG_NET_SCH_FQ=m
-CONFIG_NET_SCH_HHF=m
-CONFIG_NET_SCH_PIE=m
-CONFIG_NET_SCH_FQ_PIE=m
-CONFIG_NET_SCH_INGRESS=m
-CONFIG_NET_SCH_PLUG=m
-CONFIG_NET_SCH_ETS=m
-CONFIG_NET_SCH_DUALPI2=m
-# CONFIG_NET_SCH_DEFAULT is not set
-
-#
-# Classification
-#
-CONFIG_NET_CLS=y
-CONFIG_NET_CLS_BASIC=m
-CONFIG_NET_CLS_ROUTE4=m
-CONFIG_NET_CLS_FW=m
-CONFIG_NET_CLS_U32=m
-CONFIG_CLS_U32_PERF=y
-CONFIG_CLS_U32_MARK=y
-CONFIG_NET_CLS_FLOW=m
-CONFIG_NET_CLS_CGROUP=m
-CONFIG_NET_CLS_BPF=m
-CONFIG_NET_CLS_FLOWER=m
-CONFIG_NET_CLS_MATCHALL=m
-CONFIG_NET_EMATCH=y
-CONFIG_NET_EMATCH_STACK=32
-CONFIG_NET_EMATCH_CMP=m
-CONFIG_NET_EMATCH_NBYTE=m
-CONFIG_NET_EMATCH_U32=m
-CONFIG_NET_EMATCH_META=m
-CONFIG_NET_EMATCH_TEXT=m
-CONFIG_NET_EMATCH_CANID=m
-CONFIG_NET_EMATCH_IPSET=m
-CONFIG_NET_EMATCH_IPT=m
-CONFIG_NET_CLS_ACT=y
-CONFIG_NET_ACT_POLICE=m
-CONFIG_NET_ACT_GACT=m
-# CONFIG_GACT_PROB is not set
-CONFIG_NET_ACT_MIRRED=m
-CONFIG_NET_ACT_SAMPLE=m
-CONFIG_NET_ACT_NAT=m
-CONFIG_NET_ACT_PEDIT=m
-CONFIG_NET_ACT_SIMP=m
-CONFIG_NET_ACT_SKBEDIT=m
-CONFIG_NET_ACT_CSUM=m
-CONFIG_NET_ACT_MPLS=m
-CONFIG_NET_ACT_VLAN=m
-CONFIG_NET_ACT_BPF=m
-CONFIG_NET_ACT_CONNMARK=m
-CONFIG_NET_ACT_CTINFO=m
-CONFIG_NET_ACT_SKBMOD=m
-CONFIG_NET_ACT_IFE=m
-CONFIG_NET_ACT_TUNNEL_KEY=m
-CONFIG_NET_ACT_CT=m
-CONFIG_NET_ACT_GATE=m
-CONFIG_NET_IFE_SKBMARK=m
-CONFIG_NET_IFE_SKBPRIO=m
-CONFIG_NET_IFE_SKBTCINDEX=m
-# CONFIG_NET_TC_SKB_EXT is not set
-CONFIG_NET_SCH_FIFO=y
-CONFIG_DCB=y
-CONFIG_DNS_RESOLVER=m
-CONFIG_BATMAN_ADV=m
-CONFIG_BATMAN_ADV_BATMAN_V=y
-CONFIG_BATMAN_ADV_BLA=y
-CONFIG_BATMAN_ADV_DAT=y
-CONFIG_BATMAN_ADV_MCAST=y
-# CONFIG_BATMAN_ADV_DEBUG is not set
-# CONFIG_BATMAN_ADV_TRACING is not set
-CONFIG_OPENVSWITCH=m
-CONFIG_OPENVSWITCH_GRE=m
-CONFIG_OPENVSWITCH_VXLAN=m
-CONFIG_OPENVSWITCH_GENEVE=m
-CONFIG_VSOCKETS=m
-CONFIG_VSOCKETS_DIAG=m
-CONFIG_VSOCKETS_LOOPBACK=m
-CONFIG_VIRTIO_VSOCKETS=m
-CONFIG_VIRTIO_VSOCKETS_COMMON=m
-CONFIG_NETLINK_DIAG=m
-CONFIG_MPLS=y
-CONFIG_NET_MPLS_GSO=m
-CONFIG_MPLS_ROUTING=m
-CONFIG_MPLS_IPTUNNEL=m
-CONFIG_NET_NSH=m
-CONFIG_HSR=m
-CONFIG_NET_SWITCHDEV=y
-CONFIG_NET_L3_MASTER_DEV=y
-CONFIG_QRTR=m
-CONFIG_QRTR_SMD=m
-CONFIG_QRTR_TUN=m
-CONFIG_QRTR_MHI=m
-# CONFIG_NET_NCSI is not set
-CONFIG_PCPU_DEV_REFCNT=y
-CONFIG_MAX_SKB_FRAGS=17
-CONFIG_RPS=y
-CONFIG_RFS_ACCEL=y
-CONFIG_SOCK_RX_QUEUE_MAPPING=y
-CONFIG_XPS=y
-CONFIG_CGROUP_NET_PRIO=y
-CONFIG_CGROUP_NET_CLASSID=y
-CONFIG_NET_RX_BUSY_POLL=y
-CONFIG_BQL=y
-CONFIG_BPF_STREAM_PARSER=y
-CONFIG_NET_FLOW_LIMIT=y
-
-#
-# Network testing
-#
-CONFIG_NET_PKTGEN=m
-CONFIG_NET_DROP_MONITOR=m
-# end of Network testing
-# end of Networking options
-
-CONFIG_HAMRADIO=y
-
-#
-# Packet Radio protocols
-#
-CONFIG_AX25=m
-CONFIG_AX25_DAMA_SLAVE=y
-CONFIG_NETROM=m
-CONFIG_ROSE=m
-
-#
-# AX.25 network device drivers
-#
-CONFIG_MKISS=m
-CONFIG_6PACK=m
-CONFIG_BPQETHER=m
-CONFIG_BAYCOM_SER_FDX=m
-CONFIG_BAYCOM_SER_HDX=m
-CONFIG_BAYCOM_PAR=m
-CONFIG_YAM=m
-# end of AX.25 network device drivers
-
-CONFIG_CAN=m
-CONFIG_CAN_RAW=m
-CONFIG_CAN_BCM=m
-CONFIG_CAN_GW=m
-CONFIG_CAN_J1939=m
-CONFIG_CAN_ISOTP=m
-CONFIG_BT=m
-CONFIG_BT_BREDR=y
-CONFIG_BT_RFCOMM=m
-CONFIG_BT_RFCOMM_TTY=y
-CONFIG_BT_BNEP=m
-# CONFIG_BT_BNEP_MC_FILTER is not set
-# CONFIG_BT_BNEP_PROTO_FILTER is not set
-CONFIG_BT_HIDP=m
-CONFIG_BT_LE=y
-CONFIG_BT_LE_L2CAP_ECRED=y
-CONFIG_BT_6LOWPAN=m
-# CONFIG_BT_LEDS is not set
-# CONFIG_BT_MSFTEXT is not set
-# CONFIG_BT_AOSPEXT is not set
-CONFIG_BT_DEBUGFS=y
-# CONFIG_BT_SELFTEST is not set
-
-#
-# Bluetooth device drivers
-#
-CONFIG_BT_INTEL=m
-CONFIG_BT_BCM=m
-CONFIG_BT_RTL=m
-CONFIG_BT_QCA=m
-CONFIG_BT_MTK=m
-CONFIG_BT_HCIBTUSB=m
-CONFIG_BT_HCIBTUSB_AUTOSUSPEND=y
-CONFIG_BT_HCIBTUSB_POLL_SYNC=y
-CONFIG_BT_HCIBTUSB_BCM=y
-CONFIG_BT_HCIBTUSB_MTK=y
-CONFIG_BT_HCIBTUSB_RTL=y
-CONFIG_BT_HCIBTSDIO=m
-CONFIG_BT_HCIUART=m
-CONFIG_BT_HCIUART_SERDEV=y
-CONFIG_BT_HCIUART_H4=y
-CONFIG_BT_HCIUART_NOKIA=m
-CONFIG_BT_HCIUART_BCSP=y
-# CONFIG_BT_HCIUART_ATH3K is not set
-CONFIG_BT_HCIUART_LL=y
-# CONFIG_BT_HCIUART_3WIRE is not set
-# CONFIG_BT_HCIUART_INTEL is not set
-# CONFIG_BT_HCIUART_RTL is not set
-CONFIG_BT_HCIUART_QCA=y
-# CONFIG_BT_HCIUART_AG6XX is not set
-# CONFIG_BT_HCIUART_MRVL is not set
-# CONFIG_BT_HCIUART_AML is not set
-CONFIG_BT_HCIBCM203X=m
-CONFIG_BT_HCIBCM4377=m
-CONFIG_BT_HCIBPA10X=m
-CONFIG_BT_HCIBFUSB=m
-CONFIG_BT_HCIDTL1=m
-CONFIG_BT_HCIBT3C=m
-CONFIG_BT_HCIBLUECARD=m
-CONFIG_BT_HCIVHCI=m
-CONFIG_BT_MRVL=m
-CONFIG_BT_MRVL_SDIO=m
-CONFIG_BT_ATH3K=m
-CONFIG_BT_MTKSDIO=m
-CONFIG_BT_MTKUART=m
-CONFIG_BT_HCIRSI=m
-CONFIG_BT_VIRTIO=m
-CONFIG_BT_NXPUART=m
-CONFIG_BT_INTEL_PCIE=m
-# end of Bluetooth device drivers
-
-CONFIG_AF_RXRPC=m
-# CONFIG_AF_RXRPC_IPV6 is not set
-# CONFIG_AF_RXRPC_INJECT_LOSS is not set
-# CONFIG_AF_RXRPC_INJECT_RX_DELAY is not set
-# CONFIG_AF_RXRPC_DEBUG is not set
-# CONFIG_RXKAD is not set
-CONFIG_RXGK=y
-CONFIG_RXPERF=m
-CONFIG_AF_KCM=m
-CONFIG_STREAM_PARSER=y
-# CONFIG_MCTP is not set
-CONFIG_FIB_RULES=y
-CONFIG_WIRELESS=y
-CONFIG_WIRELESS_EXT=y
-CONFIG_WEXT_CORE=y
-CONFIG_WEXT_PROC=y
-CONFIG_WEXT_PRIV=y
-CONFIG_CFG80211=m
-# CONFIG_NL80211_TESTMODE is not set
-# CONFIG_CFG80211_DEVELOPER_WARNINGS is not set
-CONFIG_CFG80211_CERTIFICATION_ONUS=y
-CONFIG_CFG80211_REQUIRE_SIGNED_REGDB=y
-CONFIG_CFG80211_USE_KERNEL_REGDB_KEYS=y
-CONFIG_CFG80211_EXTRA_REGDB_KEYDIR=""
-# CONFIG_CFG80211_REG_CELLULAR_HINTS is not set
-# CONFIG_CFG80211_REG_RELAX_NO_IR is not set
-CONFIG_CFG80211_DEFAULT_PS=y
-CONFIG_CFG80211_DEBUGFS=y
-CONFIG_CFG80211_CRDA_SUPPORT=y
-CONFIG_CFG80211_WEXT=y
-CONFIG_MAC80211=m
-CONFIG_MAC80211_HAS_RC=y
-CONFIG_MAC80211_RC_MINSTREL=y
-CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y
-CONFIG_MAC80211_RC_DEFAULT="minstrel_ht"
-CONFIG_MAC80211_MESH=y
-CONFIG_MAC80211_LEDS=y
-CONFIG_MAC80211_DEBUGFS=y
-# CONFIG_MAC80211_MESSAGE_TRACING is not set
-# CONFIG_MAC80211_DEBUG_MENU is not set
-CONFIG_MAC80211_STA_HASH_MAX_SIZE=0
-CONFIG_RFKILL=m
-CONFIG_RFKILL_LEDS=y
-CONFIG_RFKILL_INPUT=y
-CONFIG_RFKILL_GPIO=m
-CONFIG_NET_9P=m
-CONFIG_NET_9P_FD=m
-CONFIG_NET_9P_VIRTIO=m
-# CONFIG_NET_9P_USBG is not set
-CONFIG_NET_9P_RDMA=m
-# CONFIG_NET_9P_DEBUG is not set
-CONFIG_CAIF=m
-# CONFIG_CAIF_DEBUG is not set
-CONFIG_CAIF_NETDEV=m
-CONFIG_CAIF_USB=m
-CONFIG_CEPH_LIB=m
-# CONFIG_CEPH_LIB_PRETTYDEBUG is not set
-# CONFIG_CEPH_LIB_USE_DNS_RESOLVER is not set
-CONFIG_NFC=m
-CONFIG_NFC_DIGITAL=m
-CONFIG_NFC_NCI=m
-CONFIG_NFC_NCI_SPI=m
-CONFIG_NFC_NCI_UART=m
-CONFIG_NFC_HCI=m
-# CONFIG_NFC_SHDLC is not set
-
-#
-# Near Field Communication (NFC) devices
-#
-CONFIG_NFC_TRF7970A=m
-CONFIG_NFC_SIM=m
-CONFIG_NFC_PORT100=m
-CONFIG_NFC_VIRTUAL_NCI=m
-CONFIG_NFC_FDP=m
-CONFIG_NFC_FDP_I2C=m
-CONFIG_NFC_PN533=m
-CONFIG_NFC_PN533_USB=m
-CONFIG_NFC_PN533_I2C=m
-CONFIG_NFC_PN532_UART=m
-CONFIG_NFC_MRVL=m
-CONFIG_NFC_MRVL_USB=m
-CONFIG_NFC_MRVL_UART=m
-CONFIG_NFC_MRVL_I2C=m
-CONFIG_NFC_MRVL_SPI=m
-CONFIG_NFC_ST_NCI=m
-CONFIG_NFC_ST_NCI_I2C=m
-CONFIG_NFC_ST_NCI_SPI=m
-CONFIG_NFC_NXP_NCI=m
-CONFIG_NFC_NXP_NCI_I2C=m
-CONFIG_NFC_S3FWRN5=m
-CONFIG_NFC_S3FWRN5_I2C=m
-CONFIG_NFC_S3FWRN82_UART=m
-CONFIG_NFC_ST95HF=m
-# end of Near Field Communication (NFC) devices
-
-CONFIG_PSAMPLE=m
-CONFIG_NET_IFE=m
-CONFIG_LWTUNNEL=y
-CONFIG_LWTUNNEL_BPF=y
-CONFIG_DST_CACHE=y
-CONFIG_GRO_CELLS=y
-CONFIG_SOCK_VALIDATE_XMIT=y
-CONFIG_NET_IEEE8021Q_HELPERS=y
-CONFIG_NET_SELFTESTS=m
-CONFIG_NET_SOCK_MSG=y
-CONFIG_NET_DEVLINK=y
-CONFIG_PAGE_POOL=y
-CONFIG_PAGE_POOL_STATS=y
-CONFIG_FAILOVER=m
-CONFIG_ETHTOOL_NETLINK=y
-
-#
-# Device Drivers
-#
-CONFIG_ARM_AMBA=y
-CONFIG_HAVE_PCI=y
-CONFIG_GENERIC_PCI_IOMAP=y
-CONFIG_PCI=y
-CONFIG_PCI_DOMAINS=y
-CONFIG_PCI_DOMAINS_GENERIC=y
-CONFIG_PCIEPORTBUS=y
-CONFIG_HOTPLUG_PCI_PCIE=y
-# CONFIG_PCIEAER is not set
-CONFIG_PCIEASPM=y
-CONFIG_PCIEASPM_DEFAULT=y
-# CONFIG_PCIEASPM_POWERSAVE is not set
-# CONFIG_PCIEASPM_POWER_SUPERSAVE is not set
-# CONFIG_PCIEASPM_PERFORMANCE is not set
-CONFIG_PCIE_PME=y
-# CONFIG_PCIE_PTM is not set
-CONFIG_PCI_MSI=y
-CONFIG_PCI_QUIRKS=y
-# CONFIG_PCI_DEBUG is not set
-# CONFIG_PCI_REALLOC_ENABLE_AUTO is not set
-CONFIG_PCI_STUB=m
-CONFIG_PCI_PF_STUB=m
-CONFIG_PCI_ATS=y
-CONFIG_PCI_DOE=y
-CONFIG_PCI_ECAM=y
-CONFIG_PCI_IOV=y
-CONFIG_PCI_PRI=y
-CONFIG_PCI_PASID=y
-CONFIG_PCIE_TPH=y
-CONFIG_PCI_P2PDMA=y
-CONFIG_PCI_LABEL=y
-CONFIG_PCI_DYNAMIC_OF_NODES=y
-# CONFIG_PCIE_BUS_TUNE_OFF is not set
-CONFIG_PCIE_BUS_DEFAULT=y
-# CONFIG_PCIE_BUS_SAFE is not set
-# CONFIG_PCIE_BUS_PERFORMANCE is not set
-# CONFIG_PCIE_BUS_PEER2PEER is not set
-CONFIG_VGA_ARB=y
-CONFIG_VGA_ARB_MAX_GPUS=16
-CONFIG_HOTPLUG_PCI=y
-CONFIG_HOTPLUG_PCI_ACPI=y
-CONFIG_HOTPLUG_PCI_ACPI_IBM=m
-# CONFIG_HOTPLUG_PCI_CPCI is not set
-CONFIG_HOTPLUG_PCI_OCTEONEP=y
-# CONFIG_HOTPLUG_PCI_SHPC is not set
-
-#
-# PCI controller drivers
-#
-CONFIG_PCI_HOST_COMMON=y
-# CONFIG_PCI_FTPCI100 is not set
-CONFIG_PCI_HOST_GENERIC=m
-CONFIG_PCIE_RCAR_HOST=y
-# CONFIG_PCIE_XILINX is not set
-
-#
-# Cadence-based PCIe controllers
-#
-CONFIG_PCIE_CADENCE=m
-CONFIG_PCIE_CADENCE_HOST=m
-# CONFIG_PCIE_CADENCE_PLAT_HOST is not set
-CONFIG_PCIE_SG2042_HOST=m
-# end of Cadence-based PCIe controllers
-
-#
-# DesignWare-based PCIe controllers
-#
-CONFIG_PCIE_DW=y
-# CONFIG_PCIE_DW_DEBUGFS is not set
-CONFIG_PCIE_DW_HOST=y
-CONFIG_PCI_MESON=m
-# CONFIG_PCIE_DW_PLAT_HOST is not set
-CONFIG_PCIE_RCAR_GEN4=m
-CONFIG_PCIE_RCAR_GEN4_HOST=m
-CONFIG_PCIE_FU740=y
-CONFIG_PCIE_SOPHGO_DW=y
-# end of DesignWare-based PCIe controllers
-
-#
-# Mobiveil-based PCIe controllers
-#
-# end of Mobiveil-based PCIe controllers
-
-#
-# PLDA-based PCIe controllers
-#
-CONFIG_PCIE_PLDA_HOST=y
-CONFIG_PCIE_MICROCHIP_HOST=m
-CONFIG_PCIE_STARFIVE_HOST=m
-# end of PLDA-based PCIe controllers
-# end of PCI controller drivers
-
-#
-# PCI Endpoint
-#
-# CONFIG_PCI_ENDPOINT is not set
-# end of PCI Endpoint
-
-#
-# PCI switch controller drivers
-#
-CONFIG_PCI_SW_SWITCHTEC=m
-# end of PCI switch controller drivers
-
-CONFIG_PCI_PWRCTRL=m
-CONFIG_PCI_PWRCTRL_SLOT=m
-CONFIG_CXL_BUS=m
-CONFIG_CXL_PCI=m
-# CONFIG_CXL_MEM_RAW_COMMANDS is not set
-CONFIG_CXL_ACPI=m
-CONFIG_CXL_PMEM=m
-CONFIG_CXL_MEM=m
-CONFIG_CXL_FEATURES=y
-CONFIG_CXL_EDAC_MEM_FEATURES=y
-CONFIG_CXL_EDAC_SCRUB=y
-CONFIG_CXL_EDAC_ECS=y
-CONFIG_CXL_EDAC_MEM_REPAIR=y
-CONFIG_CXL_PORT=m
-CONFIG_CXL_SUSPEND=y
-CONFIG_CXL_REGION=y
-# CONFIG_CXL_REGION_INVALIDATION_TEST is not set
-CONFIG_PCCARD=m
-CONFIG_PCMCIA=m
-CONFIG_PCMCIA_LOAD_CIS=y
-CONFIG_CARDBUS=y
-
-#
-# PC-card bridges
-#
-CONFIG_YENTA=m
-CONFIG_YENTA_O2=y
-CONFIG_YENTA_RICOH=y
-CONFIG_YENTA_TI=y
-CONFIG_YENTA_ENE_TUNE=y
-CONFIG_YENTA_TOSHIBA=y
-CONFIG_PD6729=m
-CONFIG_I82092=m
-CONFIG_PCCARD_NONSTATIC=y
-CONFIG_RAPIDIO=m
-CONFIG_RAPIDIO_TSI721=m
-CONFIG_RAPIDIO_DISC_TIMEOUT=30
-# CONFIG_RAPIDIO_ENABLE_RX_TX_PORTS is not set
-# CONFIG_RAPIDIO_DMA_ENGINE is not set
-# CONFIG_RAPIDIO_DEBUG is not set
-CONFIG_RAPIDIO_ENUM_BASIC=m
-CONFIG_RAPIDIO_CHMAN=m
-CONFIG_RAPIDIO_MPORT_CDEV=m
-
-#
-# RapidIO Switch drivers
-#
-CONFIG_RAPIDIO_CPS_XX=m
-CONFIG_RAPIDIO_CPS_GEN2=m
-CONFIG_RAPIDIO_RXS_GEN3=m
-# end of RapidIO Switch drivers
-
-# CONFIG_PC104 is not set
-
-#
-# Generic Driver Options
-#
-CONFIG_AUXILIARY_BUS=y
-# CONFIG_UEVENT_HELPER is not set
-CONFIG_DEVTMPFS=y
-CONFIG_DEVTMPFS_MOUNT=y
-CONFIG_DEVTMPFS_SAFE=y
-# CONFIG_STANDALONE is not set
-CONFIG_PREVENT_FIRMWARE_BUILD=y
-
-#
-# Firmware loader
-#
-CONFIG_FW_LOADER=y
-CONFIG_FW_LOADER_DEBUG=y
-CONFIG_FW_LOADER_PAGED_BUF=y
-CONFIG_FW_LOADER_SYSFS=y
-CONFIG_EXTRA_FIRMWARE=""
-CONFIG_FW_LOADER_USER_HELPER=y
-# CONFIG_FW_LOADER_USER_HELPER_FALLBACK is not set
-CONFIG_FW_LOADER_COMPRESS=y
-# CONFIG_FW_LOADER_COMPRESS_XZ is not set
-CONFIG_FW_LOADER_COMPRESS_ZSTD=y
-CONFIG_FW_CACHE=y
-CONFIG_FW_UPLOAD=y
-# end of Firmware loader
-
-CONFIG_WANT_DEV_COREDUMP=y
-CONFIG_ALLOW_DEV_COREDUMP=y
-CONFIG_DEV_COREDUMP=y
-# CONFIG_DEBUG_DRIVER is not set
-# CONFIG_DEBUG_DEVRES is not set
-# CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set
-CONFIG_HMEM_REPORTING=y
-# CONFIG_TEST_ASYNC_DRIVER_PROBE is not set
-CONFIG_GENERIC_CPU_DEVICES=y
-CONFIG_GENERIC_CPU_VULNERABILITIES=y
-CONFIG_SOC_BUS=y
-CONFIG_REGMAP=y
-CONFIG_REGMAP_I2C=m
-CONFIG_REGMAP_SLIMBUS=m
-CONFIG_REGMAP_SPI=m
-CONFIG_REGMAP_SPMI=m
-CONFIG_REGMAP_W1=m
-CONFIG_REGMAP_MMIO=y
-CONFIG_REGMAP_IRQ=y
-CONFIG_REGMAP_SOUNDWIRE=m
-CONFIG_REGMAP_SOUNDWIRE_MBQ=m
-CONFIG_REGMAP_SCCB=m
-CONFIG_REGMAP_I3C=m
-CONFIG_REGMAP_SPI_AVMM=m
-CONFIG_DMA_SHARED_BUFFER=y
-# CONFIG_DMA_FENCE_TRACE is not set
-CONFIG_GENERIC_ARCH_TOPOLOGY=y
-CONFIG_GENERIC_ARCH_NUMA=y
-# CONFIG_FW_DEVLINK_SYNC_STATE_TIMEOUT is not set
-# end of Generic Driver Options
-
-#
-# Bus devices
-#
-CONFIG_MOXTET=m
-CONFIG_SUN50I_DE2_BUS=y
-CONFIG_SUNXI_RSB=m
-CONFIG_MHI_BUS=m
-# CONFIG_MHI_BUS_DEBUG is not set
-CONFIG_MHI_BUS_PCI_GENERIC=m
-CONFIG_MHI_BUS_EP=m
-# end of Bus devices
-
-#
-# Cache Drivers
-#
-CONFIG_AX45MP_L2_CACHE=y
-CONFIG_SIFIVE_CCACHE=y
-CONFIG_STARFIVE_STARLINK_CACHE=y
-# end of Cache Drivers
-
-CONFIG_CONNECTOR=y
-CONFIG_PROC_EVENTS=y
-
-#
-# Firmware Drivers
-#
-
-#
-# ARM System Control and Management Interface Protocol
-#
-# end of ARM System Control and Management Interface Protocol
-
-CONFIG_FIRMWARE_MEMMAP=y
-CONFIG_DMIID=y
-CONFIG_DMI_SYSFS=m
-CONFIG_ISCSI_IBFT=m
-CONFIG_FW_CFG_SYSFS=m
-# CONFIG_FW_CFG_SYSFS_CMDLINE is not set
-CONFIG_SYSFB=y
-CONFIG_SYSFB_SIMPLEFB=y
-CONFIG_TH1520_AON_PROTOCOL=m
-CONFIG_FW_CS_DSP=m
-CONFIG_GOOGLE_FIRMWARE=y
-CONFIG_GOOGLE_CBMEM=m
-CONFIG_GOOGLE_COREBOOT_TABLE=m
-CONFIG_GOOGLE_MEMCONSOLE=m
-CONFIG_GOOGLE_FRAMEBUFFER_COREBOOT=m
-CONFIG_GOOGLE_MEMCONSOLE_COREBOOT=m
-CONFIG_GOOGLE_VPD=m
-
-#
-# EFI (Extensible Firmware Interface) Support
-#
-CONFIG_EFI_ESRT=y
-CONFIG_EFI_VARS_PSTORE=m
-# CONFIG_EFI_VARS_PSTORE_DEFAULT_DISABLE is not set
-CONFIG_EFI_SOFT_RESERVE=y
-CONFIG_EFI_PARAMS_FROM_FDT=y
-CONFIG_EFI_RUNTIME_WRAPPERS=y
-CONFIG_EFI_GENERIC_STUB=y
-CONFIG_EFI_ZBOOT=y
-CONFIG_EFI_BOOTLOADER_CONTROL=m
-CONFIG_EFI_CAPSULE_LOADER=m
-# CONFIG_EFI_TEST is not set
-# CONFIG_RESET_ATTACK_MITIGATION is not set
-# CONFIG_EFI_DISABLE_PCI_DMA is not set
-CONFIG_EFI_EARLYCON=y
-CONFIG_EFI_CUSTOM_SSDT_OVERLAYS=y
-# CONFIG_EFI_DISABLE_RUNTIME is not set
-CONFIG_EFI_COCO_SECRET=y
-# CONFIG_OVMF_DEBUG_LOG is not set
-CONFIG_EFI_SBAT_FILE=""
-# end of EFI (Extensible Firmware Interface) Support
-
-CONFIG_POLARFIRE_SOC_AUTO_UPDATE=m
-
-#
-# Qualcomm firmware drivers
-#
-# end of Qualcomm firmware drivers
-
-#
-# Tegra firmware driver
-#
-# end of Tegra firmware driver
-# end of Firmware Drivers
-
-CONFIG_FWCTL=m
-CONFIG_FWCTL_MLX5=m
-CONFIG_FWCTL_PDS=m
-CONFIG_GNSS=m
-CONFIG_GNSS_SERIAL=m
-CONFIG_GNSS_MTK_SERIAL=m
-CONFIG_GNSS_SIRF_SERIAL=m
-CONFIG_GNSS_UBX_SERIAL=m
-CONFIG_GNSS_USB=m
-CONFIG_MTD=m
-# CONFIG_MTD_TESTS is not set
-
-#
-# Partition parsers
-#
-CONFIG_MTD_CMDLINE_PARTS=m
-CONFIG_MTD_OF_PARTS=m
-CONFIG_MTD_REDBOOT_PARTS=m
-CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1
-# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set
-# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set
-# end of Partition parsers
-
-#
-# User Modules And Translation Layers
-#
-CONFIG_MTD_BLKDEVS=m
-CONFIG_MTD_BLOCK=m
-CONFIG_MTD_BLOCK_RO=m
-
-#
-# Note that in some cases UBI block is preferred. See MTD_UBI_BLOCK.
-#
-CONFIG_FTL=m
-CONFIG_NFTL=m
-# CONFIG_NFTL_RW is not set
-CONFIG_INFTL=m
-CONFIG_RFD_FTL=m
-CONFIG_SSFDC=m
-CONFIG_SM_FTL=m
-CONFIG_MTD_OOPS=m
-CONFIG_MTD_PSTORE=m
-CONFIG_MTD_SWAP=m
-# CONFIG_MTD_PARTITIONED_MASTER is not set
-
-#
-# RAM/ROM/Flash chip drivers
-#
-CONFIG_MTD_CFI=m
-CONFIG_MTD_JEDECPROBE=m
-CONFIG_MTD_GEN_PROBE=m
-# CONFIG_MTD_CFI_ADV_OPTIONS is not set
-CONFIG_MTD_MAP_BANK_WIDTH_1=y
-CONFIG_MTD_MAP_BANK_WIDTH_2=y
-CONFIG_MTD_MAP_BANK_WIDTH_4=y
-CONFIG_MTD_CFI_I1=y
-CONFIG_MTD_CFI_I2=y
-CONFIG_MTD_CFI_INTELEXT=m
-CONFIG_MTD_CFI_AMDSTD=m
-CONFIG_MTD_CFI_STAA=m
-CONFIG_MTD_CFI_UTIL=m
-CONFIG_MTD_RAM=m
-CONFIG_MTD_ROM=m
-CONFIG_MTD_ABSENT=m
-# end of RAM/ROM/Flash chip drivers
-
-#
-# Mapping drivers for chip access
-#
-CONFIG_MTD_COMPLEX_MAPPINGS=y
-CONFIG_MTD_PHYSMAP=m
-# CONFIG_MTD_PHYSMAP_COMPAT is not set
-# CONFIG_MTD_PHYSMAP_OF is not set
-# CONFIG_MTD_PHYSMAP_GPIO_ADDR is not set
-CONFIG_MTD_PCI=m
-CONFIG_MTD_PCMCIA=m
-# CONFIG_MTD_PCMCIA_ANONYMOUS is not set
-CONFIG_MTD_PLATRAM=m
-# end of Mapping drivers for chip access
-
-#
-# Self-contained MTD device drivers
-#
-CONFIG_MTD_PMC551=m
-# CONFIG_MTD_PMC551_BUGFIX is not set
-# CONFIG_MTD_PMC551_DEBUG is not set
-CONFIG_MTD_DATAFLASH=m
-# CONFIG_MTD_DATAFLASH_WRITE_VERIFY is not set
-# CONFIG_MTD_DATAFLASH_OTP is not set
-CONFIG_MTD_MCHP23K256=m
-CONFIG_MTD_MCHP48L640=m
-CONFIG_MTD_SST25L=m
-CONFIG_MTD_SLRAM=m
-CONFIG_MTD_PHRAM=m
-CONFIG_MTD_MTDRAM=m
-CONFIG_MTDRAM_TOTAL_SIZE=4096
-CONFIG_MTDRAM_ERASE_SIZE=128
-CONFIG_MTD_BLOCK2MTD=m
-CONFIG_MTD_INTEL_DG=m
-
-#
-# Disk-On-Chip Device Drivers
-#
-CONFIG_MTD_DOCG3=m
-CONFIG_BCH_CONST_M=14
-CONFIG_BCH_CONST_T=4
-# end of Self-contained MTD device drivers
-
-#
-# NAND
-#
-CONFIG_MTD_NAND_CORE=m
-CONFIG_MTD_ONENAND=m
-# CONFIG_MTD_ONENAND_VERIFY_WRITE is not set
-CONFIG_MTD_ONENAND_GENERIC=m
-# CONFIG_MTD_ONENAND_OTP is not set
-# CONFIG_MTD_ONENAND_2X_PROGRAM is not set
-CONFIG_MTD_RAW_NAND=m
-
-#
-# Raw/parallel NAND flash controllers
-#
-CONFIG_MTD_NAND_DENALI=m
-CONFIG_MTD_NAND_DENALI_PCI=m
-CONFIG_MTD_NAND_DENALI_DT=m
-CONFIG_MTD_NAND_CAFE=m
-CONFIG_MTD_NAND_SUNXI=m
-CONFIG_MTD_NAND_MXIC=m
-CONFIG_MTD_NAND_GPIO=m
-CONFIG_MTD_NAND_PLATFORM=m
-CONFIG_MTD_NAND_CADENCE=m
-CONFIG_MTD_NAND_ARASAN=m
-CONFIG_MTD_NAND_INTEL_LGM=m
-CONFIG_MTD_NAND_RENESAS=m
-
-#
-# Misc
-#
-CONFIG_MTD_SM_COMMON=m
-CONFIG_MTD_NAND_NANDSIM=m
-CONFIG_MTD_NAND_RICOH=m
-CONFIG_MTD_NAND_DISKONCHIP=m
-# CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADVANCED is not set
-CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADDRESS=0
-# CONFIG_MTD_NAND_DISKONCHIP_BBTWRITE is not set
-CONFIG_MTD_SPI_NAND=m
-
-#
-# ECC engine support
-#
-CONFIG_MTD_NAND_ECC=y
-CONFIG_MTD_NAND_ECC_SW_HAMMING=y
-CONFIG_MTD_NAND_ECC_SW_HAMMING_SMC=y
-# CONFIG_MTD_NAND_ECC_SW_BCH is not set
-# CONFIG_MTD_NAND_ECC_MXIC is not set
-# end of ECC engine support
-# end of NAND
-
-#
-# LPDDR & LPDDR2 PCM memory drivers
-#
-CONFIG_MTD_LPDDR=m
-CONFIG_MTD_QINFO_PROBE=m
-# end of LPDDR & LPDDR2 PCM memory drivers
-
-CONFIG_MTD_SPI_NOR=m
-CONFIG_MTD_SPI_NOR_USE_4K_SECTORS=y
-# CONFIG_MTD_SPI_NOR_SWP_DISABLE is not set
-CONFIG_MTD_SPI_NOR_SWP_DISABLE_ON_VOLATILE=y
-# CONFIG_MTD_SPI_NOR_SWP_KEEP is not set
-CONFIG_MTD_UBI=m
-CONFIG_MTD_UBI_WL_THRESHOLD=4096
-CONFIG_MTD_UBI_BEB_LIMIT=20
-# CONFIG_MTD_UBI_FASTMAP is not set
-CONFIG_MTD_UBI_GLUEBI=m
-# CONFIG_MTD_UBI_BLOCK is not set
-CONFIG_MTD_UBI_NVMEM=m
-CONFIG_MTD_HYPERBUS=m
-CONFIG_DTC=y
-CONFIG_OF=y
-# CONFIG_OF_UNITTEST is not set
-CONFIG_OF_FLATTREE=y
-CONFIG_OF_EARLY_FLATTREE=y
-CONFIG_OF_KOBJ=y
-CONFIG_OF_DYNAMIC=y
-CONFIG_OF_ADDRESS=y
-CONFIG_OF_IRQ=y
-CONFIG_OF_RESERVED_MEM=y
-CONFIG_OF_RESOLVE=y
-CONFIG_OF_OVERLAY=y
-CONFIG_OF_NUMA=y
-CONFIG_PARPORT=m
-CONFIG_PARPORT_PC=m
-CONFIG_PARPORT_SERIAL=m
-# CONFIG_PARPORT_PC_FIFO is not set
-CONFIG_PARPORT_PC_PCMCIA=m
-# CONFIG_PARPORT_1284 is not set
-CONFIG_PARPORT_NOT_PC=y
-CONFIG_PNP=y
-CONFIG_PNP_DEBUG_MESSAGES=y
-
-#
-# Protocols
-#
-CONFIG_PNPACPI=y
-CONFIG_BLK_DEV=y
-CONFIG_BLK_DEV_NULL_BLK=m
-CONFIG_CDROM=m
-CONFIG_BLK_DEV_PCIESSD_MTIP32XX=y
-CONFIG_ZRAM=m
-# CONFIG_ZRAM_BACKEND_LZ4 is not set
-# CONFIG_ZRAM_BACKEND_LZ4HC is not set
-CONFIG_ZRAM_BACKEND_ZSTD=y
-# CONFIG_ZRAM_BACKEND_DEFLATE is not set
-# CONFIG_ZRAM_BACKEND_842 is not set
-# CONFIG_ZRAM_BACKEND_LZO is not set
-CONFIG_ZRAM_DEF_COMP_ZSTD=y
-CONFIG_ZRAM_DEF_COMP="zstd"
-CONFIG_ZRAM_WRITEBACK=y
-# CONFIG_ZRAM_TRACK_ENTRY_ACTIME is not set
-# CONFIG_ZRAM_MEMORY_TRACKING is not set
-CONFIG_ZRAM_MULTI_COMP=y
-CONFIG_BLK_DEV_LOOP=m
-CONFIG_BLK_DEV_LOOP_MIN_COUNT=8
-CONFIG_BLK_DEV_DRBD=m
-# CONFIG_DRBD_FAULT_INJECTION is not set
-CONFIG_BLK_DEV_NBD=m
-CONFIG_BLK_DEV_RAM=m
-CONFIG_BLK_DEV_RAM_COUNT=16
-CONFIG_BLK_DEV_RAM_SIZE=4096
-CONFIG_ATA_OVER_ETH=m
-CONFIG_VIRTIO_BLK=y
-CONFIG_BLK_DEV_RBD=m
-CONFIG_BLK_DEV_UBLK=m
-CONFIG_BLKDEV_UBLK_LEGACY_OPCODES=y
-CONFIG_BLK_DEV_RNBD=y
-CONFIG_BLK_DEV_RNBD_CLIENT=m
-CONFIG_BLK_DEV_RNBD_SERVER=m
-CONFIG_BLK_DEV_ZONED_LOOP=m
-
-#
-# NVME Support
-#
-CONFIG_NVME_KEYRING=y
-CONFIG_NVME_AUTH=y
-CONFIG_NVME_CORE=y
-CONFIG_BLK_DEV_NVME=y
-CONFIG_NVME_MULTIPATH=y
-# CONFIG_NVME_VERBOSE_ERRORS is not set
-CONFIG_NVME_FABRICS=m
-CONFIG_NVME_RDMA=m
-CONFIG_NVME_FC=m
-CONFIG_NVME_TCP=m
-CONFIG_NVME_TCP_TLS=y
-CONFIG_NVME_HOST_AUTH=y
-CONFIG_NVME_TARGET=m
-# CONFIG_NVME_TARGET_DEBUGFS is not set
-CONFIG_NVME_TARGET_PASSTHRU=y
-CONFIG_NVME_TARGET_LOOP=m
-CONFIG_NVME_TARGET_RDMA=m
-CONFIG_NVME_TARGET_FC=m
-CONFIG_NVME_TARGET_FCLOOP=m
-CONFIG_NVME_TARGET_TCP=m
-CONFIG_NVME_TARGET_TCP_TLS=y
-CONFIG_NVME_TARGET_AUTH=y
-# end of NVME Support
-
-#
-# Misc devices
-#
-CONFIG_SENSORS_LIS3LV02D=m
-CONFIG_AD525X_DPOT=m
-CONFIG_AD525X_DPOT_I2C=m
-CONFIG_AD525X_DPOT_SPI=m
-CONFIG_DUMMY_IRQ=m
-CONFIG_PHANTOM=m
-CONFIG_RPMB=m
-CONFIG_TI_FPC202=m
-CONFIG_TIFM_CORE=m
-CONFIG_TIFM_7XX1=m
-CONFIG_ICS932S401=m
-CONFIG_ENCLOSURE_SERVICES=m
-CONFIG_SMPRO_ERRMON=m
-CONFIG_SMPRO_MISC=m
-CONFIG_HI6421V600_IRQ=m
-CONFIG_HP_ILO=m
-CONFIG_APDS9802ALS=m
-CONFIG_ISL29003=m
-CONFIG_ISL29020=m
-CONFIG_SENSORS_TSL2550=m
-CONFIG_SENSORS_BH1770=m
-CONFIG_SENSORS_APDS990X=m
-CONFIG_HMC6352=m
-CONFIG_DS1682=m
-CONFIG_LATTICE_ECP3_CONFIG=m
-# CONFIG_SRAM is not set
-CONFIG_DW_XDATA_PCIE=m
-CONFIG_PCI_ENDPOINT_TEST=m
-CONFIG_XILINX_SDFEC=m
-CONFIG_MISC_RTSX=m
-CONFIG_HISI_HIKEY_USB=m
-CONFIG_OPEN_DICE=m
-CONFIG_NTSYNC=m
-CONFIG_VCPU_STALL_DETECTOR=m
-CONFIG_TPS6594_ESM=m
-CONFIG_TPS6594_PFSM=m
-CONFIG_NSM=m
-CONFIG_MCHP_LAN966X_PCI=m
-CONFIG_C2PORT=m
-
-#
-# EEPROM support
-#
-CONFIG_EEPROM_AT24=m
-CONFIG_EEPROM_AT25=m
-CONFIG_EEPROM_MAX6875=m
-CONFIG_EEPROM_93CX6=m
-CONFIG_EEPROM_93XX46=m
-CONFIG_EEPROM_IDT_89HPESX=m
-CONFIG_EEPROM_EE1004=m
-CONFIG_EEPROM_M24LR=m
-# end of EEPROM support
-
-CONFIG_CB710_CORE=m
-# CONFIG_CB710_DEBUG is not set
-CONFIG_CB710_DEBUG_ASSUMPTIONS=y
-CONFIG_SENSORS_LIS3_I2C=m
-
-#
-# Altera FPGA firmware download module (requires I2C)
-#
-CONFIG_ALTERA_STAPL=m
-CONFIG_GENWQE=m
-CONFIG_GENWQE_PLATFORM_ERROR_RECOVERY=0
-CONFIG_BCM_VK=m
-# CONFIG_BCM_VK_TTY is not set
-CONFIG_MISC_ALCOR_PCI=m
-CONFIG_MISC_RTSX_PCI=m
-CONFIG_MISC_RTSX_USB=m
-CONFIG_UACCE=m
-# CONFIG_PVPANIC is not set
-CONFIG_GP_PCI1XXXX=m
-CONFIG_MISC_RP1=m
-# end of Misc devices
-
-#
-# SCSI device support
-#
-CONFIG_SCSI_MOD=y
-CONFIG_RAID_ATTRS=m
-CONFIG_SCSI_COMMON=y
-CONFIG_SCSI=y
-CONFIG_SCSI_DMA=y
-CONFIG_SCSI_NETLINK=y
-CONFIG_SCSI_PROC_FS=y
-
-#
-# SCSI support type (disk, tape, CD-ROM)
-#
-CONFIG_BLK_DEV_SD=y
-CONFIG_CHR_DEV_ST=m
-CONFIG_BLK_DEV_SR=m
-CONFIG_CHR_DEV_SG=m
-CONFIG_BLK_DEV_BSG=y
-CONFIG_CHR_DEV_SCH=m
-CONFIG_SCSI_ENCLOSURE=m
-CONFIG_SCSI_CONSTANTS=y
-CONFIG_SCSI_LOGGING=y
-# CONFIG_SCSI_SCAN_ASYNC is not set
-
-#
-# SCSI Transports
-#
-CONFIG_SCSI_SPI_ATTRS=m
-CONFIG_SCSI_FC_ATTRS=m
-CONFIG_SCSI_ISCSI_ATTRS=m
-CONFIG_SCSI_SAS_ATTRS=m
-CONFIG_SCSI_SAS_LIBSAS=m
-CONFIG_SCSI_SAS_ATA=y
-CONFIG_SCSI_SAS_HOST_SMP=y
-CONFIG_SCSI_SRP_ATTRS=m
-# end of SCSI Transports
-
-CONFIG_SCSI_LOWLEVEL=y
-CONFIG_ISCSI_TCP=m
-CONFIG_ISCSI_BOOT_SYSFS=m
-CONFIG_SCSI_CXGB3_ISCSI=m
-CONFIG_SCSI_CXGB4_ISCSI=m
-CONFIG_SCSI_BNX2_ISCSI=m
-CONFIG_SCSI_BNX2X_FCOE=m
-CONFIG_BE2ISCSI=m
-CONFIG_BLK_DEV_3W_XXXX_RAID=m
-CONFIG_SCSI_HPSA=m
-CONFIG_SCSI_3W_9XXX=m
-CONFIG_SCSI_3W_SAS=m
-CONFIG_SCSI_ACARD=m
-CONFIG_SCSI_AACRAID=m
-CONFIG_SCSI_AIC7XXX=m
-CONFIG_AIC7XXX_CMDS_PER_DEVICE=32
-CONFIG_AIC7XXX_RESET_DELAY_MS=5000
-CONFIG_AIC7XXX_DEBUG_ENABLE=y
-CONFIG_AIC7XXX_DEBUG_MASK=0
-CONFIG_AIC7XXX_REG_PRETTY_PRINT=y
-CONFIG_SCSI_AIC79XX=m
-CONFIG_AIC79XX_CMDS_PER_DEVICE=32
-CONFIG_AIC79XX_RESET_DELAY_MS=5000
-CONFIG_AIC79XX_DEBUG_ENABLE=y
-CONFIG_AIC79XX_DEBUG_MASK=0
-CONFIG_AIC79XX_REG_PRETTY_PRINT=y
-CONFIG_SCSI_AIC94XX=m
-CONFIG_AIC94XX_DEBUG=y
-CONFIG_SCSI_MVSAS=m
-CONFIG_SCSI_MVSAS_DEBUG=y
-# CONFIG_SCSI_MVSAS_TASKLET is not set
-CONFIG_SCSI_MVUMI=m
-CONFIG_SCSI_ADVANSYS=m
-CONFIG_SCSI_ARCMSR=m
-CONFIG_SCSI_ESAS2R=m
-CONFIG_MEGARAID_NEWGEN=y
-CONFIG_MEGARAID_MM=m
-CONFIG_MEGARAID_MAILBOX=m
-CONFIG_MEGARAID_LEGACY=m
-CONFIG_MEGARAID_SAS=m
-CONFIG_SCSI_MPT3SAS=m
-CONFIG_SCSI_MPT2SAS_MAX_SGE=128
-CONFIG_SCSI_MPT3SAS_MAX_SGE=128
-CONFIG_SCSI_MPT2SAS=m
-CONFIG_SCSI_MPI3MR=m
-CONFIG_SCSI_SMARTPQI=m
-CONFIG_SCSI_HPTIOP=m
-CONFIG_SCSI_BUSLOGIC=m
-# CONFIG_SCSI_FLASHPOINT is not set
-CONFIG_SCSI_MYRB=m
-CONFIG_SCSI_MYRS=m
-CONFIG_LIBFC=m
-CONFIG_LIBFCOE=m
-CONFIG_FCOE=m
-CONFIG_SCSI_SNIC=m
-# CONFIG_SCSI_SNIC_DEBUG_FS is not set
-CONFIG_SCSI_DMX3191D=m
-CONFIG_SCSI_FDOMAIN=m
-CONFIG_SCSI_FDOMAIN_PCI=m
-CONFIG_SCSI_IPS=m
-CONFIG_SCSI_INITIO=m
-CONFIG_SCSI_INIA100=m
-CONFIG_SCSI_PPA=m
-CONFIG_SCSI_IMM=m
-# CONFIG_SCSI_IZIP_SLOW_CTR is not set
-CONFIG_SCSI_STEX=m
-CONFIG_SCSI_SYM53C8XX_2=m
-CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1
-CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
-CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
-CONFIG_SCSI_SYM53C8XX_MMIO=y
-CONFIG_SCSI_IPR=m
-CONFIG_SCSI_IPR_TRACE=y
-CONFIG_SCSI_IPR_DUMP=y
-CONFIG_SCSI_QLOGIC_1280=m
-CONFIG_SCSI_QLA_FC=m
-CONFIG_TCM_QLA2XXX=m
-# CONFIG_TCM_QLA2XXX_DEBUG is not set
-CONFIG_SCSI_QLA_ISCSI=m
-CONFIG_QEDI=m
-CONFIG_QEDF=m
-CONFIG_SCSI_LPFC=m
-# CONFIG_SCSI_LPFC_DEBUG_FS is not set
-CONFIG_SCSI_EFCT=m
-CONFIG_SCSI_DC395x=m
-CONFIG_SCSI_AM53C974=m
-CONFIG_SCSI_WD719X=m
-CONFIG_SCSI_DEBUG=m
-CONFIG_SCSI_PMCRAID=m
-CONFIG_SCSI_PM8001=m
-CONFIG_SCSI_BFA_FC=m
-CONFIG_SCSI_VIRTIO=y
-CONFIG_SCSI_CHELSIO_FCOE=m
-CONFIG_SCSI_LOWLEVEL_PCMCIA=y
-CONFIG_PCMCIA_AHA152X=m
-CONFIG_PCMCIA_FDOMAIN=m
-CONFIG_PCMCIA_QLOGIC=m
-CONFIG_PCMCIA_SYM53C500=m
-# CONFIG_SCSI_DH is not set
-# end of SCSI device support
-
-CONFIG_ATA=y
-CONFIG_SATA_HOST=y
-CONFIG_PATA_TIMINGS=y
-CONFIG_ATA_VERBOSE_ERROR=y
-CONFIG_ATA_FORCE=y
-CONFIG_ATA_ACPI=y
-# CONFIG_SATA_ZPODD is not set
-CONFIG_SATA_PMP=y
-
-#
-# Controllers with non-SFF native interface
-#
-CONFIG_SATA_AHCI=y
-CONFIG_SATA_MOBILE_LPM_POLICY=3
-CONFIG_SATA_AHCI_PLATFORM=y
-CONFIG_AHCI_DWC=y
-CONFIG_AHCI_CEVA=y
-CONFIG_AHCI_SUNXI=m
-CONFIG_SATA_INIC162X=m
-CONFIG_SATA_ACARD_AHCI=y
-CONFIG_SATA_SIL24=y
-CONFIG_ATA_SFF=y
-
-#
-# SFF controllers with custom DMA interface
-#
-CONFIG_PDC_ADMA=y
-CONFIG_SATA_QSTOR=y
-CONFIG_SATA_SX4=m
-CONFIG_ATA_BMDMA=y
-
-#
-# SATA SFF controllers with BMDMA
-#
-CONFIG_ATA_PIIX=y
-CONFIG_SATA_DWC=y
-# CONFIG_SATA_DWC_OLD_DMA is not set
-CONFIG_SATA_MV=y
-CONFIG_SATA_NV=y
-CONFIG_SATA_PROMISE=y
-CONFIG_SATA_RCAR=m
-CONFIG_SATA_SIL=y
-CONFIG_SATA_SIS=y
-CONFIG_SATA_SVW=y
-CONFIG_SATA_ULI=y
-CONFIG_SATA_VIA=y
-CONFIG_SATA_VITESSE=y
-
-#
-# PATA SFF controllers with BMDMA
-#
-CONFIG_PATA_ALI=m
-CONFIG_PATA_AMD=m
-CONFIG_PATA_ARTOP=m
-CONFIG_PATA_ATIIXP=m
-CONFIG_PATA_ATP867X=m
-CONFIG_PATA_CMD64X=m
-CONFIG_PATA_CYPRESS=m
-CONFIG_PATA_EFAR=m
-CONFIG_PATA_HPT366=m
-CONFIG_PATA_HPT37X=m
-CONFIG_PATA_HPT3X2N=m
-CONFIG_PATA_HPT3X3=m
-# CONFIG_PATA_HPT3X3_DMA is not set
-CONFIG_PATA_IT8213=m
-CONFIG_PATA_IT821X=m
-CONFIG_PATA_JMICRON=m
-CONFIG_PATA_MARVELL=m
-CONFIG_PATA_NETCELL=m
-CONFIG_PATA_NINJA32=m
-CONFIG_PATA_NS87415=m
-CONFIG_PATA_OLDPIIX=m
-CONFIG_PATA_OPTIDMA=m
-CONFIG_PATA_PDC2027X=m
-CONFIG_PATA_PDC_OLD=m
-CONFIG_PATA_RADISYS=m
-CONFIG_PATA_RDC=m
-CONFIG_PATA_SCH=m
-CONFIG_PATA_SERVERWORKS=m
-CONFIG_PATA_SIL680=m
-CONFIG_PATA_SIS=y
-CONFIG_PATA_TOSHIBA=m
-CONFIG_PATA_TRIFLEX=m
-CONFIG_PATA_VIA=m
-CONFIG_PATA_WINBOND=m
-
-#
-# PIO-only SFF controllers
-#
-CONFIG_PATA_CMD640_PCI=m
-CONFIG_PATA_MPIIX=m
-CONFIG_PATA_NS87410=m
-CONFIG_PATA_OPTI=m
-CONFIG_PATA_PCMCIA=m
-CONFIG_PATA_PLATFORM=m
-CONFIG_PATA_OF_PLATFORM=m
-CONFIG_PATA_RZ1000=m
-CONFIG_PATA_PARPORT=m
-
-#
-# Parallel IDE protocol modules
-#
-CONFIG_PATA_PARPORT_ATEN=m
-CONFIG_PATA_PARPORT_BPCK=m
-CONFIG_PATA_PARPORT_BPCK6=m
-CONFIG_PATA_PARPORT_COMM=m
-CONFIG_PATA_PARPORT_DSTR=m
-CONFIG_PATA_PARPORT_FIT2=m
-CONFIG_PATA_PARPORT_FIT3=m
-CONFIG_PATA_PARPORT_EPAT=m
-# CONFIG_PATA_PARPORT_EPATC8 is not set
-CONFIG_PATA_PARPORT_EPIA=m
-CONFIG_PATA_PARPORT_FRIQ=m
-CONFIG_PATA_PARPORT_FRPW=m
-CONFIG_PATA_PARPORT_KBIC=m
-CONFIG_PATA_PARPORT_KTTI=m
-CONFIG_PATA_PARPORT_ON20=m
-CONFIG_PATA_PARPORT_ON26=m
-
-#
-# Generic fallback / legacy drivers
-#
-CONFIG_PATA_ACPI=y
-CONFIG_ATA_GENERIC=y
-CONFIG_PATA_LEGACY=m
-CONFIG_MD=y
-# CONFIG_BLK_DEV_MD is not set
-CONFIG_BCACHE=m
-# CONFIG_BCACHE_DEBUG is not set
-# CONFIG_BCACHE_ASYNC_REGISTRATION is not set
-CONFIG_BLK_DEV_DM_BUILTIN=y
-CONFIG_BLK_DEV_DM=m
-# CONFIG_DM_DEBUG is not set
-CONFIG_DM_BUFIO=m
-# CONFIG_DM_DEBUG_BLOCK_MANAGER_LOCKING is not set
-CONFIG_DM_BIO_PRISON=m
-CONFIG_DM_PERSISTENT_DATA=m
-CONFIG_DM_UNSTRIPED=m
-CONFIG_DM_CRYPT=m
-CONFIG_DM_SNAPSHOT=m
-CONFIG_DM_THIN_PROVISIONING=m
-CONFIG_DM_CACHE=m
-CONFIG_DM_CACHE_SMQ=m
-CONFIG_DM_WRITECACHE=m
-CONFIG_DM_EBS=m
-CONFIG_DM_ERA=m
-CONFIG_DM_CLONE=m
-CONFIG_DM_MIRROR=m
-CONFIG_DM_LOG_USERSPACE=m
-# CONFIG_DM_RAID is not set
-CONFIG_DM_ZERO=m
-CONFIG_DM_MULTIPATH=m
-CONFIG_DM_MULTIPATH_QL=m
-CONFIG_DM_MULTIPATH_ST=m
-CONFIG_DM_MULTIPATH_HST=m
-CONFIG_DM_MULTIPATH_IOA=m
-CONFIG_DM_DELAY=m
-CONFIG_DM_DUST=m
-# CONFIG_DM_UEVENT is not set
-CONFIG_DM_FLAKEY=m
-CONFIG_DM_VERITY=m
-# CONFIG_DM_VERITY_VERIFY_ROOTHASH_SIG is not set
-CONFIG_DM_VERITY_FEC=y
-CONFIG_DM_SWITCH=m
-CONFIG_DM_LOG_WRITES=m
-CONFIG_DM_INTEGRITY=m
-CONFIG_DM_ZONED=m
-CONFIG_DM_AUDIT=y
-CONFIG_DM_VDO=m
-CONFIG_DM_PCACHE=m
-CONFIG_TARGET_CORE=m
-CONFIG_TCM_IBLOCK=m
-CONFIG_TCM_FILEIO=m
-CONFIG_TCM_PSCSI=m
-CONFIG_TCM_USER2=m
-CONFIG_LOOPBACK_TARGET=m
-CONFIG_TCM_FC=m
-CONFIG_ISCSI_TARGET=m
-CONFIG_ISCSI_TARGET_CXGB4=m
-CONFIG_SBP_TARGET=m
-CONFIG_REMOTE_TARGET=m
-CONFIG_FUSION=y
-CONFIG_FUSION_SPI=m
-CONFIG_FUSION_FC=m
-CONFIG_FUSION_SAS=m
-CONFIG_FUSION_MAX_SGE=128
-CONFIG_FUSION_CTL=m
-CONFIG_FUSION_LAN=m
-# CONFIG_FUSION_LOGGING is not set
-
-#
-# IEEE 1394 (FireWire) support
-#
-CONFIG_FIREWIRE=m
-CONFIG_FIREWIRE_OHCI=m
-CONFIG_FIREWIRE_SBP2=m
-CONFIG_FIREWIRE_NET=m
-CONFIG_FIREWIRE_NOSY=m
-# end of IEEE 1394 (FireWire) support
-
-CONFIG_NETDEVICES=y
-CONFIG_MII=m
-CONFIG_NET_CORE=y
-CONFIG_BONDING=m
-CONFIG_DUMMY=m
-CONFIG_WIREGUARD=m
-# CONFIG_WIREGUARD_DEBUG is not set
-CONFIG_OVPN=m
-CONFIG_EQUALIZER=m
-CONFIG_NET_FC=y
-CONFIG_IFB=m
-CONFIG_NET_TEAM=m
-CONFIG_NET_TEAM_MODE_BROADCAST=m
-CONFIG_NET_TEAM_MODE_ROUNDROBIN=m
-CONFIG_NET_TEAM_MODE_RANDOM=m
-CONFIG_NET_TEAM_MODE_ACTIVEBACKUP=m
-CONFIG_NET_TEAM_MODE_LOADBALANCE=m
-CONFIG_MACVLAN=m
-CONFIG_MACVTAP=m
-CONFIG_IPVLAN_L3S=y
-CONFIG_IPVLAN=m
-CONFIG_IPVTAP=m
-CONFIG_VXLAN=m
-CONFIG_GENEVE=m
-CONFIG_BAREUDP=m
-CONFIG_GTP=m
-CONFIG_PFCP=m
-CONFIG_AMT=m
-CONFIG_MACSEC=m
-CONFIG_NETCONSOLE=m
-CONFIG_NETCONSOLE_DYNAMIC=y
-# CONFIG_NETCONSOLE_EXTENDED_LOG is not set
-CONFIG_NETPOLL=y
-CONFIG_NET_POLL_CONTROLLER=y
-CONFIG_NTB_NETDEV=m
-CONFIG_RIONET=m
-CONFIG_RIONET_TX_SIZE=128
-CONFIG_RIONET_RX_SIZE=128
-CONFIG_TUN=m
-CONFIG_TAP=m
-# CONFIG_TUN_VNET_CROSS_LE is not set
-CONFIG_VETH=m
-CONFIG_VIRTIO_NET=m
-CONFIG_NLMON=m
-CONFIG_NETKIT=y
-CONFIG_NET_VRF=m
-CONFIG_VSOCKMON=m
-CONFIG_MHI_NET=m
-CONFIG_SUNGEM_PHY=m
-CONFIG_ARCNET=m
-CONFIG_ARCNET_1201=m
-CONFIG_ARCNET_1051=m
-CONFIG_ARCNET_RAW=m
-CONFIG_ARCNET_CAP=m
-CONFIG_ARCNET_COM90xx=m
-CONFIG_ARCNET_COM90xxIO=m
-CONFIG_ARCNET_RIM_I=m
-CONFIG_ARCNET_COM20020=m
-CONFIG_ARCNET_COM20020_PCI=m
-CONFIG_ARCNET_COM20020_CS=m
-CONFIG_ATM_DRIVERS=y
-CONFIG_ATM_DUMMY=m
-CONFIG_ATM_TCP=m
-CONFIG_ATM_LANAI=m
-CONFIG_ATM_ENI=m
-# CONFIG_ATM_ENI_DEBUG is not set
-# CONFIG_ATM_ENI_TUNE_BURST is not set
-CONFIG_ATM_NICSTAR=m
-# CONFIG_ATM_NICSTAR_USE_SUNI is not set
-# CONFIG_ATM_NICSTAR_USE_IDT77105 is not set
-CONFIG_ATM_IDT77252=m
-# CONFIG_ATM_IDT77252_DEBUG is not set
-# CONFIG_ATM_IDT77252_RCV_ALL is not set
-CONFIG_ATM_IDT77252_USE_SUNI=y
-CONFIG_ATM_IA=m
-# CONFIG_ATM_IA_DEBUG is not set
-CONFIG_ATM_FORE200E=m
-# CONFIG_ATM_FORE200E_USE_TASKLET is not set
-CONFIG_ATM_FORE200E_TX_RETRY=16
-CONFIG_ATM_FORE200E_DEBUG=0
-CONFIG_ATM_HE=m
-# CONFIG_ATM_HE_USE_SUNI is not set
-CONFIG_ATM_SOLOS=m
-# CONFIG_CAIF_DRIVERS is not set
-
-#
-# Distributed Switch Architecture drivers
-#
-CONFIG_B53=m
-CONFIG_B53_SPI_DRIVER=m
-CONFIG_B53_MDIO_DRIVER=m
-CONFIG_B53_MMAP_DRIVER=m
-CONFIG_B53_SRAB_DRIVER=m
-CONFIG_B53_SERDES=m
-CONFIG_NET_DSA_BCM_SF2=m
-CONFIG_NET_DSA_LOOP=m
-CONFIG_NET_DSA_HIRSCHMANN_HELLCREEK=m
-CONFIG_NET_DSA_LANTIQ_GSWIP=m
-CONFIG_NET_DSA_MT7530=m
-CONFIG_NET_DSA_MT7530_MDIO=m
-CONFIG_NET_DSA_MT7530_MMIO=m
-CONFIG_NET_DSA_MV88E6060=m
-CONFIG_NET_DSA_MICROCHIP_KSZ_COMMON=m
-CONFIG_NET_DSA_MICROCHIP_KSZ9477_I2C=m
-CONFIG_NET_DSA_MICROCHIP_KSZ_SPI=m
-# CONFIG_NET_DSA_MICROCHIP_KSZ_PTP is not set
-CONFIG_NET_DSA_MICROCHIP_KSZ8863_SMI=m
-CONFIG_NET_DSA_MV88E6XXX=m
-# CONFIG_NET_DSA_MV88E6XXX_PTP is not set
-CONFIG_NET_DSA_MV88E6XXX_LEDS=y
-CONFIG_NET_DSA_MSCC_FELIX_DSA_LIB=m
-CONFIG_NET_DSA_MSCC_OCELOT_EXT=m
-CONFIG_NET_DSA_MSCC_SEVILLE=m
-CONFIG_NET_DSA_AR9331=m
-CONFIG_NET_DSA_QCA8K=m
-# CONFIG_NET_DSA_QCA8K_LEDS_SUPPORT is not set
-CONFIG_NET_DSA_SJA1105=m
-# CONFIG_NET_DSA_SJA1105_PTP is not set
-CONFIG_NET_DSA_XRS700X=m
-CONFIG_NET_DSA_XRS700X_I2C=m
-CONFIG_NET_DSA_XRS700X_MDIO=m
-CONFIG_NET_DSA_REALTEK=m
-# CONFIG_NET_DSA_REALTEK_MDIO is not set
-# CONFIG_NET_DSA_REALTEK_SMI is not set
-CONFIG_NET_DSA_KS8995=m
-CONFIG_NET_DSA_SMSC_LAN9303=m
-CONFIG_NET_DSA_SMSC_LAN9303_I2C=m
-CONFIG_NET_DSA_SMSC_LAN9303_MDIO=m
-CONFIG_NET_DSA_VITESSE_VSC73XX=m
-CONFIG_NET_DSA_VITESSE_VSC73XX_SPI=m
-CONFIG_NET_DSA_VITESSE_VSC73XX_PLATFORM=m
-# end of Distributed Switch Architecture drivers
-
-CONFIG_ETHERNET=y
-CONFIG_MDIO=m
-CONFIG_NET_VENDOR_3COM=y
-CONFIG_PCMCIA_3C574=m
-CONFIG_PCMCIA_3C589=m
-CONFIG_VORTEX=m
-CONFIG_TYPHOON=m
-CONFIG_NET_VENDOR_ADAPTEC=y
-CONFIG_ADAPTEC_STARFIRE=m
-CONFIG_NET_VENDOR_AGERE=y
-CONFIG_ET131X=m
-CONFIG_NET_VENDOR_ALACRITECH=y
-CONFIG_SLICOSS=m
-CONFIG_NET_VENDOR_ALLWINNER=y
-CONFIG_SUN4I_EMAC=m
-CONFIG_NET_VENDOR_ALTEON=y
-CONFIG_ACENIC=m
-# CONFIG_ACENIC_OMIT_TIGON_I is not set
-CONFIG_ALTERA_TSE=m
-CONFIG_NET_VENDOR_AMAZON=y
-CONFIG_ENA_ETHERNET=m
-CONFIG_NET_VENDOR_AMD=y
-CONFIG_AMD8111_ETH=m
-CONFIG_PCNET32=m
-CONFIG_PCMCIA_NMCLAN=m
-CONFIG_PDS_CORE=m
-CONFIG_NET_VENDOR_AQUANTIA=y
-CONFIG_AQTION=m
-CONFIG_NET_VENDOR_ARC=y
-CONFIG_NET_VENDOR_ASIX=y
-CONFIG_SPI_AX88796C=m
-# CONFIG_SPI_AX88796C_COMPRESSION is not set
-CONFIG_NET_VENDOR_ATHEROS=y
-CONFIG_ATL2=m
-CONFIG_ATL1=m
-CONFIG_ATL1E=m
-CONFIG_ATL1C=m
-CONFIG_ALX=m
-CONFIG_NET_VENDOR_BROADCOM=y
-CONFIG_B44=m
-CONFIG_B44_PCI_AUTOSELECT=y
-CONFIG_B44_PCICORE_AUTOSELECT=y
-CONFIG_B44_PCI=y
-CONFIG_BCMGENET=m
-CONFIG_BNX2=m
-CONFIG_CNIC=m
-CONFIG_TIGON3=m
-CONFIG_TIGON3_HWMON=y
-CONFIG_BNX2X=m
-CONFIG_BNX2X_SRIOV=y
-CONFIG_SYSTEMPORT=m
-CONFIG_BNXT=m
-CONFIG_BNXT_SRIOV=y
-CONFIG_BNXT_FLOWER_OFFLOAD=y
-# CONFIG_BNXT_DCB is not set
-CONFIG_BNXT_HWMON=y
-CONFIG_BNGE=m
-CONFIG_NET_VENDOR_CADENCE=y
-CONFIG_MACB=m
-CONFIG_MACB_USE_HWSTAMP=y
-CONFIG_MACB_PCI=m
-CONFIG_NET_VENDOR_CAVIUM=y
-CONFIG_THUNDER_NIC_PF=m
-CONFIG_THUNDER_NIC_VF=m
-CONFIG_THUNDER_NIC_BGX=m
-CONFIG_THUNDER_NIC_RGX=m
-CONFIG_CAVIUM_PTP=m
-CONFIG_LIQUIDIO_CORE=m
-CONFIG_LIQUIDIO=m
-CONFIG_LIQUIDIO_VF=m
-CONFIG_NET_VENDOR_CHELSIO=y
-CONFIG_CHELSIO_T1=m
-# CONFIG_CHELSIO_T1_1G is not set
-CONFIG_CHELSIO_T3=m
-CONFIG_CHELSIO_T4=m
-# CONFIG_CHELSIO_T4_DCB is not set
-CONFIG_CHELSIO_T4VF=m
-CONFIG_CHELSIO_LIB=m
-CONFIG_CHELSIO_INLINE_CRYPTO=y
-CONFIG_CHELSIO_IPSEC_INLINE=m
-CONFIG_CHELSIO_TLS_DEVICE=m
-CONFIG_NET_VENDOR_CISCO=y
-CONFIG_ENIC=m
-CONFIG_NET_VENDOR_CORTINA=y
-CONFIG_GEMINI_ETHERNET=m
-CONFIG_NET_VENDOR_DAVICOM=y
-CONFIG_DM9051=m
-CONFIG_DNET=m
-CONFIG_NET_VENDOR_DEC=y
-CONFIG_NET_TULIP=y
-CONFIG_DE2104X=m
-CONFIG_DE2104X_DSL=0
-CONFIG_TULIP=m
-# CONFIG_TULIP_MWI is not set
-# CONFIG_TULIP_MMIO is not set
-# CONFIG_TULIP_NAPI is not set
-CONFIG_WINBOND_840=m
-CONFIG_DM9102=m
-CONFIG_ULI526X=m
-CONFIG_PCMCIA_XIRCOM=m
-CONFIG_NET_VENDOR_DLINK=y
-CONFIG_DL2K=m
-CONFIG_SUNDANCE=m
-# CONFIG_SUNDANCE_MMIO is not set
-CONFIG_NET_VENDOR_EMULEX=y
-CONFIG_BE2NET=m
-CONFIG_BE2NET_HWMON=y
-CONFIG_BE2NET_BE2=y
-CONFIG_BE2NET_BE3=y
-CONFIG_BE2NET_LANCER=y
-CONFIG_BE2NET_SKYHAWK=y
-CONFIG_NET_VENDOR_ENGLEDER=y
-CONFIG_TSNEP=m
-# CONFIG_TSNEP_SELFTESTS is not set
-CONFIG_NET_VENDOR_EZCHIP=y
-CONFIG_EZCHIP_NPS_MANAGEMENT_ENET=m
-CONFIG_NET_VENDOR_FUJITSU=y
-CONFIG_PCMCIA_FMVJ18X=m
-CONFIG_NET_VENDOR_FUNGIBLE=y
-CONFIG_FUN_CORE=m
-CONFIG_FUN_ETH=m
-CONFIG_NET_VENDOR_GOOGLE=y
-CONFIG_NET_VENDOR_HISILICON=y
-CONFIG_HIBMCGE=m
-CONFIG_NET_VENDOR_HUAWEI=y
-CONFIG_NET_VENDOR_I825XX=y
-CONFIG_NET_VENDOR_INTEL=y
-CONFIG_LIBETH=m
-CONFIG_LIBETH_XDP=m
-CONFIG_LIBIE=m
-CONFIG_LIBIE_ADMINQ=m
-CONFIG_LIBIE_FWLOG=m
-CONFIG_E100=m
-CONFIG_E1000=m
-CONFIG_E1000E=m
-CONFIG_IGB=m
-CONFIG_IGB_HWMON=y
-CONFIG_IGBVF=m
-CONFIG_IXGBE=m
-CONFIG_IXGBE_HWMON=y
-# CONFIG_IXGBE_DCB is not set
-CONFIG_IXGBE_IPSEC=y
-CONFIG_IXGBEVF=m
-CONFIG_IXGBEVF_IPSEC=y
-CONFIG_I40E=m
-# CONFIG_I40E_DCB is not set
-CONFIG_IAVF=m
-CONFIG_I40EVF=m
-CONFIG_ICE=m
-CONFIG_ICE_HWMON=y
-CONFIG_ICE_SWITCHDEV=y
-CONFIG_FM10K=m
-CONFIG_IGC=m
-CONFIG_IGC_LEDS=y
-CONFIG_IDPF=m
-# CONFIG_IDPF_SINGLEQ is not set
-CONFIG_JME=m
-CONFIG_NET_VENDOR_ADI=y
-CONFIG_ADIN1110=m
-CONFIG_NET_VENDOR_LITEX=y
-CONFIG_LITEX_LITEETH=m
-CONFIG_NET_VENDOR_MARVELL=y
-CONFIG_MVMDIO=m
-CONFIG_SKGE=m
-# CONFIG_SKGE_DEBUG is not set
-# CONFIG_SKGE_GENESIS is not set
-CONFIG_SKY2=m
-# CONFIG_SKY2_DEBUG is not set
-CONFIG_OCTEON_EP=m
-CONFIG_OCTEON_EP_VF=m
-CONFIG_PRESTERA=m
-CONFIG_PRESTERA_PCI=m
-CONFIG_NET_VENDOR_MELLANOX=y
-CONFIG_MLX4_EN=m
-# CONFIG_MLX4_EN_DCB is not set
-CONFIG_MLX4_CORE=m
-# CONFIG_MLX4_DEBUG is not set
-# CONFIG_MLX4_CORE_GEN2 is not set
-CONFIG_MLX5_CORE=m
-CONFIG_MLX5_FPGA=y
-CONFIG_MLX5_CORE_EN=y
-CONFIG_MLX5_EN_ARFS=y
-CONFIG_MLX5_EN_RXNFC=y
-CONFIG_MLX5_MPFS=y
-CONFIG_MLX5_ESWITCH=y
-CONFIG_MLX5_BRIDGE=y
-CONFIG_MLX5_CORE_EN_DCB=y
-CONFIG_MLX5_CORE_IPOIB=y
-CONFIG_MLX5_MACSEC=y
-CONFIG_MLX5_EN_IPSEC=y
-CONFIG_MLX5_EN_TLS=y
-CONFIG_MLX5_SW_STEERING=y
-CONFIG_MLX5_HW_STEERING=y
-# CONFIG_MLX5_SF is not set
-CONFIG_MLX5_DPLL=m
-CONFIG_MLX5_EN_PSP=y
-CONFIG_MLXSW_CORE=m
-CONFIG_MLXSW_CORE_HWMON=y
-CONFIG_MLXSW_CORE_THERMAL=y
-CONFIG_MLXSW_PCI=m
-CONFIG_MLXSW_I2C=m
-CONFIG_MLXSW_SPECTRUM=m
-CONFIG_MLXSW_SPECTRUM_DCB=y
-CONFIG_MLXSW_MINIMAL=m
-CONFIG_MLXFW=m
-CONFIG_NET_VENDOR_META=y
-CONFIG_NET_VENDOR_MICREL=y
-CONFIG_KS8842=m
-CONFIG_KS8851=m
-CONFIG_KS8851_MLL=m
-CONFIG_KSZ884X_PCI=m
-CONFIG_NET_VENDOR_MICROCHIP=y
-CONFIG_ENC28J60=m
-# CONFIG_ENC28J60_WRITEVERIFY is not set
-CONFIG_ENCX24J600=m
-CONFIG_LAN743X=m
-CONFIG_LAN865X=m
-CONFIG_LAN966X_SWITCH=m
-# CONFIG_LAN966X_DCB is not set
-CONFIG_VCAP=y
-CONFIG_FDMA=y
-CONFIG_NET_VENDOR_MICROSEMI=y
-CONFIG_MSCC_OCELOT_SWITCH_LIB=m
-CONFIG_MSCC_OCELOT_SWITCH=m
-# CONFIG_NET_VENDOR_MICROSOFT is not set
-CONFIG_NET_VENDOR_MYRI=y
-CONFIG_MYRI10GE=m
-CONFIG_FEALNX=m
-CONFIG_NET_VENDOR_NI=y
-CONFIG_NI_XGE_MANAGEMENT_ENET=m
-CONFIG_NET_VENDOR_NATSEMI=y
-CONFIG_NATSEMI=m
-CONFIG_NS83820=m
-CONFIG_NET_VENDOR_NETERION=y
-CONFIG_S2IO=m
-CONFIG_NET_VENDOR_NETRONOME=y
-CONFIG_NFP=m
-CONFIG_NFP_APP_FLOWER=y
-CONFIG_NFP_APP_ABM_NIC=y
-CONFIG_NFP_NET_IPSEC=y
-# CONFIG_NFP_DEBUG is not set
-CONFIG_NET_VENDOR_8390=y
-CONFIG_PCMCIA_AXNET=m
-CONFIG_NE2K_PCI=m
-CONFIG_PCMCIA_PCNET=m
-CONFIG_NET_VENDOR_NVIDIA=y
-CONFIG_FORCEDETH=m
-CONFIG_NET_VENDOR_OKI=y
-CONFIG_ETHOC=m
-CONFIG_OA_TC6=m
-CONFIG_NET_VENDOR_PACKET_ENGINES=y
-CONFIG_HAMACHI=m
-CONFIG_YELLOWFIN=m
-CONFIG_NET_VENDOR_PENSANDO=y
-CONFIG_IONIC=m
-CONFIG_NET_VENDOR_QLOGIC=y
-CONFIG_QLA3XXX=m
-CONFIG_QLCNIC=m
-CONFIG_QLCNIC_SRIOV=y
-CONFIG_QLCNIC_DCB=y
-CONFIG_QLCNIC_HWMON=y
-CONFIG_NETXEN_NIC=m
-CONFIG_QED=m
-CONFIG_QED_LL2=y
-CONFIG_QED_SRIOV=y
-CONFIG_QEDE=m
-CONFIG_QED_RDMA=y
-CONFIG_QED_ISCSI=y
-CONFIG_QED_FCOE=y
-CONFIG_QED_OOO=y
-CONFIG_NET_VENDOR_BROCADE=y
-CONFIG_BNA=m
-CONFIG_NET_VENDOR_QUALCOMM=y
-CONFIG_QCA7000=m
-CONFIG_QCA7000_SPI=m
-CONFIG_QCA7000_UART=m
-CONFIG_QCOM_EMAC=m
-CONFIG_RMNET=m
-CONFIG_NET_VENDOR_RDC=y
-CONFIG_R6040=m
-CONFIG_NET_VENDOR_REALTEK=y
-CONFIG_8139CP=m
-CONFIG_8139TOO=m
-CONFIG_8139TOO_PIO=y
-# CONFIG_8139TOO_TUNE_TWISTER is not set
-# CONFIG_8139TOO_8129 is not set
-# CONFIG_8139_OLD_RX_RESET is not set
-CONFIG_R8169=m
-CONFIG_R8169_LEDS=y
-CONFIG_RTASE=m
-CONFIG_NET_VENDOR_RENESAS=y
-CONFIG_SH_ETH=m
-CONFIG_RAVB=m
-CONFIG_RENESAS_ETHER_SWITCH=m
-CONFIG_RENESAS_GEN4_PTP=m
-CONFIG_RTSN=m
-CONFIG_NET_VENDOR_ROCKER=y
-CONFIG_ROCKER=m
-CONFIG_NET_VENDOR_SAMSUNG=y
-CONFIG_SXGBE_ETH=m
-CONFIG_NET_VENDOR_SEEQ=y
-CONFIG_NET_VENDOR_SILAN=y
-CONFIG_SC92031=m
-CONFIG_NET_VENDOR_SIS=y
-CONFIG_SIS900=m
-CONFIG_SIS190=m
-CONFIG_NET_VENDOR_SOLARFLARE=y
-CONFIG_SFC=m
-CONFIG_SFC_MTD=y
-CONFIG_SFC_MCDI_MON=y
-CONFIG_SFC_SRIOV=y
-CONFIG_SFC_MCDI_LOGGING=y
-CONFIG_SFC_FALCON=m
-CONFIG_SFC_FALCON_MTD=y
-CONFIG_SFC_SIENA=m
-CONFIG_SFC_SIENA_MTD=y
-CONFIG_SFC_SIENA_MCDI_MON=y
-# CONFIG_SFC_SIENA_SRIOV is not set
-CONFIG_SFC_SIENA_MCDI_LOGGING=y
-CONFIG_NET_VENDOR_SMSC=y
-CONFIG_PCMCIA_SMC91C92=m
-CONFIG_EPIC100=m
-CONFIG_SMSC911X=m
-CONFIG_SMSC9420=m
-CONFIG_NET_VENDOR_SOCIONEXT=y
-CONFIG_NET_VENDOR_SPACEMIT=y
-CONFIG_SPACEMIT_K1_EMAC=m
-CONFIG_NET_VENDOR_STMICRO=y
-CONFIG_STMMAC_ETH=m
-# CONFIG_STMMAC_SELFTESTS is not set
-CONFIG_STMMAC_PLATFORM=m
-CONFIG_DWMAC_DWC_QOS_ETH=m
-CONFIG_DWMAC_GENERIC=m
-CONFIG_DWMAC_RENESAS_GBETH=m
-CONFIG_DWMAC_SOPHGO=m
-CONFIG_DWMAC_STARFIVE=m
-CONFIG_DWMAC_SUNXI=m
-CONFIG_DWMAC_SUN8I=m
-CONFIG_DWMAC_SUN55I=m
-CONFIG_DWMAC_THEAD=m
-CONFIG_DWMAC_INTEL_PLAT=m
-CONFIG_STMMAC_PCI=m
-CONFIG_NET_VENDOR_SUN=y
-CONFIG_HAPPYMEAL=m
-CONFIG_SUNGEM=m
-CONFIG_CASSINI=m
-CONFIG_NIU=m
-CONFIG_NET_VENDOR_SYNOPSYS=y
-CONFIG_DWC_XLGMAC=m
-CONFIG_DWC_XLGMAC_PCI=m
-CONFIG_NET_VENDOR_TEHUTI=y
-CONFIG_TEHUTI=m
-CONFIG_TEHUTI_TN40=m
-CONFIG_NET_VENDOR_TI=y
-# CONFIG_TI_CPSW_PHY_SEL is not set
-CONFIG_TLAN=m
-CONFIG_NET_VENDOR_VERTEXCOM=y
-CONFIG_MSE102X=m
-CONFIG_NET_VENDOR_VIA=y
-CONFIG_VIA_RHINE=m
-# CONFIG_VIA_RHINE_MMIO is not set
-CONFIG_VIA_VELOCITY=m
-CONFIG_NET_VENDOR_WANGXUN=y
-CONFIG_LIBWX=m
-CONFIG_NGBE=m
-CONFIG_TXGBE=m
-CONFIG_TXGBEVF=m
-CONFIG_NGBEVF=m
-CONFIG_NET_VENDOR_WIZNET=y
-CONFIG_WIZNET_W5100=m
-CONFIG_WIZNET_W5300=m
-# CONFIG_WIZNET_BUS_DIRECT is not set
-# CONFIG_WIZNET_BUS_INDIRECT is not set
-CONFIG_WIZNET_BUS_ANY=y
-CONFIG_WIZNET_W5100_SPI=m
-CONFIG_NET_VENDOR_XILINX=y
-CONFIG_XILINX_EMACLITE=m
-CONFIG_XILINX_AXI_EMAC=m
-CONFIG_XILINX_LL_TEMAC=m
-CONFIG_NET_VENDOR_XIRCOM=y
-CONFIG_PCMCIA_XIRC2PS=m
-CONFIG_FDDI=m
-CONFIG_DEFXX=m
-CONFIG_SKFP=m
-# CONFIG_HIPPI is not set
-CONFIG_MDIO_BUS=m
-CONFIG_PHYLINK=m
-CONFIG_PHYLIB=m
-CONFIG_SWPHY=y
-CONFIG_PHY_PACKAGE=m
-CONFIG_LED_TRIGGER_PHY=y
-CONFIG_OPEN_ALLIANCE_HELPERS=y
-CONFIG_PHYLIB_LEDS=y
-CONFIG_FIXED_PHY=m
-CONFIG_SFP=m
-
-#
-# MII PHY device drivers
-#
-CONFIG_AS21XXX_PHY=m
-CONFIG_AIR_EN8811H_PHY=m
-CONFIG_AMD_PHY=m
-CONFIG_ADIN_PHY=m
-CONFIG_ADIN1100_PHY=m
-CONFIG_AQUANTIA_PHY=m
-CONFIG_AX88796B_PHY=m
-CONFIG_BROADCOM_PHY=m
-CONFIG_BCM54140_PHY=m
-CONFIG_BCM7XXX_PHY=m
-CONFIG_BCM84881_PHY=m
-CONFIG_BCM87XX_PHY=m
-CONFIG_BCM_NET_PHYLIB=m
-CONFIG_CICADA_PHY=m
-CONFIG_CORTINA_PHY=m
-CONFIG_DAVICOM_PHY=m
-CONFIG_ICPLUS_PHY=m
-CONFIG_LXT_PHY=m
-CONFIG_INTEL_XWAY_PHY=m
-CONFIG_LSI_ET1011C_PHY=m
-CONFIG_MARVELL_PHY=m
-CONFIG_MARVELL_10G_PHY=m
-CONFIG_MARVELL_88Q2XXX_PHY=m
-CONFIG_MARVELL_88X2222_PHY=m
-CONFIG_MAXLINEAR_GPHY=m
-CONFIG_MAXLINEAR_86110_PHY=m
-CONFIG_MEDIATEK_GE_PHY=m
-# CONFIG_MEDIATEK_GE_SOC_PHY is not set
-CONFIG_MTK_NET_PHYLIB=m
-CONFIG_MICREL_PHY=m
-CONFIG_MICROCHIP_T1S_PHY=m
-CONFIG_MICROCHIP_PHY=m
-CONFIG_MICROCHIP_T1_PHY=m
-CONFIG_MICROSEMI_PHY=m
-CONFIG_MOTORCOMM_PHY=m
-CONFIG_NATIONAL_PHY=m
-CONFIG_NXP_CBTX_PHY=m
-CONFIG_NXP_C45_TJA11XX_PHY=m
-CONFIG_NXP_TJA11XX_PHY=m
-CONFIG_NCN26000_PHY=m
-CONFIG_QCOM_NET_PHYLIB=m
-CONFIG_AT803X_PHY=m
-CONFIG_QCA83XX_PHY=m
-CONFIG_QCA808X_PHY=m
-CONFIG_QCA807X_PHY=m
-CONFIG_QSEMI_PHY=m
-CONFIG_REALTEK_PHY=m
-CONFIG_REALTEK_PHY_HWMON=y
-CONFIG_RENESAS_PHY=m
-CONFIG_ROCKCHIP_PHY=m
-CONFIG_SMSC_PHY=m
-CONFIG_STE10XP=m
-CONFIG_TERANETICS_PHY=m
-CONFIG_DP83822_PHY=m
-CONFIG_DP83TC811_PHY=m
-CONFIG_DP83848_PHY=m
-CONFIG_DP83867_PHY=m
-CONFIG_DP83869_PHY=m
-CONFIG_DP83TD510_PHY=m
-CONFIG_DP83TG720_PHY=m
-CONFIG_VITESSE_PHY=m
-CONFIG_XILINX_GMII2RGMII=m
-# CONFIG_PSE_CONTROLLER is not set
-CONFIG_CAN_DEV=m
-CONFIG_CAN_VCAN=m
-CONFIG_CAN_VXCAN=m
-CONFIG_CAN_NETLINK=y
-CONFIG_CAN_CALC_BITTIMING=y
-CONFIG_CAN_RX_OFFLOAD=y
-CONFIG_CAN_CAN327=m
-CONFIG_CAN_FLEXCAN=m
-CONFIG_CAN_GRCAN=m
-CONFIG_CAN_JANZ_ICAN3=m
-CONFIG_CAN_KVASER_PCIEFD=m
-CONFIG_CAN_SLCAN=m
-CONFIG_CAN_SUN4I=m
-CONFIG_CAN_C_CAN=m
-CONFIG_CAN_C_CAN_PLATFORM=m
-CONFIG_CAN_C_CAN_PCI=m
-CONFIG_CAN_CC770=m
-CONFIG_CAN_CC770_ISA=m
-CONFIG_CAN_CC770_PLATFORM=m
-CONFIG_CAN_CTUCANFD=m
-CONFIG_CAN_CTUCANFD_PCI=m
-CONFIG_CAN_CTUCANFD_PLATFORM=m
-CONFIG_CAN_ESD_402_PCI=m
-CONFIG_CAN_IFI_CANFD=m
-CONFIG_CAN_M_CAN=m
-CONFIG_CAN_M_CAN_PCI=m
-CONFIG_CAN_M_CAN_PLATFORM=m
-CONFIG_CAN_M_CAN_TCAN4X5X=m
-CONFIG_CAN_PEAK_PCIEFD=m
-CONFIG_CAN_RCAR=m
-CONFIG_CAN_RCAR_CANFD=m
-CONFIG_CAN_SJA1000=m
-CONFIG_CAN_EMS_PCI=m
-CONFIG_CAN_EMS_PCMCIA=m
-CONFIG_CAN_F81601=m
-CONFIG_CAN_KVASER_PCI=m
-CONFIG_CAN_PEAK_PCI=m
-CONFIG_CAN_PEAK_PCIEC=y
-CONFIG_CAN_PEAK_PCMCIA=m
-CONFIG_CAN_PLX_PCI=m
-CONFIG_CAN_SJA1000_ISA=m
-CONFIG_CAN_SJA1000_PLATFORM=m
-CONFIG_CAN_SOFTING=m
-CONFIG_CAN_SOFTING_CS=m
-
-#
-# CAN SPI interfaces
-#
-CONFIG_CAN_HI311X=m
-CONFIG_CAN_MCP251X=m
-CONFIG_CAN_MCP251XFD=m
-# CONFIG_CAN_MCP251XFD_SANITY is not set
-# end of CAN SPI interfaces
-
-#
-# CAN USB interfaces
-#
-CONFIG_CAN_8DEV_USB=m
-CONFIG_CAN_EMS_USB=m
-CONFIG_CAN_ESD_USB=m
-CONFIG_CAN_ETAS_ES58X=m
-CONFIG_CAN_F81604=m
-CONFIG_CAN_GS_USB=m
-CONFIG_CAN_KVASER_USB=m
-CONFIG_CAN_MCBA_USB=m
-CONFIG_CAN_NCT6694=m
-CONFIG_CAN_PEAK_USB=m
-CONFIG_CAN_UCAN=m
-# end of CAN USB interfaces
-
-# CONFIG_CAN_DEBUG_DEVICES is not set
-CONFIG_FWNODE_MDIO=m
-CONFIG_OF_MDIO=m
-CONFIG_ACPI_MDIO=m
-CONFIG_MDIO_SUN4I=m
-CONFIG_MDIO_BITBANG=m
-CONFIG_MDIO_BCM_UNIMAC=m
-CONFIG_MDIO_CAVIUM=m
-CONFIG_MDIO_GPIO=m
-CONFIG_MDIO_HISI_FEMAC=m
-CONFIG_MDIO_I2C=m
-CONFIG_MDIO_MVUSB=m
-CONFIG_MDIO_MSCC_MIIM=m
-CONFIG_MDIO_OCTEON=m
-CONFIG_MDIO_IPQ4019=m
-CONFIG_MDIO_IPQ8064=m
-CONFIG_MDIO_REGMAP=m
-CONFIG_MDIO_THUNDER=m
-
-#
-# MDIO Multiplexers
-#
-CONFIG_MDIO_BUS_MUX=m
-CONFIG_MDIO_BUS_MUX_GPIO=m
-CONFIG_MDIO_BUS_MUX_MULTIPLEXER=m
-CONFIG_MDIO_BUS_MUX_MMIOREG=m
-
-#
-# PCS device drivers
-#
-CONFIG_PCS_XPCS=m
-CONFIG_PCS_LYNX=m
-CONFIG_PCS_MTK_LYNXI=m
-CONFIG_PCS_RZN1_MIIC=m
-# end of PCS device drivers
-
-CONFIG_PLIP=m
-CONFIG_PPP=m
-CONFIG_PPP_BSDCOMP=m
-CONFIG_PPP_DEFLATE=m
-CONFIG_PPP_FILTER=y
-CONFIG_PPP_MPPE=m
-CONFIG_PPP_MULTILINK=y
-CONFIG_PPPOATM=m
-CONFIG_PPPOE=m
-# CONFIG_PPPOE_HASH_BITS_1 is not set
-# CONFIG_PPPOE_HASH_BITS_2 is not set
-CONFIG_PPPOE_HASH_BITS_4=y
-# CONFIG_PPPOE_HASH_BITS_8 is not set
-CONFIG_PPPOE_HASH_BITS=4
-CONFIG_PPTP=m
-CONFIG_PPPOL2TP=m
-CONFIG_PPP_ASYNC=m
-CONFIG_PPP_SYNC_TTY=m
-CONFIG_SLIP=m
-CONFIG_SLHC=m
-CONFIG_SLIP_COMPRESSED=y
-CONFIG_SLIP_SMART=y
-# CONFIG_SLIP_MODE_SLIP6 is not set
-
-#
-# Host-side USB support is needed for USB Network Adapter support
-#
-CONFIG_USB_NET_DRIVERS=m
-CONFIG_USB_CATC=m
-CONFIG_USB_KAWETH=m
-CONFIG_USB_PEGASUS=m
-CONFIG_USB_RTL8150=m
-CONFIG_USB_RTL8152=m
-CONFIG_USB_LAN78XX=m
-CONFIG_USB_USBNET=m
-CONFIG_USB_NET_AX8817X=m
-CONFIG_USB_NET_AX88179_178A=m
-CONFIG_USB_NET_CDCETHER=m
-CONFIG_USB_NET_CDC_EEM=m
-CONFIG_USB_NET_CDC_NCM=m
-CONFIG_USB_NET_HUAWEI_CDC_NCM=m
-CONFIG_USB_NET_CDC_MBIM=m
-CONFIG_USB_NET_DM9601=m
-CONFIG_USB_NET_SR9700=m
-CONFIG_USB_NET_SR9800=m
-CONFIG_USB_NET_SMSC75XX=m
-CONFIG_USB_NET_SMSC95XX=m
-CONFIG_USB_NET_GL620A=m
-CONFIG_USB_NET_NET1080=m
-CONFIG_USB_NET_PLUSB=m
-CONFIG_USB_NET_MCS7830=m
-CONFIG_USB_NET_RNDIS_HOST=m
-CONFIG_USB_NET_CDC_SUBSET_ENABLE=m
-CONFIG_USB_NET_CDC_SUBSET=m
-# CONFIG_USB_ALI_M5632 is not set
-# CONFIG_USB_AN2720 is not set
-CONFIG_USB_BELKIN=y
-CONFIG_USB_ARMLINUX=y
-# CONFIG_USB_EPSON2888 is not set
-# CONFIG_USB_KC2190 is not set
-CONFIG_USB_NET_ZAURUS=m
-CONFIG_USB_NET_CX82310_ETH=m
-CONFIG_USB_NET_KALMIA=m
-CONFIG_USB_NET_QMI_WWAN=m
-CONFIG_USB_HSO=m
-CONFIG_USB_NET_INT51X1=m
-CONFIG_USB_CDC_PHONET=m
-CONFIG_USB_IPHETH=m
-CONFIG_USB_SIERRA_NET=m
-CONFIG_USB_VL600=m
-CONFIG_USB_NET_CH9200=m
-CONFIG_USB_NET_AQC111=m
-CONFIG_USB_RTL8153_ECM=m
-CONFIG_WLAN=y
-CONFIG_WLAN_VENDOR_ADMTEK=y
-CONFIG_ADM8211=m
-CONFIG_ATH_COMMON=m
-CONFIG_WLAN_VENDOR_ATH=y
-# CONFIG_ATH_DEBUG is not set
-# CONFIG_ATH_REG_DYNAMIC_USER_REG_HINTS is not set
-CONFIG_ATH5K=m
-# CONFIG_ATH5K_DEBUG is not set
-# CONFIG_ATH5K_TRACER is not set
-CONFIG_ATH5K_PCI=y
-# CONFIG_ATH5K_TEST_CHANNELS is not set
-CONFIG_ATH9K_HW=m
-CONFIG_ATH9K_COMMON=m
-CONFIG_ATH9K_BTCOEX_SUPPORT=y
-CONFIG_ATH9K=m
-CONFIG_ATH9K_PCI=y
-CONFIG_ATH9K_AHB=y
-# CONFIG_ATH9K_DEBUGFS is not set
-CONFIG_ATH9K_DFS_CERTIFIED=y
-# CONFIG_ATH9K_DYNACK is not set
-# CONFIG_ATH9K_WOW is not set
-CONFIG_ATH9K_RFKILL=y
-# CONFIG_ATH9K_CHANNEL_CONTEXT is not set
-CONFIG_ATH9K_PCOEM=y
-CONFIG_ATH9K_PCI_NO_EEPROM=m
-CONFIG_ATH9K_HTC=m
-# CONFIG_ATH9K_HTC_DEBUGFS is not set
-# CONFIG_ATH9K_HWRNG is not set
-CONFIG_CARL9170=m
-CONFIG_CARL9170_LEDS=y
-# CONFIG_CARL9170_DEBUGFS is not set
-CONFIG_CARL9170_WPC=y
-# CONFIG_CARL9170_HWRNG is not set
-CONFIG_ATH6KL=m
-CONFIG_ATH6KL_SDIO=m
-CONFIG_ATH6KL_USB=m
-# CONFIG_ATH6KL_DEBUG is not set
-# CONFIG_ATH6KL_TRACING is not set
-# CONFIG_ATH6KL_REGDOMAIN is not set
-CONFIG_AR5523=m
-CONFIG_WIL6210=m
-CONFIG_WIL6210_ISR_COR=y
-# CONFIG_WIL6210_TRACING is not set
-CONFIG_WIL6210_DEBUGFS=y
-CONFIG_ATH10K=m
-CONFIG_ATH10K_CE=y
-CONFIG_ATH10K_PCI=m
-# CONFIG_ATH10K_AHB is not set
-CONFIG_ATH10K_SDIO=m
-CONFIG_ATH10K_USB=m
-# CONFIG_ATH10K_DEBUG is not set
-# CONFIG_ATH10K_DEBUGFS is not set
-CONFIG_ATH10K_LEDS=y
-# CONFIG_ATH10K_TRACING is not set
-CONFIG_ATH10K_DFS_CERTIFIED=y
-CONFIG_WCN36XX=m
-# CONFIG_WCN36XX_DEBUGFS is not set
-CONFIG_ATH11K=m
-CONFIG_ATH11K_PCI=m
-# CONFIG_ATH11K_DEBUG is not set
-# CONFIG_ATH11K_DEBUGFS is not set
-# CONFIG_ATH11K_TRACING is not set
-CONFIG_ATH12K=m
-# CONFIG_ATH12K_DEBUG is not set
-# CONFIG_ATH12K_DEBUGFS is not set
-# CONFIG_ATH12K_TRACING is not set
-# CONFIG_ATH12K_COREDUMP is not set
-CONFIG_WLAN_VENDOR_ATMEL=y
-CONFIG_AT76C50X_USB=m
-CONFIG_WLAN_VENDOR_BROADCOM=y
-CONFIG_B43=m
-CONFIG_B43_BCMA=y
-CONFIG_B43_SSB=y
-CONFIG_B43_BUSES_BCMA_AND_SSB=y
-# CONFIG_B43_BUSES_BCMA is not set
-# CONFIG_B43_BUSES_SSB is not set
-CONFIG_B43_PCI_AUTOSELECT=y
-CONFIG_B43_PCICORE_AUTOSELECT=y
-# CONFIG_B43_SDIO is not set
-CONFIG_B43_BCMA_PIO=y
-CONFIG_B43_PIO=y
-CONFIG_B43_PHY_G=y
-CONFIG_B43_PHY_N=y
-CONFIG_B43_PHY_LP=y
-CONFIG_B43_PHY_HT=y
-CONFIG_B43_LEDS=y
-CONFIG_B43_HWRNG=y
-# CONFIG_B43_DEBUG is not set
-CONFIG_B43LEGACY=m
-CONFIG_B43LEGACY_PCI_AUTOSELECT=y
-CONFIG_B43LEGACY_PCICORE_AUTOSELECT=y
-CONFIG_B43LEGACY_LEDS=y
-CONFIG_B43LEGACY_HWRNG=y
-# CONFIG_B43LEGACY_DEBUG is not set
-CONFIG_B43LEGACY_DMA=y
-CONFIG_B43LEGACY_PIO=y
-CONFIG_B43LEGACY_DMA_AND_PIO_MODE=y
-# CONFIG_B43LEGACY_DMA_MODE is not set
-# CONFIG_B43LEGACY_PIO_MODE is not set
-CONFIG_BRCMUTIL=m
-CONFIG_BRCMSMAC=m
-CONFIG_BRCMFMAC=m
-CONFIG_BRCMFMAC_PROTO_BCDC=y
-CONFIG_BRCMFMAC_PROTO_MSGBUF=y
-CONFIG_BRCMFMAC_SDIO=y
-CONFIG_BRCMFMAC_USB=y
-CONFIG_BRCMFMAC_PCIE=y
-# CONFIG_BRCM_TRACING is not set
-# CONFIG_BRCMDBG is not set
-CONFIG_WLAN_VENDOR_INTEL=y
-CONFIG_IPW2100=m
-CONFIG_IPW2100_MONITOR=y
-# CONFIG_IPW2100_DEBUG is not set
-CONFIG_IPW2200=m
-CONFIG_IPW2200_MONITOR=y
-# CONFIG_IPW2200_RADIOTAP is not set
-# CONFIG_IPW2200_PROMISCUOUS is not set
-# CONFIG_IPW2200_QOS is not set
-# CONFIG_IPW2200_DEBUG is not set
-CONFIG_LIBIPW=m
-# CONFIG_LIBIPW_DEBUG is not set
-CONFIG_IWLEGACY=m
-CONFIG_IWL4965=m
-CONFIG_IWL3945=m
-
-#
-# iwl3945 / iwl4965 Debugging Options
-#
-# CONFIG_IWLEGACY_DEBUG is not set
-# CONFIG_IWLEGACY_DEBUGFS is not set
-# end of iwl3945 / iwl4965 Debugging Options
-
-CONFIG_IWLWIFI=m
-CONFIG_IWLWIFI_LEDS=y
-CONFIG_IWLDVM=m
-CONFIG_IWLMVM=m
-CONFIG_IWLMLD=m
-CONFIG_IWLWIFI_OPMODE_MODULAR=y
-
-#
-# Debugging Options
-#
-# CONFIG_IWLWIFI_DEBUG is not set
-# CONFIG_IWLWIFI_DEBUGFS is not set
-CONFIG_IWLWIFI_DEVICE_TRACING=y
-# end of Debugging Options
-
-CONFIG_WLAN_VENDOR_INTERSIL=y
-CONFIG_P54_COMMON=m
-CONFIG_P54_USB=m
-CONFIG_P54_PCI=m
-CONFIG_P54_SPI=m
-# CONFIG_P54_SPI_DEFAULT_EEPROM is not set
-CONFIG_P54_LEDS=y
-CONFIG_WLAN_VENDOR_MARVELL=y
-CONFIG_LIBERTAS=m
-CONFIG_LIBERTAS_USB=m
-CONFIG_LIBERTAS_SDIO=m
-CONFIG_LIBERTAS_SPI=m
-# CONFIG_LIBERTAS_DEBUG is not set
-CONFIG_LIBERTAS_MESH=y
-CONFIG_LIBERTAS_THINFIRM=m
-# CONFIG_LIBERTAS_THINFIRM_DEBUG is not set
-CONFIG_LIBERTAS_THINFIRM_USB=m
-CONFIG_MWIFIEX=m
-CONFIG_MWIFIEX_SDIO=m
-CONFIG_MWIFIEX_PCIE=m
-CONFIG_MWIFIEX_USB=m
-CONFIG_MWL8K=m
-CONFIG_WLAN_VENDOR_MEDIATEK=y
-CONFIG_MT7601U=m
-CONFIG_MT76_CORE=m
-CONFIG_MT76_LEDS=y
-CONFIG_MT76_USB=m
-CONFIG_MT76_SDIO=m
-CONFIG_MT76x02_LIB=m
-CONFIG_MT76x02_USB=m
-CONFIG_MT76_CONNAC_LIB=m
-CONFIG_MT792x_LIB=m
-CONFIG_MT792x_USB=m
-CONFIG_MT76x0_COMMON=m
-CONFIG_MT76x0U=m
-CONFIG_MT76x0E=m
-CONFIG_MT76x2_COMMON=m
-CONFIG_MT76x2E=m
-CONFIG_MT76x2U=m
-CONFIG_MT7603E=m
-CONFIG_MT7615_COMMON=m
-CONFIG_MT7615E=m
-CONFIG_MT7663_USB_SDIO_COMMON=m
-CONFIG_MT7663U=m
-CONFIG_MT7663S=m
-CONFIG_MT7915E=m
-CONFIG_MT7921_COMMON=m
-CONFIG_MT7921E=m
-CONFIG_MT7921S=m
-CONFIG_MT7921U=m
-CONFIG_MT7996E=m
-CONFIG_MT7925_COMMON=m
-CONFIG_MT7925E=m
-CONFIG_MT7925U=m
-CONFIG_WLAN_VENDOR_MICROCHIP=y
-CONFIG_WILC1000=m
-CONFIG_WILC1000_SDIO=m
-CONFIG_WILC1000_SPI=m
-# CONFIG_WILC1000_HW_OOB_INTR is not set
-CONFIG_WLAN_VENDOR_PURELIFI=y
-CONFIG_PLFXLC=m
-CONFIG_WLAN_VENDOR_RALINK=y
-CONFIG_RT2X00=m
-CONFIG_RT2400PCI=m
-CONFIG_RT2500PCI=m
-CONFIG_RT61PCI=m
-CONFIG_RT2800PCI=m
-CONFIG_RT2800PCI_RT33XX=y
-CONFIG_RT2800PCI_RT35XX=y
-CONFIG_RT2800PCI_RT53XX=y
-CONFIG_RT2800PCI_RT3290=y
-CONFIG_RT2500USB=m
-CONFIG_RT73USB=m
-CONFIG_RT2800USB=m
-CONFIG_RT2800USB_RT33XX=y
-CONFIG_RT2800USB_RT35XX=y
-CONFIG_RT2800USB_RT3573=y
-CONFIG_RT2800USB_RT53XX=y
-CONFIG_RT2800USB_RT55XX=y
-# CONFIG_RT2800USB_UNKNOWN is not set
-CONFIG_RT2800_LIB=m
-CONFIG_RT2800_LIB_MMIO=m
-CONFIG_RT2X00_LIB_MMIO=m
-CONFIG_RT2X00_LIB_PCI=m
-CONFIG_RT2X00_LIB_USB=m
-CONFIG_RT2X00_LIB=m
-CONFIG_RT2X00_LIB_FIRMWARE=y
-CONFIG_RT2X00_LIB_CRYPTO=y
-CONFIG_RT2X00_LIB_LEDS=y
-# CONFIG_RT2X00_LIB_DEBUGFS is not set
-# CONFIG_RT2X00_DEBUG is not set
-CONFIG_WLAN_VENDOR_REALTEK=y
-CONFIG_RTL8180=m
-CONFIG_RTL8187=m
-CONFIG_RTL8187_LEDS=y
-CONFIG_RTL_CARDS=m
-CONFIG_RTL8192CE=m
-CONFIG_RTL8192SE=m
-CONFIG_RTL8192DE=m
-CONFIG_RTL8723AE=m
-CONFIG_RTL8723BE=m
-CONFIG_RTL8188EE=m
-CONFIG_RTL8192EE=m
-CONFIG_RTL8821AE=m
-CONFIG_RTL8192CU=m
-CONFIG_RTL8192DU=m
-CONFIG_RTLWIFI=m
-CONFIG_RTLWIFI_PCI=m
-CONFIG_RTLWIFI_USB=m
-# CONFIG_RTLWIFI_DEBUG is not set
-CONFIG_RTL8192C_COMMON=m
-CONFIG_RTL8192D_COMMON=m
-CONFIG_RTL8723_COMMON=m
-CONFIG_RTLBTCOEXIST=m
-CONFIG_RTL8XXXU=m
-# CONFIG_RTL8XXXU_UNTESTED is not set
-CONFIG_RTW88=m
-CONFIG_RTW88_CORE=m
-CONFIG_RTW88_PCI=m
-CONFIG_RTW88_SDIO=m
-CONFIG_RTW88_USB=m
-CONFIG_RTW88_8822B=m
-CONFIG_RTW88_8822C=m
-CONFIG_RTW88_8723X=m
-CONFIG_RTW88_8703B=m
-CONFIG_RTW88_8723D=m
-CONFIG_RTW88_8821C=m
-CONFIG_RTW88_88XXA=m
-CONFIG_RTW88_8821A=m
-CONFIG_RTW88_8812A=m
-CONFIG_RTW88_8814A=m
-CONFIG_RTW88_8822BE=m
-CONFIG_RTW88_8822BS=m
-CONFIG_RTW88_8822BU=m
-CONFIG_RTW88_8822CE=m
-CONFIG_RTW88_8822CS=m
-CONFIG_RTW88_8822CU=m
-CONFIG_RTW88_8723DE=m
-CONFIG_RTW88_8723DS=m
-CONFIG_RTW88_8723CS=m
-CONFIG_RTW88_8723DU=m
-CONFIG_RTW88_8821CE=m
-CONFIG_RTW88_8821CS=m
-CONFIG_RTW88_8821CU=m
-CONFIG_RTW88_8821AU=m
-CONFIG_RTW88_8812AU=m
-CONFIG_RTW88_8814AE=m
-CONFIG_RTW88_8814AU=m
-# CONFIG_RTW88_DEBUG is not set
-# CONFIG_RTW88_DEBUGFS is not set
-CONFIG_RTW88_LEDS=y
-CONFIG_RTW89=m
-CONFIG_RTW89_CORE=m
-CONFIG_RTW89_PCI=m
-CONFIG_RTW89_USB=m
-CONFIG_RTW89_8851B=m
-CONFIG_RTW89_8852A=m
-CONFIG_RTW89_8852B_COMMON=m
-CONFIG_RTW89_8852B=m
-CONFIG_RTW89_8852BT=m
-CONFIG_RTW89_8852C=m
-CONFIG_RTW89_8922A=m
-CONFIG_RTW89_8851BE=m
-CONFIG_RTW89_8851BU=m
-CONFIG_RTW89_8852AE=m
-CONFIG_RTW89_8852BE=m
-CONFIG_RTW89_8852BU=m
-CONFIG_RTW89_8852BTE=m
-CONFIG_RTW89_8852CE=m
-CONFIG_RTW89_8922AE=m
-# CONFIG_RTW89_DEBUGMSG is not set
-# CONFIG_RTW89_DEBUGFS is not set
-CONFIG_WLAN_VENDOR_RSI=y
-CONFIG_RSI_91X=m
-# CONFIG_RSI_DEBUGFS is not set
-CONFIG_RSI_SDIO=m
-CONFIG_RSI_USB=m
-CONFIG_RSI_COEX=y
-CONFIG_WLAN_VENDOR_SILABS=y
-CONFIG_WFX=m
-CONFIG_WLAN_VENDOR_ST=y
-CONFIG_CW1200=m
-CONFIG_CW1200_WLAN_SDIO=m
-CONFIG_CW1200_WLAN_SPI=m
-CONFIG_WLAN_VENDOR_TI=y
-CONFIG_WL1251=m
-CONFIG_WL1251_SPI=m
-CONFIG_WL1251_SDIO=m
-CONFIG_WL12XX=m
-CONFIG_WL18XX=m
-CONFIG_WLCORE=m
-CONFIG_WLCORE_SPI=m
-CONFIG_WLCORE_SDIO=m
-CONFIG_WLAN_VENDOR_ZYDAS=y
-CONFIG_ZD1211RW=m
-# CONFIG_ZD1211RW_DEBUG is not set
-CONFIG_WLAN_VENDOR_QUANTENNA=y
-CONFIG_QTNFMAC=m
-CONFIG_QTNFMAC_PCIE=m
-CONFIG_MAC80211_HWSIM=m
-CONFIG_VIRT_WIFI=m
-CONFIG_WAN=y
-CONFIG_HDLC=m
-CONFIG_HDLC_RAW=m
-CONFIG_HDLC_RAW_ETH=m
-CONFIG_HDLC_CISCO=m
-CONFIG_HDLC_FR=m
-CONFIG_HDLC_PPP=m
-CONFIG_HDLC_X25=m
-CONFIG_FRAMER=m
-CONFIG_GENERIC_FRAMER=y
-CONFIG_FRAMER_PEF2256=m
-CONFIG_PCI200SYN=m
-CONFIG_WANXL=m
-CONFIG_PC300TOO=m
-CONFIG_FARSYNC=m
-CONFIG_LAPBETHER=m
-CONFIG_IEEE802154_DRIVERS=m
-CONFIG_IEEE802154_FAKELB=m
-CONFIG_IEEE802154_AT86RF230=m
-CONFIG_IEEE802154_MRF24J40=m
-CONFIG_IEEE802154_CC2520=m
-CONFIG_IEEE802154_ATUSB=m
-CONFIG_IEEE802154_ADF7242=m
-CONFIG_IEEE802154_CA8210=m
-# CONFIG_IEEE802154_CA8210_DEBUGFS is not set
-CONFIG_IEEE802154_MCR20A=m
-CONFIG_IEEE802154_HWSIM=m
-
-#
-# Wireless WAN
-#
-CONFIG_WWAN=m
-CONFIG_WWAN_DEBUGFS=y
-CONFIG_WWAN_HWSIM=m
-CONFIG_MHI_WWAN_CTRL=m
-CONFIG_MHI_WWAN_MBIM=m
-CONFIG_RPMSG_WWAN_CTRL=m
-CONFIG_IOSM=m
-CONFIG_MTK_T7XX=m
-# end of Wireless WAN
-
-CONFIG_VMXNET3=m
-CONFIG_FUJITSU_ES=m
-CONFIG_USB4_NET=m
-CONFIG_NETDEVSIM=m
-CONFIG_NET_FAILOVER=m
-# CONFIG_ISDN is not set
-
-#
-# Input device support
-#
-CONFIG_INPUT=y
-CONFIG_INPUT_LEDS=m
-CONFIG_INPUT_FF_MEMLESS=m
-CONFIG_INPUT_SPARSEKMAP=m
-CONFIG_INPUT_MATRIXKMAP=m
-CONFIG_INPUT_VIVALDIFMAP=m
-
-#
-# Userland interfaces
-#
-CONFIG_INPUT_MOUSEDEV=m
-# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
-CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
-CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
-CONFIG_INPUT_JOYDEV=m
-CONFIG_INPUT_EVDEV=m
-
-#
-# Input Device Drivers
-#
-CONFIG_INPUT_KEYBOARD=y
-CONFIG_KEYBOARD_ADC=m
-CONFIG_KEYBOARD_ADP5585=m
-CONFIG_KEYBOARD_ADP5588=m
-CONFIG_KEYBOARD_ATKBD=m
-CONFIG_KEYBOARD_QT1050=m
-CONFIG_KEYBOARD_QT1070=m
-CONFIG_KEYBOARD_QT2160=m
-CONFIG_KEYBOARD_DLINK_DIR685=m
-CONFIG_KEYBOARD_LKKBD=m
-CONFIG_KEYBOARD_GPIO=m
-CONFIG_KEYBOARD_GPIO_POLLED=m
-CONFIG_KEYBOARD_TCA8418=m
-CONFIG_KEYBOARD_MATRIX=m
-CONFIG_KEYBOARD_LM8323=m
-CONFIG_KEYBOARD_LM8333=m
-CONFIG_KEYBOARD_MAX7359=m
-CONFIG_KEYBOARD_MAX7360=m
-CONFIG_KEYBOARD_MPR121=m
-CONFIG_KEYBOARD_NEWTON=m
-CONFIG_KEYBOARD_OPENCORES=m
-CONFIG_KEYBOARD_PINEPHONE=m
-CONFIG_KEYBOARD_SAMSUNG=m
-CONFIG_KEYBOARD_GOLDFISH_EVENTS=m
-CONFIG_KEYBOARD_STOWAWAY=m
-CONFIG_KEYBOARD_SUNKBD=m
-CONFIG_KEYBOARD_SUN4I_LRADC=m
-CONFIG_KEYBOARD_IQS62X=m
-CONFIG_KEYBOARD_OMAP4=m
-CONFIG_KEYBOARD_TM2_TOUCHKEY=m
-CONFIG_KEYBOARD_XTKBD=m
-CONFIG_KEYBOARD_CAP11XX=m
-CONFIG_KEYBOARD_BCM=m
-CONFIG_KEYBOARD_MTK_PMIC=m
-CONFIG_KEYBOARD_CYPRESS_SF=m
-CONFIG_INPUT_MOUSE=y
-CONFIG_MOUSE_PS2=m
-CONFIG_MOUSE_PS2_ALPS=y
-CONFIG_MOUSE_PS2_BYD=y
-CONFIG_MOUSE_PS2_LOGIPS2PP=y
-CONFIG_MOUSE_PS2_SYNAPTICS=y
-CONFIG_MOUSE_PS2_SYNAPTICS_SMBUS=y
-CONFIG_MOUSE_PS2_CYPRESS=y
-CONFIG_MOUSE_PS2_TRACKPOINT=y
-CONFIG_MOUSE_PS2_ELANTECH=y
-CONFIG_MOUSE_PS2_ELANTECH_SMBUS=y
-# CONFIG_MOUSE_PS2_SENTELIC is not set
-# CONFIG_MOUSE_PS2_TOUCHKIT is not set
-CONFIG_MOUSE_PS2_FOCALTECH=y
-CONFIG_MOUSE_PS2_SMBUS=y
-CONFIG_MOUSE_SERIAL=m
-CONFIG_MOUSE_APPLETOUCH=m
-CONFIG_MOUSE_BCM5974=m
-CONFIG_MOUSE_CYAPA=m
-CONFIG_MOUSE_ELAN_I2C=m
-CONFIG_MOUSE_ELAN_I2C_I2C=y
-CONFIG_MOUSE_ELAN_I2C_SMBUS=y
-CONFIG_MOUSE_VSXXXAA=m
-CONFIG_MOUSE_GPIO=m
-CONFIG_MOUSE_SYNAPTICS_I2C=m
-CONFIG_MOUSE_SYNAPTICS_USB=m
-CONFIG_INPUT_JOYSTICK=y
-CONFIG_JOYSTICK_ANALOG=m
-CONFIG_JOYSTICK_A3D=m
-CONFIG_JOYSTICK_ADC=m
-CONFIG_JOYSTICK_ADI=m
-CONFIG_JOYSTICK_COBRA=m
-CONFIG_JOYSTICK_GF2K=m
-CONFIG_JOYSTICK_GRIP=m
-CONFIG_JOYSTICK_GRIP_MP=m
-CONFIG_JOYSTICK_GUILLEMOT=m
-CONFIG_JOYSTICK_INTERACT=m
-CONFIG_JOYSTICK_SIDEWINDER=m
-CONFIG_JOYSTICK_TMDC=m
-CONFIG_JOYSTICK_IFORCE=m
-CONFIG_JOYSTICK_IFORCE_USB=m
-CONFIG_JOYSTICK_IFORCE_232=m
-CONFIG_JOYSTICK_WARRIOR=m
-CONFIG_JOYSTICK_MAGELLAN=m
-CONFIG_JOYSTICK_SPACEORB=m
-CONFIG_JOYSTICK_SPACEBALL=m
-CONFIG_JOYSTICK_STINGER=m
-CONFIG_JOYSTICK_TWIDJOY=m
-CONFIG_JOYSTICK_ZHENHUA=m
-CONFIG_JOYSTICK_DB9=m
-CONFIG_JOYSTICK_GAMECON=m
-CONFIG_JOYSTICK_TURBOGRAFX=m
-CONFIG_JOYSTICK_AS5011=m
-CONFIG_JOYSTICK_JOYDUMP=m
-CONFIG_JOYSTICK_XPAD=m
-CONFIG_JOYSTICK_XPAD_FF=y
-CONFIG_JOYSTICK_XPAD_LEDS=y
-CONFIG_JOYSTICK_WALKERA0701=m
-CONFIG_JOYSTICK_PSXPAD_SPI=m
-CONFIG_JOYSTICK_PSXPAD_SPI_FF=y
-CONFIG_JOYSTICK_PXRC=m
-CONFIG_JOYSTICK_QWIIC=m
-CONFIG_JOYSTICK_FSIA6B=m
-CONFIG_JOYSTICK_SENSEHAT=m
-CONFIG_JOYSTICK_SEESAW=m
-CONFIG_INPUT_TABLET=y
-CONFIG_TABLET_USB_ACECAD=m
-CONFIG_TABLET_USB_AIPTEK=m
-CONFIG_TABLET_USB_HANWANG=m
-CONFIG_TABLET_USB_KBTAB=m
-CONFIG_TABLET_USB_PEGASUS=m
-CONFIG_TABLET_SERIAL_WACOM4=m
-CONFIG_INPUT_TOUCHSCREEN=y
-CONFIG_TOUCHSCREEN_ADS7846=m
-CONFIG_TOUCHSCREEN_AD7877=m
-CONFIG_TOUCHSCREEN_AD7879=m
-CONFIG_TOUCHSCREEN_AD7879_I2C=m
-CONFIG_TOUCHSCREEN_AD7879_SPI=m
-CONFIG_TOUCHSCREEN_ADC=m
-CONFIG_TOUCHSCREEN_AR1021_I2C=m
-CONFIG_TOUCHSCREEN_ATMEL_MXT=m
-# CONFIG_TOUCHSCREEN_ATMEL_MXT_T37 is not set
-CONFIG_TOUCHSCREEN_AUO_PIXCIR=m
-CONFIG_TOUCHSCREEN_BU21013=m
-CONFIG_TOUCHSCREEN_BU21029=m
-CONFIG_TOUCHSCREEN_CHIPONE_ICN8318=m
-CONFIG_TOUCHSCREEN_CHIPONE_ICN8505=m
-CONFIG_TOUCHSCREEN_CY8CTMA140=m
-CONFIG_TOUCHSCREEN_CY8CTMG110=m
-CONFIG_TOUCHSCREEN_CYTTSP_CORE=m
-CONFIG_TOUCHSCREEN_CYTTSP_I2C=m
-CONFIG_TOUCHSCREEN_CYTTSP_SPI=m
-CONFIG_TOUCHSCREEN_CYTTSP5=m
-CONFIG_TOUCHSCREEN_DYNAPRO=m
-CONFIG_TOUCHSCREEN_HAMPSHIRE=m
-CONFIG_TOUCHSCREEN_EETI=m
-CONFIG_TOUCHSCREEN_EGALAX=m
-CONFIG_TOUCHSCREEN_EGALAX_SERIAL=m
-CONFIG_TOUCHSCREEN_EXC3000=m
-CONFIG_TOUCHSCREEN_FUJITSU=m
-CONFIG_TOUCHSCREEN_GOODIX=m
-CONFIG_TOUCHSCREEN_GOODIX_BERLIN_CORE=m
-CONFIG_TOUCHSCREEN_GOODIX_BERLIN_I2C=m
-CONFIG_TOUCHSCREEN_GOODIX_BERLIN_SPI=m
-CONFIG_TOUCHSCREEN_HIDEEP=m
-CONFIG_TOUCHSCREEN_HIMAX_HX852X=m
-CONFIG_TOUCHSCREEN_HYCON_HY46XX=m
-CONFIG_TOUCHSCREEN_HYNITRON_CSTXXX=m
-CONFIG_TOUCHSCREEN_HYNITRON_CST816X=m
-CONFIG_TOUCHSCREEN_ILI210X=m
-CONFIG_TOUCHSCREEN_ILITEK=m
-CONFIG_TOUCHSCREEN_S6SY761=m
-CONFIG_TOUCHSCREEN_GUNZE=m
-CONFIG_TOUCHSCREEN_EKTF2127=m
-CONFIG_TOUCHSCREEN_ELAN=m
-CONFIG_TOUCHSCREEN_ELO=m
-CONFIG_TOUCHSCREEN_WACOM_W8001=m
-CONFIG_TOUCHSCREEN_WACOM_I2C=m
-CONFIG_TOUCHSCREEN_MAX11801=m
-CONFIG_TOUCHSCREEN_MMS114=m
-CONFIG_TOUCHSCREEN_MELFAS_MIP4=m
-CONFIG_TOUCHSCREEN_MSG2638=m
-CONFIG_TOUCHSCREEN_MTOUCH=m
-CONFIG_TOUCHSCREEN_NOVATEK_NVT_TS=m
-CONFIG_TOUCHSCREEN_IMAGIS=m
-CONFIG_TOUCHSCREEN_IMX6UL_TSC=m
-CONFIG_TOUCHSCREEN_INEXIO=m
-CONFIG_TOUCHSCREEN_PENMOUNT=m
-CONFIG_TOUCHSCREEN_EDT_FT5X06=m
-CONFIG_TOUCHSCREEN_TOUCHRIGHT=m
-CONFIG_TOUCHSCREEN_TOUCHWIN=m
-CONFIG_TOUCHSCREEN_PIXCIR=m
-CONFIG_TOUCHSCREEN_WDT87XX_I2C=m
-CONFIG_TOUCHSCREEN_WM97XX=m
-CONFIG_TOUCHSCREEN_WM9705=y
-CONFIG_TOUCHSCREEN_WM9712=y
-CONFIG_TOUCHSCREEN_WM9713=y
-CONFIG_TOUCHSCREEN_USB_COMPOSITE=m
-CONFIG_TOUCHSCREEN_MC13783=m
-CONFIG_TOUCHSCREEN_USB_EGALAX=y
-CONFIG_TOUCHSCREEN_USB_PANJIT=y
-CONFIG_TOUCHSCREEN_USB_3M=y
-CONFIG_TOUCHSCREEN_USB_ITM=y
-CONFIG_TOUCHSCREEN_USB_ETURBO=y
-CONFIG_TOUCHSCREEN_USB_GUNZE=y
-CONFIG_TOUCHSCREEN_USB_DMC_TSC10=y
-CONFIG_TOUCHSCREEN_USB_IRTOUCH=y
-CONFIG_TOUCHSCREEN_USB_IDEALTEK=y
-CONFIG_TOUCHSCREEN_USB_GENERAL_TOUCH=y
-CONFIG_TOUCHSCREEN_USB_GOTOP=y
-CONFIG_TOUCHSCREEN_USB_JASTEC=y
-CONFIG_TOUCHSCREEN_USB_ELO=y
-CONFIG_TOUCHSCREEN_USB_E2I=y
-CONFIG_TOUCHSCREEN_USB_ZYTRONIC=y
-CONFIG_TOUCHSCREEN_USB_ETT_TC45USB=y
-CONFIG_TOUCHSCREEN_USB_NEXIO=y
-CONFIG_TOUCHSCREEN_USB_EASYTOUCH=y
-CONFIG_TOUCHSCREEN_TOUCHIT213=m
-CONFIG_TOUCHSCREEN_TSC_SERIO=m
-CONFIG_TOUCHSCREEN_TSC200X_CORE=m
-CONFIG_TOUCHSCREEN_TSC2004=m
-CONFIG_TOUCHSCREEN_TSC2005=m
-CONFIG_TOUCHSCREEN_TSC2007=m
-# CONFIG_TOUCHSCREEN_TSC2007_IIO is not set
-CONFIG_TOUCHSCREEN_RM_TS=m
-CONFIG_TOUCHSCREEN_SILEAD=m
-CONFIG_TOUCHSCREEN_SIS_I2C=m
-CONFIG_TOUCHSCREEN_ST1232=m
-CONFIG_TOUCHSCREEN_STMFTS=m
-CONFIG_TOUCHSCREEN_SUN4I=m
-CONFIG_TOUCHSCREEN_SUR40=m
-CONFIG_TOUCHSCREEN_SURFACE3_SPI=m
-CONFIG_TOUCHSCREEN_SX8654=m
-CONFIG_TOUCHSCREEN_TPS6507X=m
-CONFIG_TOUCHSCREEN_ZET6223=m
-CONFIG_TOUCHSCREEN_ZFORCE=m
-CONFIG_TOUCHSCREEN_COLIBRI_VF50=m
-CONFIG_TOUCHSCREEN_ROHM_BU21023=m
-CONFIG_TOUCHSCREEN_IQS5XX=m
-CONFIG_TOUCHSCREEN_IQS7211=m
-CONFIG_TOUCHSCREEN_ZINITIX=m
-CONFIG_TOUCHSCREEN_HIMAX_HX83112B=m
-CONFIG_INPUT_MISC=y
-CONFIG_INPUT_88PM80X_ONKEY=m
-CONFIG_INPUT_AD714X=m
-CONFIG_INPUT_AD714X_I2C=m
-CONFIG_INPUT_AD714X_SPI=m
-CONFIG_INPUT_ARIZONA_HAPTICS=m
-CONFIG_INPUT_ATC260X_ONKEY=m
-CONFIG_INPUT_ATMEL_CAPTOUCH=m
-CONFIG_INPUT_AW86927=m
-CONFIG_INPUT_BMA150=m
-CONFIG_INPUT_CS40L50_VIBRA=m
-CONFIG_INPUT_E3X0_BUTTON=m
-CONFIG_INPUT_MAX7360_ROTARY=m
-CONFIG_INPUT_MAX77650_ONKEY=m
-CONFIG_INPUT_MAX77693_HAPTIC=m
-CONFIG_INPUT_MC13783_PWRBUTTON=m
-CONFIG_INPUT_MMA8450=m
-CONFIG_INPUT_GPIO_BEEPER=m
-CONFIG_INPUT_GPIO_DECODER=m
-CONFIG_INPUT_GPIO_VIBRA=m
-CONFIG_INPUT_CPCAP_PWRBUTTON=m
-CONFIG_INPUT_ATI_REMOTE2=m
-CONFIG_INPUT_KEYSPAN_REMOTE=m
-CONFIG_INPUT_KXTJ9=m
-CONFIG_INPUT_POWERMATE=m
-CONFIG_INPUT_YEALINK=m
-CONFIG_INPUT_CM109=m
-CONFIG_INPUT_REGULATOR_HAPTIC=m
-CONFIG_INPUT_RETU_PWRBUTTON=m
-CONFIG_INPUT_TPS65218_PWRBUTTON=m
-CONFIG_INPUT_TPS65219_PWRBUTTON=m
-CONFIG_INPUT_TPS6594_PWRBUTTON=m
-CONFIG_INPUT_AXP20X_PEK=m
-CONFIG_INPUT_UINPUT=m
-CONFIG_INPUT_PCF8574=m
-CONFIG_INPUT_PWM_BEEPER=m
-CONFIG_INPUT_PWM_VIBRA=m
-CONFIG_INPUT_RK805_PWRKEY=m
-CONFIG_INPUT_GPIO_ROTARY_ENCODER=m
-CONFIG_INPUT_DA7280_HAPTICS=m
-CONFIG_INPUT_DA9063_ONKEY=m
-CONFIG_INPUT_ADXL34X=m
-CONFIG_INPUT_ADXL34X_I2C=m
-CONFIG_INPUT_ADXL34X_SPI=m
-CONFIG_INPUT_IBM_PANEL=m
-CONFIG_INPUT_IMS_PCU=m
-CONFIG_INPUT_IQS269A=m
-CONFIG_INPUT_IQS626A=m
-CONFIG_INPUT_IQS7222=m
-CONFIG_INPUT_CMA3000=m
-CONFIG_INPUT_CMA3000_I2C=m
-CONFIG_INPUT_SOC_BUTTON_ARRAY=m
-CONFIG_INPUT_DRV260X_HAPTICS=m
-CONFIG_INPUT_DRV2665_HAPTICS=m
-CONFIG_INPUT_DRV2667_HAPTICS=m
-CONFIG_INPUT_QNAP_MCU=m
-CONFIG_INPUT_RAVE_SP_PWRBUTTON=m
-CONFIG_INPUT_RT5120_PWRKEY=m
-CONFIG_RMI4_CORE=m
-CONFIG_RMI4_I2C=m
-CONFIG_RMI4_SPI=m
-CONFIG_RMI4_SMB=m
-CONFIG_RMI4_F03=y
-CONFIG_RMI4_F03_SERIO=m
-CONFIG_RMI4_2D_SENSOR=y
-CONFIG_RMI4_F11=y
-CONFIG_RMI4_F12=y
-CONFIG_RMI4_F1A=y
-CONFIG_RMI4_F21=y
-CONFIG_RMI4_F30=y
-CONFIG_RMI4_F34=y
-CONFIG_RMI4_F3A=y
-# CONFIG_RMI4_F54 is not set
-CONFIG_RMI4_F55=y
-
-#
-# Hardware I/O ports
-#
-CONFIG_SERIO=m
-CONFIG_SERIO_SERPORT=m
-CONFIG_SERIO_PARKBD=m
-CONFIG_SERIO_AMBAKMI=m
-CONFIG_SERIO_PCIPS2=m
-CONFIG_SERIO_LIBPS2=m
-CONFIG_SERIO_RAW=m
-CONFIG_SERIO_ALTERA_PS2=m
-CONFIG_SERIO_PS2MULT=m
-CONFIG_SERIO_ARC_PS2=m
-CONFIG_SERIO_APBPS2=m
-CONFIG_SERIO_SUN4I_PS2=m
-CONFIG_SERIO_GPIO_PS2=m
-CONFIG_USERIO=m
-CONFIG_GAMEPORT=m
-CONFIG_GAMEPORT_EMU10K1=m
-CONFIG_GAMEPORT_FM801=m
-# end of Hardware I/O ports
-# end of Input device support
-
-#
-# Character devices
-#
-CONFIG_TTY=y
-CONFIG_VT=y
-CONFIG_CONSOLE_TRANSLATIONS=y
-CONFIG_VT_CONSOLE=y
-CONFIG_VT_CONSOLE_SLEEP=y
-CONFIG_VT_HW_CONSOLE_BINDING=y
-CONFIG_UNIX98_PTYS=y
-# CONFIG_LEGACY_PTYS is not set
-# CONFIG_LEGACY_TIOCSTI is not set
-CONFIG_LDISC_AUTOLOAD=y
-
-#
-# Serial drivers
-#
-CONFIG_SERIAL_EARLYCON=y
-CONFIG_SERIAL_8250=y
-CONFIG_SERIAL_8250_DEPRECATED_OPTIONS=y
-CONFIG_SERIAL_8250_PNP=y
-# CONFIG_SERIAL_8250_16550A_VARIANTS is not set
-# CONFIG_SERIAL_8250_FINTEK is not set
-CONFIG_SERIAL_8250_CONSOLE=y
-CONFIG_SERIAL_8250_DMA=y
-CONFIG_SERIAL_8250_PCILIB=y
-CONFIG_SERIAL_8250_PCI=m
-CONFIG_SERIAL_8250_EXAR=m
-CONFIG_SERIAL_8250_CS=m
-CONFIG_SERIAL_8250_MEN_MCB=m
-CONFIG_SERIAL_8250_NR_UARTS=32
-CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-CONFIG_SERIAL_8250_EXTENDED=y
-CONFIG_SERIAL_8250_MANY_PORTS=y
-CONFIG_SERIAL_8250_PCI1XXXX=m
-CONFIG_SERIAL_8250_SHARE_IRQ=y
-CONFIG_SERIAL_8250_DETECT_IRQ=y
-CONFIG_SERIAL_8250_RSA=y
-CONFIG_SERIAL_8250_DWLIB=y
-CONFIG_SERIAL_8250_DFL=m
-CONFIG_SERIAL_8250_DW=m
-CONFIG_SERIAL_8250_EM=m
-# CONFIG_SERIAL_8250_RT288X is not set
-CONFIG_SERIAL_8250_PERICOM=m
-CONFIG_SERIAL_OF_PLATFORM=m
-
-#
-# Non-8250 serial port support
-#
-CONFIG_SERIAL_AMBA_PL010=m
-CONFIG_SERIAL_AMBA_PL011=m
-CONFIG_SERIAL_EARLYCON_SEMIHOST=y
-CONFIG_SERIAL_EARLYCON_RISCV_SBI=y
-CONFIG_SERIAL_ATMEL=y
-CONFIG_SERIAL_ATMEL_CONSOLE=y
-CONFIG_SERIAL_ATMEL_PDC=y
-# CONFIG_SERIAL_ATMEL_TTYAT is not set
-CONFIG_SERIAL_MAX3100=m
-CONFIG_SERIAL_MAX310X=m
-CONFIG_SERIAL_UARTLITE=m
-CONFIG_SERIAL_UARTLITE_NR_UARTS=1
-CONFIG_SERIAL_SH_SCI=m
-CONFIG_SERIAL_SH_SCI_NR_UARTS=18
-CONFIG_SERIAL_SH_SCI_DMA=y
-CONFIG_SERIAL_RSCI=m
-CONFIG_SERIAL_CORE=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-CONFIG_SERIAL_JSM=m
-CONFIG_SERIAL_SIFIVE=m
-CONFIG_SERIAL_SCCNXP=m
-CONFIG_SERIAL_SC16IS7XX=m
-CONFIG_SERIAL_SC16IS7XX_I2C=m
-CONFIG_SERIAL_SC16IS7XX_SPI=m
-CONFIG_SERIAL_ALTERA_JTAGUART=m
-CONFIG_SERIAL_ALTERA_UART=m
-CONFIG_SERIAL_ALTERA_UART_MAXPORTS=4
-CONFIG_SERIAL_ALTERA_UART_BAUDRATE=115200
-CONFIG_SERIAL_XILINX_PS_UART=m
-CONFIG_SERIAL_ARC=m
-CONFIG_SERIAL_ARC_NR_PORTS=1
-CONFIG_SERIAL_RP2=m
-CONFIG_SERIAL_RP2_NR_UARTS=32
-CONFIG_SERIAL_FSL_LPUART=m
-CONFIG_SERIAL_FSL_LINFLEXUART=m
-CONFIG_SERIAL_CONEXANT_DIGICOLOR=m
-CONFIG_SERIAL_MEN_Z135=m
-CONFIG_SERIAL_SPRD=m
-CONFIG_SERIAL_LITEUART=m
-CONFIG_SERIAL_LITEUART_MAX_PORTS=1
-# end of Serial drivers
-
-CONFIG_SERIAL_MCTRL_GPIO=y
-CONFIG_SERIAL_NONSTANDARD=y
-CONFIG_MOXA_INTELLIO=m
-CONFIG_MOXA_SMARTIO=m
-CONFIG_N_HDLC=m
-CONFIG_GOLDFISH_TTY=m
-CONFIG_IPWIRELESS=m
-CONFIG_N_GSM=m
-CONFIG_NOZOMI=m
-CONFIG_NULL_TTY=m
-CONFIG_HVC_DRIVER=y
-CONFIG_RPMSG_TTY=m
-CONFIG_SERIAL_DEV_BUS=m
-CONFIG_TTY_PRINTK=m
-CONFIG_TTY_PRINTK_LEVEL=6
-CONFIG_PRINTER=m
-# CONFIG_LP_CONSOLE is not set
-CONFIG_PPDEV=m
-CONFIG_VIRTIO_CONSOLE=m
-CONFIG_IPMI_HANDLER=m
-CONFIG_IPMI_DMI_DECODE=y
-CONFIG_IPMI_PLAT_DATA=y
-# CONFIG_IPMI_PANIC_EVENT is not set
-CONFIG_IPMI_DEVICE_INTERFACE=m
-CONFIG_IPMI_SI=m
-CONFIG_IPMI_SSIF=m
-CONFIG_IPMI_IPMB=m
-CONFIG_IPMI_WATCHDOG=m
-CONFIG_IPMI_POWEROFF=m
-CONFIG_SSIF_IPMI_BMC=m
-CONFIG_IPMB_DEVICE_INTERFACE=m
-CONFIG_HW_RANDOM=m
-CONFIG_HW_RANDOM_TIMERIOMEM=m
-CONFIG_HW_RANDOM_ATMEL=m
-CONFIG_HW_RANDOM_BA431=m
-CONFIG_HW_RANDOM_VIRTIO=m
-CONFIG_HW_RANDOM_POLARFIRE_SOC=m
-CONFIG_HW_RANDOM_CCTRNG=m
-CONFIG_HW_RANDOM_XIPHERA=m
-CONFIG_HW_RANDOM_JH7110=m
-CONFIG_APPLICOM=m
-CONFIG_DEVMEM=y
-CONFIG_DEVPORT=y
-CONFIG_TCG_TPM=m
-# CONFIG_TCG_TPM2_HMAC is not set
-CONFIG_HW_RANDOM_TPM=y
-CONFIG_TCG_TIS_CORE=m
-CONFIG_TCG_TIS=m
-CONFIG_TCG_TIS_SPI=m
-CONFIG_TCG_TIS_SPI_CR50=y
-CONFIG_TCG_TIS_I2C=m
-CONFIG_TCG_TIS_I2C_CR50=m
-CONFIG_TCG_TIS_I2C_ATMEL=m
-CONFIG_TCG_TIS_I2C_INFINEON=m
-CONFIG_TCG_TIS_I2C_NUVOTON=m
-CONFIG_TCG_ATMEL=m
-CONFIG_TCG_INFINEON=m
-CONFIG_TCG_CRB=m
-CONFIG_TCG_VTPM_PROXY=m
-CONFIG_TCG_TIS_ST33ZP24=m
-CONFIG_TCG_TIS_ST33ZP24_I2C=m
-CONFIG_TCG_TIS_ST33ZP24_SPI=m
-CONFIG_XILLYBUS_CLASS=m
-CONFIG_XILLYBUS=m
-CONFIG_XILLYBUS_PCIE=m
-CONFIG_XILLYBUS_OF=m
-CONFIG_XILLYUSB=m
-# end of Character devices
-
-#
-# I2C support
-#
-CONFIG_I2C=m
-CONFIG_I2C_BOARDINFO=y
-CONFIG_I2C_CHARDEV=m
-CONFIG_I2C_MUX=m
-
-#
-# Multiplexer I2C Chip support
-#
-CONFIG_I2C_ARB_GPIO_CHALLENGE=m
-CONFIG_I2C_MUX_GPIO=m
-CONFIG_I2C_MUX_GPMUX=m
-CONFIG_I2C_MUX_LTC4306=m
-CONFIG_I2C_MUX_PCA9541=m
-CONFIG_I2C_MUX_PCA954x=m
-CONFIG_I2C_MUX_PINCTRL=m
-CONFIG_I2C_MUX_REG=m
-CONFIG_I2C_DEMUX_PINCTRL=m
-CONFIG_I2C_MUX_MLXCPLD=m
-CONFIG_I2C_MUX_MULE=m
-# end of Multiplexer I2C Chip support
-
-CONFIG_I2C_ATR=m
-CONFIG_I2C_HELPER_AUTO=y
-CONFIG_I2C_SMBUS=m
-CONFIG_I2C_ALGOBIT=m
-CONFIG_I2C_ALGOPCA=m
-
-#
-# I2C Hardware Bus support
-#
-
-#
-# PC SMBus host controller drivers
-#
-CONFIG_I2C_CCGX_UCSI=m
-CONFIG_I2C_ALI1535=m
-CONFIG_I2C_ALI1563=m
-CONFIG_I2C_ALI15X3=m
-CONFIG_I2C_AMD756=m
-CONFIG_I2C_AMD8111=m
-CONFIG_I2C_AMD_MP2=m
-CONFIG_I2C_AMD_ASF=m
-CONFIG_I2C_I801=m
-CONFIG_I2C_I801_MUX=y
-CONFIG_I2C_ISCH=m
-CONFIG_I2C_PIIX4=m
-CONFIG_I2C_NFORCE2=m
-CONFIG_I2C_NVIDIA_GPU=m
-CONFIG_I2C_SIS5595=m
-CONFIG_I2C_SIS630=m
-CONFIG_I2C_SIS96X=m
-CONFIG_I2C_VIA=m
-CONFIG_I2C_VIAPRO=m
-CONFIG_I2C_ZHAOXIN=m
-
-#
-# ACPI drivers
-#
-CONFIG_I2C_SCMI=m
-
-#
-# I2C system bus drivers (mostly embedded / system-on-chip)
-#
-CONFIG_I2C_AT91=m
-# CONFIG_I2C_AT91_SLAVE_EXPERIMENTAL is not set
-CONFIG_I2C_CADENCE=m
-CONFIG_I2C_CBUS_GPIO=m
-CONFIG_I2C_DESIGNWARE_CORE=m
-# CONFIG_I2C_DESIGNWARE_SLAVE is not set
-CONFIG_I2C_DESIGNWARE_PLATFORM=m
-CONFIG_I2C_DESIGNWARE_AMDISP=m
-CONFIG_I2C_DESIGNWARE_PCI=m
-CONFIG_I2C_EMEV2=m
-CONFIG_I2C_GPIO=m
-# CONFIG_I2C_GPIO_FAULT_INJECTOR is not set
-CONFIG_I2C_K1=m
-CONFIG_I2C_KEMPLD=m
-CONFIG_I2C_MICROCHIP_CORE=m
-CONFIG_I2C_MV64XXX=m
-CONFIG_I2C_NOMADIK=m
-CONFIG_I2C_OCORES=m
-CONFIG_I2C_PCA_PLATFORM=m
-CONFIG_I2C_RIIC=m
-CONFIG_I2C_RK3X=m
-CONFIG_I2C_RZV2M=m
-CONFIG_I2C_SH_MOBILE=m
-CONFIG_I2C_SIMTEC=m
-CONFIG_I2C_XILINX=m
-CONFIG_I2C_RCAR=m
-
-#
-# External I2C/SMBus adapter drivers
-#
-CONFIG_I2C_DIOLAN_U2C=m
-CONFIG_I2C_DLN2=m
-CONFIG_I2C_LJCA=m
-CONFIG_I2C_NCT6694=m
-CONFIG_I2C_CP2615=m
-CONFIG_I2C_PARPORT=m
-CONFIG_I2C_PCI1XXXX=m
-CONFIG_I2C_ROBOTFUZZ_OSIF=m
-CONFIG_I2C_TAOS_EVM=m
-CONFIG_I2C_TINY_USB=m
-CONFIG_I2C_VIPERBOARD=m
-
-#
-# Other I2C/SMBus bus drivers
-#
-CONFIG_I2C_FSI=m
-CONFIG_I2C_VIRTIO=m
-# end of I2C Hardware Bus support
-
-CONFIG_I2C_STUB=m
-CONFIG_I2C_SLAVE=y
-CONFIG_I2C_SLAVE_EEPROM=m
-CONFIG_I2C_SLAVE_TESTUNIT=m
-# CONFIG_I2C_DEBUG_CORE is not set
-# CONFIG_I2C_DEBUG_ALGO is not set
-# CONFIG_I2C_DEBUG_BUS is not set
-# end of I2C support
-
-CONFIG_I3C=m
-CONFIG_ADI_I3C_MASTER=m
-CONFIG_CDNS_I3C_MASTER=m
-CONFIG_DW_I3C_MASTER=m
-CONFIG_SVC_I3C_MASTER=m
-CONFIG_MIPI_I3C_HCI=m
-CONFIG_MIPI_I3C_HCI_PCI=m
-CONFIG_RENESAS_I3C=m
-CONFIG_SPI=y
-# CONFIG_SPI_DEBUG is not set
-CONFIG_SPI_MASTER=y
-CONFIG_SPI_MEM=y
-CONFIG_SPI_OFFLOAD=y
-
-#
-# SPI Master Controller Drivers
-#
-CONFIG_SPI_ALTERA=m
-CONFIG_SPI_ALTERA_CORE=m
-CONFIG_SPI_ALTERA_DFL=m
-CONFIG_SPI_ATMEL=m
-CONFIG_SPI_AXI_SPI_ENGINE=m
-CONFIG_SPI_BITBANG=m
-CONFIG_SPI_BUTTERFLY=m
-CONFIG_SPI_CADENCE=m
-CONFIG_SPI_CADENCE_QUADSPI=m
-CONFIG_SPI_CADENCE_XSPI=m
-CONFIG_SPI_CH341=m
-CONFIG_SPI_CS42L43=m
-CONFIG_SPI_DESIGNWARE=m
-# CONFIG_SPI_DW_DMA is not set
-CONFIG_SPI_DW_PCI=m
-CONFIG_SPI_DW_MMIO=m
-CONFIG_SPI_DLN2=m
-CONFIG_SPI_FSI=m
-CONFIG_SPI_GPIO=m
-CONFIG_SPI_LM70_LLP=m
-CONFIG_SPI_FSL_LIB=m
-CONFIG_SPI_FSL_SPI=m
-CONFIG_SPI_LJCA=m
-CONFIG_SPI_MICROCHIP_CORE_QSPI=m
-CONFIG_SPI_OC_TINY=m
-CONFIG_SPI_PCI1XXXX=m
-CONFIG_SPI_PL022=m
-CONFIG_SPI_POLARFIRE_SOC=m
-CONFIG_SPI_RSPI=m
-CONFIG_SPI_RZV2H_RSPI=m
-CONFIG_SPI_RZV2M_CSI=m
-CONFIG_SPI_SC18IS602=m
-CONFIG_SPI_SH_MSIOF=m
-CONFIG_SPI_SH_HSPI=m
-CONFIG_SPI_SIFIVE=m
-CONFIG_SPI_SN_F_OSPI=m
-CONFIG_SPI_SG2044_NOR=m
-CONFIG_SPI_SUN4I=m
-CONFIG_SPI_SUN6I=m
-CONFIG_SPI_MXIC=m
-CONFIG_SPI_VIRTIO=m
-CONFIG_SPI_XCOMM=m
-CONFIG_SPI_XILINX=m
-CONFIG_SPI_ZYNQMP_GQSPI=m
-CONFIG_SPI_AMD=m
-
-#
-# SPI Multiplexer support
-#
-CONFIG_SPI_MUX=m
-
-#
-# SPI Protocol Masters
-#
-CONFIG_SPI_SPIDEV=m
-CONFIG_SPI_LOOPBACK_TEST=m
-CONFIG_SPI_TLE62X0=m
-# CONFIG_SPI_SLAVE is not set
-CONFIG_SPI_DYNAMIC=y
-
-#
-# SPI Offload triggers
-#
-CONFIG_SPI_OFFLOAD_TRIGGER_ADI_UTIL_SD=m
-CONFIG_SPI_OFFLOAD_TRIGGER_PWM=m
-CONFIG_SPMI=m
-CONFIG_HSI=m
-CONFIG_HSI_BOARDINFO=y
-
-#
-# HSI controllers
-#
-
-#
-# HSI clients
-#
-CONFIG_HSI_CHAR=m
-CONFIG_PPS=m
-# CONFIG_PPS_DEBUG is not set
-
-#
-# PPS clients support
-#
-CONFIG_PPS_CLIENT_KTIMER=m
-CONFIG_PPS_CLIENT_LDISC=m
-CONFIG_PPS_CLIENT_PARPORT=m
-CONFIG_PPS_CLIENT_GPIO=m
-CONFIG_PPS_GENERATOR=m
-CONFIG_PPS_GENERATOR_DUMMY=m
-
-#
-# PTP clock support
-#
-CONFIG_PTP_1588_CLOCK=m
-CONFIG_PTP_1588_CLOCK_OPTIONAL=m
-
-#
-# Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks.
-#
-CONFIG_PTP_1588_CLOCK_IDT82P33=m
-CONFIG_PTP_1588_CLOCK_IDTCM=m
-CONFIG_PTP_1588_CLOCK_FC3W=m
-CONFIG_PTP_1588_CLOCK_MOCK=m
-CONFIG_PTP_1588_CLOCK_OCP=m
-CONFIG_PTP_DFL_TOD=m
-CONFIG_PTP_NETC_V4_TIMER=m
-# end of PTP clock support
-
-#
-# DPLL device support
-#
-CONFIG_DPLL=y
-CONFIG_ZL3073X=m
-CONFIG_ZL3073X_I2C=m
-CONFIG_ZL3073X_SPI=m
-# end of DPLL device support
-
-CONFIG_PINCTRL=y
-CONFIG_GENERIC_PINCTRL_GROUPS=y
-CONFIG_PINMUX=y
-CONFIG_GENERIC_PINMUX_FUNCTIONS=y
-CONFIG_PINCONF=y
-CONFIG_GENERIC_PINCONF=y
-# CONFIG_DEBUG_PINCTRL is not set
-CONFIG_PINCTRL_AMD=y
-CONFIG_PINCTRL_AMDISP=m
-CONFIG_PINCTRL_AXP209=m
-CONFIG_PINCTRL_AW9523=m
-CONFIG_PINCTRL_CY8C95X0=m
-CONFIG_PINCTRL_DA9062=m
-CONFIG_PINCTRL_EIC7700=m
-CONFIG_PINCTRL_K230=y
-CONFIG_PINCTRL_MAX7360=m
-CONFIG_PINCTRL_MCP23S08_I2C=m
-CONFIG_PINCTRL_MCP23S08_SPI=m
-CONFIG_PINCTRL_MCP23S08=m
-CONFIG_PINCTRL_MICROCHIP_SGPIO=m
-CONFIG_PINCTRL_OCELOT=m
-CONFIG_PINCTRL_PEF2256=m
-CONFIG_PINCTRL_RK805=m
-CONFIG_PINCTRL_SINGLE=m
-CONFIG_PINCTRL_STMFX=m
-CONFIG_PINCTRL_TPS6594=m
-CONFIG_PINCTRL_TH1520=m
-CONFIG_PINCTRL_RP1=m
-CONFIG_PINCTRL_CS42L43=m
-CONFIG_PINCTRL_MADERA=m
-
-#
-# Renesas pinctrl drivers
-#
-CONFIG_PINCTRL_RENESAS=y
-# end of Renesas pinctrl drivers
-
-CONFIG_PINCTRL_SOPHGO_COMMON=m
-CONFIG_PINCTRL_SOPHGO_CV18XX_OPS=y
-CONFIG_PINCTRL_SOPHGO_CV1800B=m
-CONFIG_PINCTRL_SOPHGO_CV1812H=m
-CONFIG_PINCTRL_SOPHGO_SG2000=m
-CONFIG_PINCTRL_SOPHGO_SG2002=m
-CONFIG_PINCTRL_SOPHGO_SG2042_OPS=y
-CONFIG_PINCTRL_SOPHGO_SG2042=m
-CONFIG_PINCTRL_SOPHGO_SG2044=m
-CONFIG_PINCTRL_SPACEMIT_K1=y
-CONFIG_PINCTRL_STARFIVE_JH7100=m
-CONFIG_PINCTRL_STARFIVE_JH7110=y
-CONFIG_PINCTRL_STARFIVE_JH7110_SYS=m
-CONFIG_PINCTRL_STARFIVE_JH7110_AON=m
-CONFIG_PINCTRL_SUNXI=y
-CONFIG_PINCTRL_SUN4I_A10=y
-CONFIG_PINCTRL_SUN5I=y
-CONFIG_PINCTRL_SUN6I_A31=y
-CONFIG_PINCTRL_SUN6I_A31_R=y
-CONFIG_PINCTRL_SUN8I_A23=y
-CONFIG_PINCTRL_SUN8I_A33=y
-CONFIG_PINCTRL_SUN8I_A83T=y
-CONFIG_PINCTRL_SUN8I_A83T_R=y
-CONFIG_PINCTRL_SUN8I_A23_R=y
-CONFIG_PINCTRL_SUN8I_H3=y
-CONFIG_PINCTRL_SUN8I_H3_R=y
-CONFIG_PINCTRL_SUN8I_V3S=y
-CONFIG_PINCTRL_SUN9I_A80=y
-CONFIG_PINCTRL_SUN9I_A80_R=y
-CONFIG_PINCTRL_SUN20I_D1=y
-CONFIG_PINCTRL_SUN50I_A64=y
-CONFIG_PINCTRL_SUN50I_A64_R=y
-CONFIG_PINCTRL_SUN50I_A100=y
-CONFIG_PINCTRL_SUN50I_A100_R=y
-CONFIG_PINCTRL_SUN50I_H5=y
-CONFIG_PINCTRL_SUN50I_H6=y
-CONFIG_PINCTRL_SUN50I_H6_R=y
-CONFIG_PINCTRL_SUN50I_H616=y
-CONFIG_PINCTRL_SUN50I_H616_R=y
-CONFIG_PINCTRL_SUN55I_A523=y
-CONFIG_PINCTRL_SUN55I_A523_R=y
-CONFIG_GPIOLIB_LEGACY=y
-CONFIG_GPIOLIB=y
-CONFIG_GPIOLIB_FASTPATH_LIMIT=512
-CONFIG_OF_GPIO=y
-CONFIG_GPIO_ACPI=y
-CONFIG_GPIOLIB_IRQCHIP=y
-# CONFIG_DEBUG_GPIO is not set
-# CONFIG_GPIO_SYSFS is not set
-CONFIG_GPIO_CDEV=y
-CONFIG_GPIO_CDEV_V1=y
-CONFIG_GPIO_GENERIC=m
-CONFIG_GPIO_REGMAP=m
-CONFIG_GPIO_SWNODE_UNDEFINED=y
-CONFIG_GPIO_MAX730X=m
-CONFIG_GPIO_IDIO_16=m
-
-#
-# Memory mapped GPIO drivers
-#
-CONFIG_GPIO_74XX_MMIO=m
-CONFIG_GPIO_ALTERA=m
-CONFIG_GPIO_AMDPT=m
-CONFIG_GPIO_CADENCE=m
-CONFIG_GPIO_DWAPB=m
-CONFIG_GPIO_EXAR=m
-# CONFIG_GPIO_FTGPIO010 is not set
-CONFIG_GPIO_GENERIC_PLATFORM=m
-CONFIG_GPIO_GRGPIO=m
-CONFIG_GPIO_HLWD=m
-CONFIG_GPIO_LOGICVC=m
-CONFIG_GPIO_MB86S7X=m
-CONFIG_GPIO_MENZ127=m
-CONFIG_GPIO_PL061=m
-CONFIG_GPIO_POLARFIRE_SOC=y
-CONFIG_GPIO_RCAR=m
-CONFIG_GPIO_SIFIVE=m
-CONFIG_GPIO_SIOX=m
-CONFIG_GPIO_SPACEMIT_K1=m
-CONFIG_GPIO_SYSCON=m
-CONFIG_GPIO_WCD934X=m
-CONFIG_GPIO_XILINX=m
-CONFIG_GPIO_AMD_FCH=m
-# end of Memory mapped GPIO drivers
-
-#
-# I2C GPIO expanders
-#
-CONFIG_GPIO_ADNP=m
-CONFIG_GPIO_FXL6408=m
-CONFIG_GPIO_DS4520=m
-CONFIG_GPIO_GW_PLD=m
-CONFIG_GPIO_MAX7300=m
-CONFIG_GPIO_MAX732X=m
-CONFIG_GPIO_PCA953X=m
-# CONFIG_GPIO_PCA953X_IRQ is not set
-CONFIG_GPIO_PCA9570=m
-CONFIG_GPIO_PCF857X=m
-CONFIG_GPIO_TPIC2810=m
-# end of I2C GPIO expanders
-
-#
-# MFD GPIO expanders
-#
-CONFIG_GPIO_ADP5585=m
-CONFIG_GPIO_ARIZONA=m
-CONFIG_GPIO_BD9571MWV=m
-CONFIG_GPIO_DLN2=m
-CONFIG_GPIO_JANZ_TTL=m
-CONFIG_GPIO_KEMPLD=m
-CONFIG_GPIO_LJCA=m
-CONFIG_GPIO_LP3943=m
-CONFIG_GPIO_LP873X=m
-CONFIG_GPIO_LP87565=m
-CONFIG_GPIO_MADERA=m
-CONFIG_GPIO_MAX7360=m
-CONFIG_GPIO_MAX77650=m
-CONFIG_GPIO_MAX77759=m
-CONFIG_GPIO_NCT6694=m
-CONFIG_GPIO_TPS65086=m
-CONFIG_GPIO_TPS65218=m
-CONFIG_GPIO_TPS65219=m
-CONFIG_GPIO_TPS65912=m
-CONFIG_GPIO_TQMX86=m
-# end of MFD GPIO expanders
-
-#
-# PCI GPIO expanders
-#
-CONFIG_GPIO_PCI_IDIO_16=m
-CONFIG_GPIO_PCIE_IDIO_24=m
-CONFIG_GPIO_RDC321X=m
-# end of PCI GPIO expanders
-
-#
-# SPI GPIO expanders
-#
-CONFIG_GPIO_74X164=m
-CONFIG_GPIO_MAX3191X=m
-CONFIG_GPIO_MAX7301=m
-CONFIG_GPIO_MC33880=m
-CONFIG_GPIO_PISOSR=m
-CONFIG_GPIO_XRA1403=m
-CONFIG_GPIO_MOXTET=m
-# end of SPI GPIO expanders
-
-#
-# USB GPIO expanders
-#
-CONFIG_GPIO_VIPERBOARD=m
-CONFIG_GPIO_MPSSE=m
-# end of USB GPIO expanders
-
-#
-# Virtual GPIO drivers
-#
-CONFIG_GPIO_AGGREGATOR=m
-CONFIG_GPIO_LATCH=m
-CONFIG_GPIO_MOCKUP=m
-CONFIG_GPIO_VIRTIO=m
-CONFIG_GPIO_SIM=m
-# end of Virtual GPIO drivers
-
-#
-# GPIO Debugging utilities
-#
-CONFIG_GPIO_SLOPPY_LOGIC_ANALYZER=m
-CONFIG_GPIO_VIRTUSER=m
-# end of GPIO Debugging utilities
-
-CONFIG_DEV_SYNC_PROBE=m
-CONFIG_W1=m
-CONFIG_W1_CON=y
-
-#
-# 1-wire Bus Masters
-#
-CONFIG_W1_MASTER_AMD_AXI=m
-CONFIG_W1_MASTER_MATROX=m
-CONFIG_W1_MASTER_DS2490=m
-CONFIG_W1_MASTER_DS2482=m
-CONFIG_W1_MASTER_GPIO=m
-CONFIG_W1_MASTER_SGI=m
-CONFIG_W1_MASTER_UART=m
-# end of 1-wire Bus Masters
-
-#
-# 1-wire Slaves
-#
-CONFIG_W1_SLAVE_THERM=m
-CONFIG_W1_SLAVE_SMEM=m
-CONFIG_W1_SLAVE_DS2405=m
-CONFIG_W1_SLAVE_DS2408=m
-CONFIG_W1_SLAVE_DS2408_READBACK=y
-CONFIG_W1_SLAVE_DS2413=m
-CONFIG_W1_SLAVE_DS2406=m
-CONFIG_W1_SLAVE_DS2423=m
-CONFIG_W1_SLAVE_DS2805=m
-CONFIG_W1_SLAVE_DS2430=m
-CONFIG_W1_SLAVE_DS2431=m
-CONFIG_W1_SLAVE_DS2433=m
-# CONFIG_W1_SLAVE_DS2433_CRC is not set
-CONFIG_W1_SLAVE_DS2438=m
-CONFIG_W1_SLAVE_DS250X=m
-CONFIG_W1_SLAVE_DS2780=m
-CONFIG_W1_SLAVE_DS2781=m
-CONFIG_W1_SLAVE_DS28E04=m
-CONFIG_W1_SLAVE_DS28E17=m
-# end of 1-wire Slaves
-
-CONFIG_POWER_RESET=y
-CONFIG_POWER_RESET_ATC260X=m
-CONFIG_POWER_RESET_GPIO=y
-CONFIG_POWER_RESET_GPIO_RESTART=y
-CONFIG_POWER_RESET_LTC2952=y
-CONFIG_POWER_RESET_MT6323=y
-CONFIG_POWER_RESET_REGULATOR=y
-CONFIG_POWER_RESET_RESTART=y
-CONFIG_POWER_RESET_TH1520_AON=m
-# CONFIG_POWER_RESET_TPS65086 is not set
-CONFIG_POWER_RESET_SYSCON=y
-CONFIG_POWER_RESET_SYSCON_POWEROFF=y
-CONFIG_REBOOT_MODE=m
-CONFIG_SYSCON_REBOOT_MODE=m
-CONFIG_NVMEM_REBOOT_MODE=m
-CONFIG_POWER_SEQUENCING=m
-CONFIG_POWER_SEQUENCING_QCOM_WCN=m
-CONFIG_POWER_SEQUENCING_TH1520_GPU=m
-CONFIG_POWER_SUPPLY=y
-# CONFIG_POWER_SUPPLY_DEBUG is not set
-CONFIG_ADC_BATTERY_HELPER=m
-CONFIG_GENERIC_ADC_BATTERY=m
-CONFIG_IP5XXX_POWER=m
-CONFIG_TEST_POWER=m
-CONFIG_CHARGER_ADP5061=m
-CONFIG_BATTERY_ACT8945A=m
-CONFIG_BATTERY_CHAGALL=m
-CONFIG_BATTERY_CPCAP=m
-CONFIG_BATTERY_CW2015=m
-CONFIG_BATTERY_DS2760=m
-CONFIG_BATTERY_DS2780=m
-CONFIG_BATTERY_DS2781=m
-CONFIG_BATTERY_DS2782=m
-CONFIG_BATTERY_QCOM_BATTMGR=m
-# CONFIG_BATTERY_SAMSUNG_SDI is not set
-CONFIG_BATTERY_SBS=m
-CONFIG_CHARGER_SBS=m
-CONFIG_MANAGER_SBS=m
-CONFIG_BATTERY_BQ27XXX=m
-CONFIG_BATTERY_BQ27XXX_I2C=m
-CONFIG_BATTERY_BQ27XXX_HDQ=m
-# CONFIG_BATTERY_BQ27XXX_DT_UPDATES_NVM is not set
-CONFIG_CHARGER_DA9150=m
-CONFIG_BATTERY_DA9150=m
-CONFIG_CHARGER_AXP20X=m
-CONFIG_BATTERY_AXP20X=m
-CONFIG_AXP20X_POWER=m
-CONFIG_BATTERY_MAX17040=m
-CONFIG_BATTERY_MAX17042=m
-CONFIG_BATTERY_MAX1720X=m
-CONFIG_BATTERY_MAX1721X=m
-CONFIG_CHARGER_ISP1704=m
-CONFIG_CHARGER_MAX8903=m
-CONFIG_CHARGER_LP8727=m
-CONFIG_CHARGER_GPIO=m
-CONFIG_CHARGER_MANAGER=m
-CONFIG_CHARGER_LT3651=m
-CONFIG_CHARGER_LTC4162L=m
-CONFIG_CHARGER_MAX14577=m
-CONFIG_CHARGER_DETECTOR_MAX14656=m
-CONFIG_CHARGER_MAX77650=m
-CONFIG_CHARGER_MAX77693=m
-CONFIG_CHARGER_MAX77705=m
-CONFIG_CHARGER_MAX77976=m
-CONFIG_CHARGER_MAX8971=m
-CONFIG_CHARGER_MP2629=m
-CONFIG_CHARGER_MT6360=m
-CONFIG_CHARGER_MT6370=m
-CONFIG_CHARGER_BQ2415X=m
-CONFIG_CHARGER_BQ24190=m
-CONFIG_CHARGER_BQ24257=m
-CONFIG_CHARGER_BQ24735=m
-CONFIG_CHARGER_BQ2515X=m
-CONFIG_CHARGER_BQ257XX=m
-CONFIG_CHARGER_BQ25890=m
-CONFIG_CHARGER_BQ25980=m
-CONFIG_CHARGER_BQ256XX=m
-CONFIG_CHARGER_RK817=m
-CONFIG_CHARGER_SMB347=m
-CONFIG_CHARGER_TPS65217=m
-CONFIG_BATTERY_GAUGE_LTC2941=m
-CONFIG_BATTERY_GOLDFISH=m
-CONFIG_BATTERY_RT5033=m
-CONFIG_CHARGER_RT5033=m
-CONFIG_CHARGER_RT9455=m
-CONFIG_CHARGER_RT9467=m
-CONFIG_CHARGER_RT9471=m
-CONFIG_FUEL_GAUGE_STC3117=m
-CONFIG_CHARGER_UCS1002=m
-CONFIG_CHARGER_BD99954=m
-CONFIG_RN5T618_POWER=m
-CONFIG_BATTERY_UG3105=m
-CONFIG_FUEL_GAUGE_MM8013=m
-CONFIG_HWMON=m
-CONFIG_HWMON_VID=m
-# CONFIG_HWMON_DEBUG_CHIP is not set
-
-#
-# Native drivers
-#
-CONFIG_SENSORS_SMPRO=m
-CONFIG_SENSORS_AD7314=m
-CONFIG_SENSORS_AD7414=m
-CONFIG_SENSORS_AD7418=m
-CONFIG_SENSORS_ADM1025=m
-CONFIG_SENSORS_ADM1026=m
-CONFIG_SENSORS_ADM1029=m
-CONFIG_SENSORS_ADM1031=m
-CONFIG_SENSORS_ADM1177=m
-CONFIG_SENSORS_ADM9240=m
-CONFIG_SENSORS_ADT7X10=m
-CONFIG_SENSORS_ADT7310=m
-CONFIG_SENSORS_ADT7410=m
-CONFIG_SENSORS_ADT7411=m
-CONFIG_SENSORS_ADT7462=m
-CONFIG_SENSORS_ADT7470=m
-CONFIG_SENSORS_ADT7475=m
-CONFIG_SENSORS_AHT10=m
-CONFIG_SENSORS_AQUACOMPUTER_D5NEXT=m
-CONFIG_SENSORS_AS370=m
-CONFIG_SENSORS_ASC7621=m
-CONFIG_SENSORS_ASUS_ROG_RYUJIN=m
-CONFIG_SENSORS_AXI_FAN_CONTROL=m
-CONFIG_SENSORS_ATXP1=m
-CONFIG_SENSORS_CHIPCAP2=m
-CONFIG_SENSORS_CORSAIR_CPRO=m
-CONFIG_SENSORS_CORSAIR_PSU=m
-CONFIG_SENSORS_DRIVETEMP=m
-CONFIG_SENSORS_DS620=m
-CONFIG_SENSORS_DS1621=m
-CONFIG_SENSORS_I5K_AMB=m
-CONFIG_SENSORS_F71805F=m
-CONFIG_SENSORS_F71882FG=m
-CONFIG_SENSORS_F75375S=m
-CONFIG_SENSORS_GSC=m
-CONFIG_SENSORS_MC13783_ADC=m
-CONFIG_SENSORS_MC33XS2410=m
-CONFIG_SENSORS_FTSTEUTATES=m
-CONFIG_SENSORS_GIGABYTE_WATERFORCE=m
-CONFIG_SENSORS_GL518SM=m
-CONFIG_SENSORS_GL520SM=m
-CONFIG_SENSORS_G760A=m
-CONFIG_SENSORS_G762=m
-CONFIG_SENSORS_GPIO_FAN=m
-CONFIG_SENSORS_HIH6130=m
-CONFIG_SENSORS_HS3001=m
-CONFIG_SENSORS_HTU31=m
-CONFIG_SENSORS_IBMAEM=m
-CONFIG_SENSORS_IBMPEX=m
-CONFIG_SENSORS_IIO_HWMON=m
-CONFIG_SENSORS_ISL28022=m
-CONFIG_SENSORS_IT87=m
-CONFIG_SENSORS_JC42=m
-CONFIG_SENSORS_POWERZ=m
-CONFIG_SENSORS_POWR1220=m
-CONFIG_SENSORS_LINEAGE=m
-CONFIG_SENSORS_LTC2945=m
-CONFIG_SENSORS_LTC2947=m
-CONFIG_SENSORS_LTC2947_I2C=m
-CONFIG_SENSORS_LTC2947_SPI=m
-CONFIG_SENSORS_LTC2990=m
-CONFIG_SENSORS_LTC2991=m
-CONFIG_SENSORS_LTC2992=m
-CONFIG_SENSORS_LTC4151=m
-CONFIG_SENSORS_LTC4215=m
-CONFIG_SENSORS_LTC4222=m
-CONFIG_SENSORS_LTC4245=m
-CONFIG_SENSORS_LTC4260=m
-CONFIG_SENSORS_LTC4261=m
-CONFIG_SENSORS_LTC4282=m
-CONFIG_SENSORS_MAX1111=m
-CONFIG_SENSORS_MAX127=m
-CONFIG_SENSORS_MAX16065=m
-CONFIG_SENSORS_MAX1619=m
-CONFIG_SENSORS_MAX1668=m
-CONFIG_SENSORS_MAX197=m
-CONFIG_SENSORS_MAX31722=m
-CONFIG_SENSORS_MAX31730=m
-CONFIG_SENSORS_MAX31760=m
-CONFIG_MAX31827=m
-CONFIG_SENSORS_MAX6620=m
-CONFIG_SENSORS_MAX6621=m
-CONFIG_SENSORS_MAX6639=m
-CONFIG_SENSORS_MAX6650=m
-CONFIG_SENSORS_MAX6697=m
-CONFIG_SENSORS_MAX31790=m
-CONFIG_SENSORS_MAX77705=m
-CONFIG_SENSORS_MC34VR500=m
-CONFIG_SENSORS_MCP3021=m
-CONFIG_SENSORS_TC654=m
-CONFIG_SENSORS_TPS23861=m
-CONFIG_SENSORS_MENF21BMC_HWMON=m
-CONFIG_SENSORS_MR75203=m
-CONFIG_SENSORS_ADCXX=m
-CONFIG_SENSORS_LM63=m
-CONFIG_SENSORS_LM70=m
-CONFIG_SENSORS_LM73=m
-CONFIG_SENSORS_LM75=m
-CONFIG_SENSORS_LM77=m
-CONFIG_SENSORS_LM78=m
-CONFIG_SENSORS_LM80=m
-CONFIG_SENSORS_LM83=m
-CONFIG_SENSORS_LM85=m
-CONFIG_SENSORS_LM87=m
-CONFIG_SENSORS_LM90=m
-CONFIG_SENSORS_LM92=m
-CONFIG_SENSORS_LM93=m
-CONFIG_SENSORS_LM95234=m
-CONFIG_SENSORS_LM95241=m
-CONFIG_SENSORS_LM95245=m
-CONFIG_SENSORS_PC87360=m
-CONFIG_SENSORS_PC87427=m
-CONFIG_SENSORS_NTC_THERMISTOR=m
-CONFIG_SENSORS_NCT6683=m
-CONFIG_SENSORS_NCT6694=m
-CONFIG_SENSORS_NCT6775_CORE=m
-CONFIG_SENSORS_NCT6775=m
-CONFIG_SENSORS_NCT6775_I2C=m
-CONFIG_SENSORS_NCT7363=m
-CONFIG_SENSORS_NCT7802=m
-CONFIG_SENSORS_NCT7904=m
-CONFIG_SENSORS_NPCM7XX=m
-CONFIG_SENSORS_NZXT_KRAKEN2=m
-CONFIG_SENSORS_NZXT_KRAKEN3=m
-CONFIG_SENSORS_NZXT_SMART2=m
-CONFIG_SENSORS_OCC_P8_I2C=m
-CONFIG_SENSORS_OCC_P9_SBE=m
-CONFIG_SENSORS_OCC=m
-CONFIG_SENSORS_PCF8591=m
-CONFIG_SENSORS_PECI_CPUTEMP=m
-CONFIG_SENSORS_PECI_DIMMTEMP=m
-CONFIG_SENSORS_PECI=m
-CONFIG_PMBUS=m
-CONFIG_SENSORS_PMBUS=m
-CONFIG_SENSORS_ACBEL_FSG032=m
-CONFIG_SENSORS_ADM1266=m
-CONFIG_SENSORS_ADM1275=m
-CONFIG_SENSORS_ADP1050=m
-CONFIG_SENSORS_ADP1050_REGULATOR=y
-CONFIG_SENSORS_BEL_PFE=m
-CONFIG_SENSORS_BPA_RS600=m
-CONFIG_SENSORS_CRPS=m
-CONFIG_SENSORS_DELTA_AHE50DC_FAN=m
-CONFIG_SENSORS_FSP_3Y=m
-CONFIG_SENSORS_IBM_CFFPS=m
-CONFIG_SENSORS_DPS920AB=m
-CONFIG_SENSORS_INA233=m
-CONFIG_SENSORS_INSPUR_IPSPS=m
-CONFIG_SENSORS_IR35221=m
-CONFIG_SENSORS_IR36021=m
-CONFIG_SENSORS_IR38064=m
-# CONFIG_SENSORS_IR38064_REGULATOR is not set
-CONFIG_SENSORS_IRPS5401=m
-CONFIG_SENSORS_ISL68137=m
-CONFIG_SENSORS_LM25066=m
-# CONFIG_SENSORS_LM25066_REGULATOR is not set
-CONFIG_SENSORS_LT3074=m
-CONFIG_SENSORS_LT3074_REGULATOR=m
-CONFIG_SENSORS_LT7182S=m
-CONFIG_SENSORS_LTC2978=m
-# CONFIG_SENSORS_LTC2978_REGULATOR is not set
-CONFIG_SENSORS_LTC3815=m
-# CONFIG_SENSORS_LTC4286 is not set
-CONFIG_SENSORS_MAX15301=m
-CONFIG_SENSORS_MAX16064=m
-CONFIG_SENSORS_MAX16601=m
-CONFIG_SENSORS_MAX20730=m
-CONFIG_SENSORS_MAX20751=m
-CONFIG_SENSORS_MAX31785=m
-CONFIG_SENSORS_MAX34440=m
-CONFIG_SENSORS_MAX8688=m
-CONFIG_SENSORS_MP2856=m
-CONFIG_SENSORS_MP2869=m
-CONFIG_SENSORS_MP2888=m
-CONFIG_SENSORS_MP2891=m
-CONFIG_SENSORS_MP29502=m
-CONFIG_SENSORS_MP2975=m
-CONFIG_SENSORS_MP2993=m
-# CONFIG_SENSORS_MP2975_REGULATOR is not set
-CONFIG_SENSORS_MP5023=m
-CONFIG_SENSORS_MP5920=m
-CONFIG_SENSORS_MP5990=m
-CONFIG_SENSORS_MP9941=m
-# CONFIG_SENSORS_MPQ7932_REGULATOR is not set
-CONFIG_SENSORS_MPQ7932=m
-CONFIG_SENSORS_MPQ8785=m
-CONFIG_SENSORS_PIM4328=m
-CONFIG_SENSORS_PLI1209BC=m
-# CONFIG_SENSORS_PLI1209BC_REGULATOR is not set
-CONFIG_SENSORS_PM6764TR=m
-CONFIG_SENSORS_PXE1610=m
-CONFIG_SENSORS_Q54SJ108A2=m
-CONFIG_SENSORS_STPDDC60=m
-CONFIG_SENSORS_TDA38640=m
-# CONFIG_SENSORS_TDA38640_REGULATOR is not set
-CONFIG_SENSORS_TPS25990=m
-CONFIG_SENSORS_TPS25990_REGULATOR=y
-CONFIG_SENSORS_TPS40422=m
-CONFIG_SENSORS_TPS53679=m
-CONFIG_SENSORS_TPS546D24=m
-CONFIG_SENSORS_UCD9000=m
-CONFIG_SENSORS_UCD9200=m
-CONFIG_SENSORS_XDP710=m
-CONFIG_SENSORS_XDPE152=m
-CONFIG_SENSORS_XDPE122=m
-# CONFIG_SENSORS_XDPE122_REGULATOR is not set
-CONFIG_SENSORS_ZL6100=m
-CONFIG_SENSORS_PT5161L=m
-CONFIG_SENSORS_PWM_FAN=m
-CONFIG_SENSORS_QNAP_MCU_HWMON=m
-CONFIG_SENSORS_SBTSI=m
-CONFIG_SENSORS_SHT15=m
-CONFIG_SENSORS_SHT21=m
-CONFIG_SENSORS_SHT3x=m
-CONFIG_SENSORS_SHT4x=m
-CONFIG_SENSORS_SHTC1=m
-CONFIG_SENSORS_SIS5595=m
-CONFIG_SENSORS_SY7636A=m
-CONFIG_SENSORS_DME1737=m
-CONFIG_SENSORS_EMC1403=m
-CONFIG_SENSORS_EMC2103=m
-CONFIG_SENSORS_EMC2305=m
-CONFIG_SENSORS_EMC6W201=m
-CONFIG_SENSORS_SMSC47M1=m
-CONFIG_SENSORS_SMSC47M192=m
-CONFIG_SENSORS_SMSC47B397=m
-CONFIG_SENSORS_SCH56XX_COMMON=m
-CONFIG_SENSORS_SCH5627=m
-CONFIG_SENSORS_SCH5636=m
-CONFIG_SENSORS_STTS751=m
-CONFIG_SENSORS_SFCTEMP=m
-CONFIG_SENSORS_SG2042_MCU=m
-CONFIG_SENSORS_ADC128D818=m
-CONFIG_SENSORS_ADS7828=m
-CONFIG_SENSORS_ADS7871=m
-CONFIG_SENSORS_AMC6821=m
-CONFIG_SENSORS_INA209=m
-CONFIG_SENSORS_INA2XX=m
-CONFIG_SENSORS_INA238=m
-CONFIG_SENSORS_INA3221=m
-CONFIG_SENSORS_SPD5118=m
-# CONFIG_SENSORS_SPD5118_DETECT is not set
-CONFIG_SENSORS_TC74=m
-CONFIG_SENSORS_THMC50=m
-CONFIG_SENSORS_TMP102=m
-CONFIG_SENSORS_TMP103=m
-CONFIG_SENSORS_TMP108=m
-CONFIG_SENSORS_TMP401=m
-CONFIG_SENSORS_TMP421=m
-CONFIG_SENSORS_TMP464=m
-CONFIG_SENSORS_TMP513=m
-CONFIG_SENSORS_VIA686A=m
-CONFIG_SENSORS_VT1211=m
-CONFIG_SENSORS_VT8231=m
-CONFIG_SENSORS_W83773G=m
-CONFIG_SENSORS_W83781D=m
-CONFIG_SENSORS_W83791D=m
-CONFIG_SENSORS_W83792D=m
-CONFIG_SENSORS_W83793=m
-CONFIG_SENSORS_W83795=m
-# CONFIG_SENSORS_W83795_FANCTRL is not set
-CONFIG_SENSORS_W83L785TS=m
-CONFIG_SENSORS_W83L786NG=m
-CONFIG_SENSORS_W83627HF=m
-CONFIG_SENSORS_W83627EHF=m
-CONFIG_SENSORS_XGENE=m
-CONFIG_SENSORS_INTEL_M10_BMC_HWMON=m
-
-#
-# ACPI drivers
-#
-CONFIG_SENSORS_ACPI_POWER=m
-CONFIG_THERMAL=y
-CONFIG_THERMAL_NETLINK=y
-# CONFIG_THERMAL_STATISTICS is not set
-# CONFIG_THERMAL_DEBUGFS is not set
-CONFIG_THERMAL_CORE_TESTING=m
-CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0
-CONFIG_THERMAL_OF=y
-CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y
-# CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set
-# CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set
-# CONFIG_THERMAL_DEFAULT_GOV_BANG_BANG is not set
-# CONFIG_THERMAL_GOV_FAIR_SHARE is not set
-CONFIG_THERMAL_GOV_STEP_WISE=y
-CONFIG_THERMAL_GOV_BANG_BANG=y
-CONFIG_THERMAL_GOV_USER_SPACE=y
-# CONFIG_THERMAL_GOV_POWER_ALLOCATOR is not set
-# CONFIG_CPU_THERMAL is not set
-# CONFIG_DEVFREQ_THERMAL is not set
-CONFIG_PCIE_THERMAL=y
-# CONFIG_THERMAL_EMULATION is not set
-CONFIG_THERMAL_MMIO=m
-CONFIG_SUN8I_THERMAL=m
-CONFIG_DA9062_THERMAL=m
-CONFIG_RCAR_THERMAL=m
-CONFIG_RCAR_GEN3_THERMAL=m
-CONFIG_RZG2L_THERMAL=m
-CONFIG_RZG3E_THERMAL=m
-CONFIG_GENERIC_ADC_THERMAL=m
-CONFIG_WATCHDOG=y
-CONFIG_WATCHDOG_CORE=m
-# CONFIG_WATCHDOG_NOWAYOUT is not set
-CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED=y
-CONFIG_WATCHDOG_OPEN_TIMEOUT=0
-CONFIG_WATCHDOG_SYSFS=y
-# CONFIG_WATCHDOG_HRTIMER_PRETIMEOUT is not set
-
-#
-# Watchdog Pretimeout Governors
-#
-# CONFIG_WATCHDOG_PRETIMEOUT_GOV is not set
-
-#
-# Watchdog Device Drivers
-#
-CONFIG_SOFT_WATCHDOG=m
-CONFIG_DA9063_WATCHDOG=m
-CONFIG_DA9062_WATCHDOG=m
-CONFIG_GPIO_WATCHDOG=m
-CONFIG_MENF21BMC_WATCHDOG=m
-CONFIG_MENZ069_WATCHDOG=m
-CONFIG_WDAT_WDT=m
-CONFIG_XILINX_WATCHDOG=m
-CONFIG_ZIIRAVE_WATCHDOG=m
-CONFIG_RAVE_SP_WATCHDOG=m
-CONFIG_CADENCE_WATCHDOG=m
-CONFIG_DW_WATCHDOG=m
-CONFIG_RN5T618_WATCHDOG=m
-CONFIG_SUNXI_WATCHDOG=m
-CONFIG_MAX63XX_WATCHDOG=m
-CONFIG_MAX77620_WATCHDOG=m
-CONFIG_NCT6694_WATCHDOG=m
-CONFIG_RETU_WATCHDOG=m
-CONFIG_RENESAS_WDT=m
-CONFIG_RENESAS_RZAWDT=m
-CONFIG_RENESAS_RZN1WDT=m
-CONFIG_RENESAS_RZV2HWDT=m
-CONFIG_ALIM7101_WDT=m
-CONFIG_I6300ESB_WDT=m
-CONFIG_KEMPLD_WDT=m
-CONFIG_NIC7018_WDT=m
-CONFIG_MEN_A21_WDT=m
-CONFIG_STARFIVE_WATCHDOG=m
-
-#
-# PCI-based Watchdog Cards
-#
-CONFIG_PCIPCWATCHDOG=m
-CONFIG_WDTPCI=m
-
-#
-# USB-based Watchdog Cards
-#
-CONFIG_USBPCWATCHDOG=m
-CONFIG_SSB_POSSIBLE=y
-CONFIG_SSB=m
-CONFIG_SSB_SPROM=y
-CONFIG_SSB_BLOCKIO=y
-CONFIG_SSB_PCIHOST_POSSIBLE=y
-CONFIG_SSB_PCIHOST=y
-CONFIG_SSB_B43_PCI_BRIDGE=y
-CONFIG_SSB_PCMCIAHOST_POSSIBLE=y
-# CONFIG_SSB_PCMCIAHOST is not set
-CONFIG_SSB_SDIOHOST_POSSIBLE=y
-# CONFIG_SSB_SDIOHOST is not set
-CONFIG_SSB_DRIVER_PCICORE_POSSIBLE=y
-CONFIG_SSB_DRIVER_PCICORE=y
-# CONFIG_SSB_DRIVER_GPIO is not set
-CONFIG_BCMA_POSSIBLE=y
-CONFIG_BCMA=m
-CONFIG_BCMA_BLOCKIO=y
-CONFIG_BCMA_HOST_PCI_POSSIBLE=y
-CONFIG_BCMA_HOST_PCI=y
-# CONFIG_BCMA_HOST_SOC is not set
-CONFIG_BCMA_DRIVER_PCI=y
-# CONFIG_BCMA_DRIVER_GMAC_CMN is not set
-# CONFIG_BCMA_DRIVER_GPIO is not set
-# CONFIG_BCMA_DEBUG is not set
-
-#
-# Multifunction device drivers
-#
-CONFIG_MFD_CORE=y
-CONFIG_MFD_ADP5585=m
-CONFIG_MFD_ACT8945A=m
-CONFIG_MFD_SUN4I_GPADC=m
-CONFIG_MFD_SMPRO=m
-CONFIG_MFD_AT91_USART=y
-CONFIG_MFD_ATMEL_FLEXCOM=m
-CONFIG_MFD_ATMEL_HLCDC=m
-CONFIG_MFD_BCM590XX=m
-CONFIG_MFD_BD9571MWV=m
-CONFIG_MFD_AC100=m
-CONFIG_MFD_AXP20X=m
-CONFIG_MFD_AXP20X_I2C=m
-CONFIG_MFD_AXP20X_RSB=m
-CONFIG_MFD_CS40L50_CORE=m
-CONFIG_MFD_CS40L50_I2C=m
-CONFIG_MFD_CS40L50_SPI=m
-CONFIG_MFD_CS42L43=m
-CONFIG_MFD_CS42L43_I2C=m
-CONFIG_MFD_CS42L43_SDW=m
-CONFIG_MFD_MADERA=m
-CONFIG_MFD_MADERA_I2C=m
-CONFIG_MFD_MADERA_SPI=m
-# CONFIG_MFD_CS47L15 is not set
-# CONFIG_MFD_CS47L35 is not set
-# CONFIG_MFD_CS47L85 is not set
-# CONFIG_MFD_CS47L90 is not set
-# CONFIG_MFD_CS47L92 is not set
-# CONFIG_MFD_DA9052_SPI is not set
-CONFIG_MFD_DA9062=m
-CONFIG_MFD_DA9063=m
-CONFIG_MFD_DA9150=m
-CONFIG_MFD_DLN2=m
-CONFIG_MFD_GATEWORKS_GSC=m
-CONFIG_MFD_MC13XXX=m
-CONFIG_MFD_MC13XXX_SPI=m
-CONFIG_MFD_MC13XXX_I2C=m
-CONFIG_MFD_MP2629=m
-CONFIG_MFD_HI6421_PMIC=m
-CONFIG_MFD_HI6421_SPMI=m
-CONFIG_LPC_ICH=m
-CONFIG_LPC_SCH=m
-CONFIG_MFD_IQS62X=m
-CONFIG_MFD_JANZ_CMODIO=m
-CONFIG_MFD_KEMPLD=m
-CONFIG_MFD_88PM800=m
-CONFIG_MFD_88PM805=m
-CONFIG_MFD_MAX5970=m
-CONFIG_MFD_MAX14577=m
-CONFIG_MFD_MAX77650=m
-CONFIG_MFD_MAX77686=m
-CONFIG_MFD_MAX77693=m
-CONFIG_MFD_MAX77705=m
-CONFIG_MFD_MAX77714=m
-CONFIG_MFD_MAX77759=m
-CONFIG_MFD_MAX8907=m
-CONFIG_MFD_MT6360=m
-CONFIG_MFD_MT6370=m
-CONFIG_MFD_MT6397=m
-CONFIG_MFD_MENF21BMC=m
-CONFIG_MFD_NCT6694=m
-CONFIG_MFD_OCELOT=m
-# CONFIG_EZX_PCAP is not set
-CONFIG_MFD_CPCAP=m
-CONFIG_MFD_VIPERBOARD=m
-CONFIG_MFD_NTXEC=m
-CONFIG_MFD_RETU=m
-CONFIG_MFD_SPACEMIT_P1=m
-CONFIG_MFD_SY7636A=m
-CONFIG_MFD_RDC321X=m
-CONFIG_MFD_RT4831=m
-CONFIG_MFD_RT5033=m
-CONFIG_MFD_RT5120=m
-CONFIG_MFD_RK8XX=m
-CONFIG_MFD_RK8XX_I2C=m
-CONFIG_MFD_RK8XX_SPI=m
-CONFIG_MFD_RN5T618=m
-CONFIG_MFD_SI476X_CORE=m
-CONFIG_MFD_SIMPLE_MFD_I2C=m
-CONFIG_MFD_SM501=m
-# CONFIG_MFD_SM501_GPIO is not set
-CONFIG_MFD_SKY81452=m
-# CONFIG_MFD_STMPE is not set
-CONFIG_MFD_SUN6I_PRCM=y
-CONFIG_MFD_SYSCON=y
-CONFIG_MFD_LP3943=m
-CONFIG_MFD_TI_LMU=m
-CONFIG_MFD_BQ257XX=m
-CONFIG_TPS6105X=m
-CONFIG_TPS65010=m
-CONFIG_TPS6507X=m
-CONFIG_MFD_TPS65086=m
-CONFIG_MFD_TPS65217=m
-CONFIG_MFD_TI_LP873X=m
-CONFIG_MFD_TI_LP87565=m
-CONFIG_MFD_TPS65218=m
-CONFIG_MFD_TPS65219=m
-CONFIG_MFD_TPS65912=m
-CONFIG_MFD_TPS65912_I2C=m
-CONFIG_MFD_TPS65912_SPI=m
-CONFIG_MFD_TPS6594=m
-CONFIG_MFD_TPS6594_I2C=m
-CONFIG_MFD_TPS6594_SPI=m
-CONFIG_MFD_WL1273_CORE=m
-CONFIG_MFD_LM3533=m
-CONFIG_MFD_TQMX86=m
-CONFIG_MFD_VX855=m
-CONFIG_MFD_ARIZONA=m
-CONFIG_MFD_ARIZONA_I2C=m
-CONFIG_MFD_ARIZONA_SPI=m
-# CONFIG_MFD_CS47L24 is not set
-# CONFIG_MFD_WM5102 is not set
-# CONFIG_MFD_WM5110 is not set
-# CONFIG_MFD_WM8997 is not set
-# CONFIG_MFD_WM8998 is not set
-# CONFIG_MFD_WM831X_SPI is not set
-# CONFIG_MFD_WM8994 is not set
-CONFIG_MFD_STMFX=m
-CONFIG_MFD_WCD934X=m
-CONFIG_MFD_ATC260X=m
-CONFIG_MFD_ATC260X_I2C=m
-CONFIG_MFD_QCOM_PM8008=m
-CONFIG_RAVE_SP_CORE=m
-CONFIG_MFD_INTEL_M10_BMC_CORE=m
-CONFIG_MFD_INTEL_M10_BMC_SPI=m
-CONFIG_MFD_INTEL_M10_BMC_PMCI=m
-CONFIG_MFD_LS2K_BMC_CORE=y
-CONFIG_MFD_QNAP_MCU=m
-CONFIG_MFD_RSMU_I2C=m
-CONFIG_MFD_RSMU_SPI=m
-CONFIG_MFD_MAX7360=m
-# end of Multifunction device drivers
-
-CONFIG_REGULATOR=y
-# CONFIG_REGULATOR_DEBUG is not set
-CONFIG_REGULATOR_FIXED_VOLTAGE=m
-CONFIG_REGULATOR_VIRTUAL_CONSUMER=m
-CONFIG_REGULATOR_USERSPACE_CONSUMER=m
-# CONFIG_REGULATOR_NETLINK_EVENTS is not set
-CONFIG_REGULATOR_88PG86X=m
-CONFIG_REGULATOR_88PM800=m
-CONFIG_REGULATOR_ACT8865=m
-CONFIG_REGULATOR_ACT8945A=m
-CONFIG_REGULATOR_AD5398=m
-CONFIG_REGULATOR_ADP5055=m
-CONFIG_REGULATOR_ARIZONA_LDO1=m
-CONFIG_REGULATOR_ARIZONA_MICSUPP=m
-CONFIG_REGULATOR_ATC260X=m
-CONFIG_REGULATOR_AW37503=m
-CONFIG_REGULATOR_AXP20X=m
-CONFIG_REGULATOR_BCM590XX=m
-CONFIG_REGULATOR_BD9571MWV=m
-CONFIG_REGULATOR_BQ257XX=m
-CONFIG_REGULATOR_CPCAP=m
-CONFIG_REGULATOR_DA9062=m
-CONFIG_REGULATOR_DA9063=m
-CONFIG_REGULATOR_DA9121=m
-CONFIG_REGULATOR_DA9210=m
-CONFIG_REGULATOR_DA9211=m
-CONFIG_REGULATOR_FAN53555=m
-CONFIG_REGULATOR_FAN53880=m
-CONFIG_REGULATOR_GPIO=m
-CONFIG_REGULATOR_HI6421=m
-CONFIG_REGULATOR_HI6421V530=m
-CONFIG_REGULATOR_HI6421V600=m
-CONFIG_REGULATOR_ISL9305=m
-CONFIG_REGULATOR_ISL6271A=m
-CONFIG_REGULATOR_LM363X=m
-CONFIG_REGULATOR_LP3971=m
-CONFIG_REGULATOR_LP3972=m
-CONFIG_REGULATOR_LP872X=m
-CONFIG_REGULATOR_LP873X=m
-CONFIG_REGULATOR_LP8755=m
-CONFIG_REGULATOR_LP87565=m
-CONFIG_REGULATOR_LTC3589=m
-CONFIG_REGULATOR_LTC3676=m
-CONFIG_REGULATOR_MAX14577=m
-CONFIG_REGULATOR_MAX1586=m
-CONFIG_REGULATOR_MAX5970=m
-CONFIG_REGULATOR_MAX77503=m
-CONFIG_REGULATOR_MAX77650=m
-CONFIG_REGULATOR_MAX77857=m
-CONFIG_REGULATOR_MAX8649=m
-CONFIG_REGULATOR_MAX8660=m
-CONFIG_REGULATOR_MAX8893=m
-CONFIG_REGULATOR_MAX8907=m
-CONFIG_REGULATOR_MAX8952=m
-CONFIG_REGULATOR_MAX8973=m
-CONFIG_REGULATOR_MAX20086=m
-CONFIG_REGULATOR_MAX20411=m
-CONFIG_REGULATOR_MAX77686=m
-CONFIG_REGULATOR_MAX77693=m
-CONFIG_REGULATOR_MAX77802=m
-CONFIG_REGULATOR_MAX77826=m
-CONFIG_REGULATOR_MAX77838=m
-CONFIG_REGULATOR_MC13XXX_CORE=m
-CONFIG_REGULATOR_MC13783=m
-CONFIG_REGULATOR_MC13892=m
-CONFIG_REGULATOR_MCP16502=m
-CONFIG_REGULATOR_MP5416=m
-CONFIG_REGULATOR_MP8859=m
-CONFIG_REGULATOR_MP886X=m
-CONFIG_REGULATOR_MPQ7920=m
-CONFIG_REGULATOR_MT6311=m
-CONFIG_REGULATOR_MT6315=m
-CONFIG_REGULATOR_MT6323=m
-CONFIG_REGULATOR_MT6331=m
-CONFIG_REGULATOR_MT6332=m
-CONFIG_REGULATOR_MT6357=m
-CONFIG_REGULATOR_MT6358=m
-CONFIG_REGULATOR_MT6359=m
-CONFIG_REGULATOR_MT6360=m
-CONFIG_REGULATOR_MT6370=m
-CONFIG_REGULATOR_MT6397=m
-CONFIG_REGULATOR_PCA9450=m
-CONFIG_REGULATOR_PF9453=m
-CONFIG_REGULATOR_PF0900=m
-CONFIG_REGULATOR_PF530X=m
-CONFIG_REGULATOR_PF8X00=m
-CONFIG_REGULATOR_PFUZE100=m
-CONFIG_REGULATOR_PV88060=m
-CONFIG_REGULATOR_PV88080=m
-CONFIG_REGULATOR_PV88090=m
-CONFIG_REGULATOR_PWM=m
-CONFIG_REGULATOR_QCOM_PM8008=m
-CONFIG_REGULATOR_QCOM_SPMI=m
-CONFIG_REGULATOR_QCOM_USB_VBUS=m
-CONFIG_REGULATOR_RAA215300=m
-CONFIG_REGULATOR_RASPBERRYPI_TOUCHSCREEN_ATTINY=m
-CONFIG_REGULATOR_RASPBERRYPI_TOUCHSCREEN_V2=m
-CONFIG_REGULATOR_RK808=m
-CONFIG_REGULATOR_RN5T618=m
-CONFIG_REGULATOR_RT4801=m
-CONFIG_REGULATOR_RT4803=m
-CONFIG_REGULATOR_RT4831=m
-CONFIG_REGULATOR_RT5033=m
-CONFIG_REGULATOR_RT5120=m
-CONFIG_REGULATOR_RT5133=m
-CONFIG_REGULATOR_RT5190A=m
-CONFIG_REGULATOR_RT5739=m
-CONFIG_REGULATOR_RT5759=m
-CONFIG_REGULATOR_RT6160=m
-CONFIG_REGULATOR_RT6190=m
-CONFIG_REGULATOR_RT6245=m
-CONFIG_REGULATOR_RTQ2134=m
-CONFIG_REGULATOR_RTMV20=m
-CONFIG_REGULATOR_RTQ6752=m
-CONFIG_REGULATOR_RTQ2208=m
-CONFIG_REGULATOR_SKY81452=m
-CONFIG_REGULATOR_SLG51000=m
-CONFIG_REGULATOR_SPACEMIT_P1=m
-CONFIG_REGULATOR_SUN20I=m
-CONFIG_REGULATOR_SY7636A=m
-CONFIG_REGULATOR_SY8106A=m
-CONFIG_REGULATOR_SY8824X=m
-CONFIG_REGULATOR_SY8827N=m
-CONFIG_REGULATOR_TPS51632=m
-CONFIG_REGULATOR_TPS6105X=m
-CONFIG_REGULATOR_TPS62360=m
-CONFIG_REGULATOR_TPS6286X=m
-CONFIG_REGULATOR_TPS6287X=m
-CONFIG_REGULATOR_TPS65023=m
-CONFIG_REGULATOR_TPS6507X=m
-CONFIG_REGULATOR_TPS65086=m
-CONFIG_REGULATOR_TPS65132=m
-CONFIG_REGULATOR_TPS65217=m
-CONFIG_REGULATOR_TPS65218=m
-CONFIG_REGULATOR_TPS65219=m
-CONFIG_REGULATOR_TPS6594=m
-CONFIG_REGULATOR_TPS6524X=m
-CONFIG_REGULATOR_TPS65912=m
-CONFIG_REGULATOR_VCTRL=m
-CONFIG_REGULATOR_QCOM_LABIBB=m
-CONFIG_RC_CORE=m
-CONFIG_LIRC=y
-CONFIG_RC_MAP=m
-CONFIG_RC_DECODERS=y
-CONFIG_IR_IMON_DECODER=m
-CONFIG_IR_JVC_DECODER=m
-CONFIG_IR_MCE_KBD_DECODER=m
-CONFIG_IR_NEC_DECODER=m
-CONFIG_IR_RC5_DECODER=m
-CONFIG_IR_RC6_DECODER=m
-CONFIG_IR_RCMM_DECODER=m
-CONFIG_IR_SANYO_DECODER=m
-CONFIG_IR_SHARP_DECODER=m
-CONFIG_IR_SONY_DECODER=m
-CONFIG_IR_XMP_DECODER=m
-CONFIG_RC_DEVICES=y
-CONFIG_IR_ENE=m
-CONFIG_IR_FINTEK=m
-CONFIG_IR_GPIO_CIR=m
-CONFIG_IR_GPIO_TX=m
-CONFIG_IR_HIX5HD2=m
-CONFIG_IR_IGORPLUGUSB=m
-CONFIG_IR_IGUANA=m
-CONFIG_IR_IMON=m
-CONFIG_IR_IMON_RAW=m
-CONFIG_IR_ITE_CIR=m
-CONFIG_IR_MCEUSB=m
-CONFIG_IR_NUVOTON=m
-CONFIG_IR_PWM_TX=m
-CONFIG_IR_REDRAT3=m
-CONFIG_IR_SERIAL=m
-# CONFIG_IR_SERIAL_TRANSMITTER is not set
-CONFIG_IR_SPI=m
-CONFIG_IR_STREAMZAP=m
-CONFIG_IR_SUNXI=m
-CONFIG_IR_TOY=m
-CONFIG_IR_TTUSBIR=m
-CONFIG_RC_ATI_REMOTE=m
-CONFIG_RC_LOOPBACK=m
-CONFIG_RC_XBOX_DVD=m
-CONFIG_CEC_CORE=m
-CONFIG_CEC_NOTIFIER=y
-
-#
-# CEC support
-#
-CONFIG_MEDIA_CEC_RC=y
-# CONFIG_MEDIA_CEC_SUPPORT is not set
-# end of CEC support
-
-CONFIG_MEDIA_SUPPORT=m
-# CONFIG_MEDIA_SUPPORT_FILTER is not set
-# CONFIG_MEDIA_SUBDRV_AUTOSELECT is not set
-
-#
-# Media device types
-#
-CONFIG_MEDIA_CAMERA_SUPPORT=y
-CONFIG_MEDIA_ANALOG_TV_SUPPORT=y
-CONFIG_MEDIA_DIGITAL_TV_SUPPORT=y
-CONFIG_MEDIA_RADIO_SUPPORT=y
-CONFIG_MEDIA_SDR_SUPPORT=y
-CONFIG_MEDIA_PLATFORM_SUPPORT=y
-CONFIG_MEDIA_TEST_SUPPORT=y
-# end of Media device types
-
-#
-# Media core support
-#
-CONFIG_VIDEO_DEV=m
-CONFIG_MEDIA_CONTROLLER=y
-CONFIG_DVB_CORE=m
-# end of Media core support
-
-#
-# Video4Linux options
-#
-CONFIG_VIDEO_V4L2_I2C=y
-CONFIG_VIDEO_V4L2_SUBDEV_API=y
-# CONFIG_VIDEO_ADV_DEBUG is not set
-# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set
-CONFIG_VIDEO_TUNER=m
-CONFIG_V4L2_MEM2MEM_DEV=m
-CONFIG_V4L2_FLASH_LED_CLASS=m
-CONFIG_V4L2_FWNODE=m
-CONFIG_V4L2_ASYNC=m
-CONFIG_V4L2_CCI=m
-CONFIG_V4L2_CCI_I2C=m
-# end of Video4Linux options
-
-#
-# Media controller options
-#
-CONFIG_MEDIA_CONTROLLER_DVB=y
-# end of Media controller options
-
-#
-# Digital TV options
-#
-# CONFIG_DVB_MMAP is not set
-CONFIG_DVB_NET=y
-CONFIG_DVB_MAX_ADAPTERS=16
-CONFIG_DVB_DYNAMIC_MINORS=y
-# CONFIG_DVB_DEMUX_SECTION_LOSS_LOG is not set
-# CONFIG_DVB_ULE_DEBUG is not set
-# end of Digital TV options
-
-#
-# Media drivers
-#
-
-#
-# Media drivers
-#
-CONFIG_MEDIA_USB_SUPPORT=y
-
-#
-# Webcam devices
-#
-CONFIG_USB_GSPCA=m
-CONFIG_USB_GSPCA_BENQ=m
-CONFIG_USB_GSPCA_CONEX=m
-CONFIG_USB_GSPCA_CPIA1=m
-CONFIG_USB_GSPCA_DTCS033=m
-CONFIG_USB_GSPCA_ETOMS=m
-CONFIG_USB_GSPCA_FINEPIX=m
-CONFIG_USB_GSPCA_JEILINJ=m
-CONFIG_USB_GSPCA_JL2005BCD=m
-CONFIG_USB_GSPCA_KINECT=m
-CONFIG_USB_GSPCA_KONICA=m
-CONFIG_USB_GSPCA_MARS=m
-CONFIG_USB_GSPCA_MR97310A=m
-CONFIG_USB_GSPCA_NW80X=m
-CONFIG_USB_GSPCA_OV519=m
-CONFIG_USB_GSPCA_OV534=m
-CONFIG_USB_GSPCA_OV534_9=m
-CONFIG_USB_GSPCA_PAC207=m
-CONFIG_USB_GSPCA_PAC7302=m
-CONFIG_USB_GSPCA_PAC7311=m
-CONFIG_USB_GSPCA_SE401=m
-CONFIG_USB_GSPCA_SN9C2028=m
-CONFIG_USB_GSPCA_SN9C20X=m
-CONFIG_USB_GSPCA_SONIXB=m
-CONFIG_USB_GSPCA_SONIXJ=m
-CONFIG_USB_GSPCA_SPCA1528=m
-CONFIG_USB_GSPCA_SPCA500=m
-CONFIG_USB_GSPCA_SPCA501=m
-CONFIG_USB_GSPCA_SPCA505=m
-CONFIG_USB_GSPCA_SPCA506=m
-CONFIG_USB_GSPCA_SPCA508=m
-CONFIG_USB_GSPCA_SPCA561=m
-CONFIG_USB_GSPCA_SQ905=m
-CONFIG_USB_GSPCA_SQ905C=m
-CONFIG_USB_GSPCA_SQ930X=m
-CONFIG_USB_GSPCA_STK014=m
-CONFIG_USB_GSPCA_STK1135=m
-CONFIG_USB_GSPCA_STV0680=m
-CONFIG_USB_GSPCA_SUNPLUS=m
-CONFIG_USB_GSPCA_T613=m
-CONFIG_USB_GSPCA_TOPRO=m
-CONFIG_USB_GSPCA_TOUPTEK=m
-CONFIG_USB_GSPCA_TV8532=m
-CONFIG_USB_GSPCA_VC032X=m
-CONFIG_USB_GSPCA_VICAM=m
-CONFIG_USB_GSPCA_XIRLINK_CIT=m
-CONFIG_USB_GSPCA_ZC3XX=m
-CONFIG_USB_GL860=m
-CONFIG_USB_M5602=m
-CONFIG_USB_STV06XX=m
-CONFIG_USB_PWC=m
-# CONFIG_USB_PWC_DEBUG is not set
-CONFIG_USB_PWC_INPUT_EVDEV=y
-CONFIG_USB_S2255=m
-CONFIG_VIDEO_USBTV=m
-CONFIG_USB_VIDEO_CLASS=m
-CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y
-
-#
-# Analog TV USB devices
-#
-CONFIG_VIDEO_GO7007=m
-CONFIG_VIDEO_GO7007_USB=m
-CONFIG_VIDEO_GO7007_LOADER=m
-CONFIG_VIDEO_GO7007_USB_S2250_BOARD=m
-CONFIG_VIDEO_HDPVR=m
-CONFIG_VIDEO_PVRUSB2=m
-CONFIG_VIDEO_PVRUSB2_SYSFS=y
-CONFIG_VIDEO_PVRUSB2_DVB=y
-# CONFIG_VIDEO_PVRUSB2_DEBUGIFC is not set
-CONFIG_VIDEO_STK1160=m
-
-#
-# Analog/digital TV USB devices
-#
-CONFIG_VIDEO_AU0828=m
-CONFIG_VIDEO_AU0828_V4L2=y
-# CONFIG_VIDEO_AU0828_RC is not set
-CONFIG_VIDEO_CX231XX=m
-CONFIG_VIDEO_CX231XX_RC=y
-CONFIG_VIDEO_CX231XX_ALSA=m
-CONFIG_VIDEO_CX231XX_DVB=m
-
-#
-# Digital TV USB devices
-#
-CONFIG_DVB_AS102=m
-CONFIG_DVB_B2C2_FLEXCOP_USB=m
-# CONFIG_DVB_B2C2_FLEXCOP_USB_DEBUG is not set
-CONFIG_DVB_USB_V2=m
-CONFIG_DVB_USB_AF9015=m
-CONFIG_DVB_USB_AF9035=m
-CONFIG_DVB_USB_ANYSEE=m
-CONFIG_DVB_USB_AU6610=m
-CONFIG_DVB_USB_AZ6007=m
-CONFIG_DVB_USB_CE6230=m
-CONFIG_DVB_USB_DVBSKY=m
-CONFIG_DVB_USB_EC168=m
-CONFIG_DVB_USB_GL861=m
-CONFIG_DVB_USB_LME2510=m
-CONFIG_DVB_USB_MXL111SF=m
-CONFIG_DVB_USB_RTL28XXU=m
-CONFIG_DVB_USB_ZD1301=m
-CONFIG_DVB_USB=m
-# CONFIG_DVB_USB_DEBUG is not set
-CONFIG_DVB_USB_A800=m
-CONFIG_DVB_USB_AF9005=m
-CONFIG_DVB_USB_AF9005_REMOTE=m
-CONFIG_DVB_USB_AZ6027=m
-CONFIG_DVB_USB_CINERGY_T2=m
-CONFIG_DVB_USB_CXUSB=m
-# CONFIG_DVB_USB_CXUSB_ANALOG is not set
-CONFIG_DVB_USB_DIB0700=m
-CONFIG_DVB_USB_DIB3000MC=m
-CONFIG_DVB_USB_DIBUSB_MB=m
-# CONFIG_DVB_USB_DIBUSB_MB_FAULTY is not set
-CONFIG_DVB_USB_DIBUSB_MC=m
-CONFIG_DVB_USB_DIGITV=m
-CONFIG_DVB_USB_DTT200U=m
-CONFIG_DVB_USB_DTV5100=m
-CONFIG_DVB_USB_DW2102=m
-CONFIG_DVB_USB_GP8PSK=m
-CONFIG_DVB_USB_M920X=m
-CONFIG_DVB_USB_NOVA_T_USB2=m
-CONFIG_DVB_USB_OPERA1=m
-CONFIG_DVB_USB_PCTV452E=m
-CONFIG_DVB_USB_TECHNISAT_USB2=m
-CONFIG_DVB_USB_TTUSB2=m
-CONFIG_DVB_USB_UMT_010=m
-CONFIG_DVB_USB_VP702X=m
-CONFIG_DVB_USB_VP7045=m
-CONFIG_SMS_USB_DRV=m
-CONFIG_DVB_TTUSB_BUDGET=m
-CONFIG_DVB_TTUSB_DEC=m
-
-#
-# Webcam, TV (analog/digital) USB devices
-#
-CONFIG_VIDEO_EM28XX=m
-CONFIG_VIDEO_EM28XX_V4L2=m
-CONFIG_VIDEO_EM28XX_ALSA=m
-CONFIG_VIDEO_EM28XX_DVB=m
-CONFIG_VIDEO_EM28XX_RC=m
-
-#
-# Software defined radio USB devices
-#
-CONFIG_USB_AIRSPY=m
-CONFIG_USB_HACKRF=m
-CONFIG_USB_MSI2500=m
-CONFIG_MEDIA_PCI_SUPPORT=y
-
-#
-# Media capture support
-#
-CONFIG_VIDEO_MGB4=m
-CONFIG_VIDEO_SOLO6X10=m
-CONFIG_VIDEO_TW5864=m
-CONFIG_VIDEO_TW68=m
-CONFIG_VIDEO_TW686X=m
-CONFIG_VIDEO_ZORAN=m
-# CONFIG_VIDEO_ZORAN_DC30 is not set
-# CONFIG_VIDEO_ZORAN_ZR36060 is not set
-
-#
-# Media capture/analog TV support
-#
-CONFIG_VIDEO_DT3155=m
-CONFIG_VIDEO_IVTV=m
-CONFIG_VIDEO_IVTV_ALSA=m
-CONFIG_VIDEO_FB_IVTV=m
-CONFIG_VIDEO_HEXIUM_GEMINI=m
-CONFIG_VIDEO_HEXIUM_ORION=m
-CONFIG_VIDEO_MXB=m
-
-#
-# Media capture/analog/hybrid TV support
-#
-CONFIG_VIDEO_BT848=m
-CONFIG_DVB_BT8XX=m
-CONFIG_VIDEO_CX18=m
-CONFIG_VIDEO_CX18_ALSA=m
-CONFIG_VIDEO_CX23885=m
-CONFIG_MEDIA_ALTERA_CI=m
-CONFIG_VIDEO_CX25821=m
-CONFIG_VIDEO_CX25821_ALSA=m
-CONFIG_VIDEO_CX88=m
-CONFIG_VIDEO_CX88_ALSA=m
-CONFIG_VIDEO_CX88_BLACKBIRD=m
-CONFIG_VIDEO_CX88_DVB=m
-CONFIG_VIDEO_CX88_ENABLE_VP3054=y
-CONFIG_VIDEO_CX88_VP3054=m
-CONFIG_VIDEO_CX88_MPEG=m
-CONFIG_VIDEO_SAA7134=m
-CONFIG_VIDEO_SAA7134_ALSA=m
-CONFIG_VIDEO_SAA7134_RC=y
-CONFIG_VIDEO_SAA7134_DVB=m
-CONFIG_VIDEO_SAA7134_GO7007=m
-CONFIG_VIDEO_SAA7164=m
-
-#
-# Media digital TV PCI Adapters
-#
-CONFIG_DVB_B2C2_FLEXCOP_PCI=m
-# CONFIG_DVB_B2C2_FLEXCOP_PCI_DEBUG is not set
-CONFIG_DVB_DDBRIDGE=m
-# CONFIG_DVB_DDBRIDGE_MSIENABLE is not set
-CONFIG_DVB_DM1105=m
-CONFIG_MANTIS_CORE=m
-CONFIG_DVB_MANTIS=m
-CONFIG_DVB_HOPPER=m
-CONFIG_DVB_NETUP_UNIDVB=m
-CONFIG_DVB_NGENE=m
-CONFIG_DVB_PLUTO2=m
-CONFIG_DVB_PT1=m
-CONFIG_DVB_PT3=m
-CONFIG_DVB_SMIPCIE=m
-CONFIG_DVB_BUDGET_CORE=m
-CONFIG_DVB_BUDGET=m
-CONFIG_DVB_BUDGET_CI=m
-CONFIG_DVB_BUDGET_AV=m
-CONFIG_IPU_BRIDGE=m
-CONFIG_RADIO_ADAPTERS=m
-CONFIG_RADIO_MAXIRADIO=m
-CONFIG_RADIO_SAA7706H=m
-CONFIG_RADIO_SHARK=m
-CONFIG_RADIO_SHARK2=m
-CONFIG_RADIO_SI4713=m
-CONFIG_RADIO_SI476X=m
-CONFIG_RADIO_TEA575X=m
-CONFIG_RADIO_TEA5764=m
-CONFIG_RADIO_TEF6862=m
-CONFIG_USB_DSBR=m
-CONFIG_USB_KEENE=m
-CONFIG_USB_MA901=m
-CONFIG_USB_MR800=m
-CONFIG_USB_RAREMONO=m
-CONFIG_RADIO_SI470X=m
-CONFIG_USB_SI470X=m
-CONFIG_I2C_SI470X=m
-CONFIG_USB_SI4713=m
-CONFIG_PLATFORM_SI4713=m
-CONFIG_I2C_SI4713=m
-CONFIG_MEDIA_PLATFORM_DRIVERS=y
-# CONFIG_V4L_PLATFORM_DRIVERS is not set
-# CONFIG_SDR_PLATFORM_DRIVERS is not set
-# CONFIG_DVB_PLATFORM_DRIVERS is not set
-# CONFIG_V4L_MEM2MEM_DRIVERS is not set
-
-#
-# Allegro DVT media platform drivers
-#
-
-#
-# Amlogic media platform drivers
-#
-
-#
-# Amphion drivers
-#
-
-#
-# Aspeed media platform drivers
-#
-
-#
-# Atmel media platform drivers
-#
-
-#
-# Cadence media platform drivers
-#
-CONFIG_VIDEO_CADENCE_CSI2RX=m
-CONFIG_VIDEO_CADENCE_CSI2TX=m
-
-#
-# Chips&Media media platform drivers
-#
-
-#
-# Intel media platform drivers
-#
-
-#
-# Marvell media platform drivers
-#
-
-#
-# Mediatek media platform drivers
-#
-
-#
-# Microchip Technology, Inc. media platform drivers
-#
-
-#
-# Nuvoton media platform drivers
-#
-
-#
-# NVidia media platform drivers
-#
-
-#
-# NXP media platform drivers
-#
-
-#
-# Qualcomm media platform drivers
-#
-
-#
-# Raspberry Pi media platform drivers
-#
-CONFIG_VIDEO_RP1_CFE=m
-
-#
-# Renesas media platform drivers
-#
-
-#
-# Rockchip media platform drivers
-#
-
-#
-# Samsung media platform drivers
-#
-
-#
-# STMicroelectronics media platform drivers
-#
-
-#
-# Sunxi media platform drivers
-#
-
-#
-# Texas Instruments drivers
-#
-
-#
-# Verisilicon media platform drivers
-#
-
-#
-# VIA media platform drivers
-#
-
-#
-# Xilinx media platform drivers
-#
-
-#
-# MMC/SDIO DVB adapters
-#
-CONFIG_SMS_SDIO_DRV=m
-# CONFIG_V4L_TEST_DRIVERS is not set
-# CONFIG_DVB_TEST_DRIVERS is not set
-
-#
-# FireWire (IEEE 1394) Adapters
-#
-CONFIG_DVB_FIREDTV=m
-CONFIG_DVB_FIREDTV_INPUT=y
-CONFIG_MEDIA_COMMON_OPTIONS=y
-
-#
-# common driver options
-#
-CONFIG_CYPRESS_FIRMWARE=m
-CONFIG_TTPCI_EEPROM=m
-CONFIG_UVC_COMMON=m
-CONFIG_VIDEO_CX2341X=m
-CONFIG_VIDEO_TVEEPROM=m
-CONFIG_DVB_B2C2_FLEXCOP=m
-CONFIG_VIDEO_SAA7146=m
-CONFIG_VIDEO_SAA7146_VV=m
-CONFIG_SMS_SIANO_MDTV=m
-CONFIG_SMS_SIANO_RC=y
-# CONFIG_SMS_SIANO_DEBUGFS is not set
-CONFIG_VIDEOBUF2_CORE=m
-CONFIG_VIDEOBUF2_V4L2=m
-CONFIG_VIDEOBUF2_MEMOPS=m
-CONFIG_VIDEOBUF2_DMA_CONTIG=m
-CONFIG_VIDEOBUF2_VMALLOC=m
-CONFIG_VIDEOBUF2_DMA_SG=m
-CONFIG_VIDEOBUF2_DVB=m
-# end of Media drivers
-
-#
-# Media ancillary drivers
-#
-CONFIG_MEDIA_ATTACH=y
-CONFIG_VIDEO_IR_I2C=m
-CONFIG_VIDEO_CAMERA_SENSOR=y
-CONFIG_VIDEO_APTINA_PLL=m
-CONFIG_VIDEO_CCS_PLL=m
-CONFIG_VIDEO_ALVIUM_CSI2=m
-CONFIG_VIDEO_AR0521=m
-CONFIG_VIDEO_GC0308=m
-CONFIG_VIDEO_GC0310=m
-CONFIG_VIDEO_GC05A2=m
-CONFIG_VIDEO_GC08A3=m
-CONFIG_VIDEO_GC2145=m
-CONFIG_VIDEO_HI556=m
-CONFIG_VIDEO_HI846=m
-CONFIG_VIDEO_HI847=m
-CONFIG_VIDEO_IMX208=m
-CONFIG_VIDEO_IMX214=m
-CONFIG_VIDEO_IMX219=m
-CONFIG_VIDEO_IMX258=m
-CONFIG_VIDEO_IMX274=m
-CONFIG_VIDEO_IMX283=m
-CONFIG_VIDEO_IMX290=m
-CONFIG_VIDEO_IMX296=m
-CONFIG_VIDEO_IMX319=m
-CONFIG_VIDEO_IMX334=m
-CONFIG_VIDEO_IMX335=m
-CONFIG_VIDEO_IMX355=m
-CONFIG_VIDEO_IMX412=m
-CONFIG_VIDEO_IMX415=m
-CONFIG_VIDEO_MAX9271_LIB=m
-CONFIG_VIDEO_MT9M001=m
-CONFIG_VIDEO_MT9M111=m
-CONFIG_VIDEO_MT9M114=m
-CONFIG_VIDEO_MT9P031=m
-CONFIG_VIDEO_MT9T112=m
-CONFIG_VIDEO_MT9V011=m
-CONFIG_VIDEO_MT9V032=m
-CONFIG_VIDEO_MT9V111=m
-CONFIG_VIDEO_OG01A1B=m
-CONFIG_VIDEO_OG0VE1B=m
-CONFIG_VIDEO_OV01A10=m
-CONFIG_VIDEO_OV02A10=m
-CONFIG_VIDEO_OV02E10=m
-CONFIG_VIDEO_OV02C10=m
-CONFIG_VIDEO_OV08D10=m
-CONFIG_VIDEO_OV08X40=m
-CONFIG_VIDEO_OV13858=m
-CONFIG_VIDEO_OV13B10=m
-CONFIG_VIDEO_OV2640=m
-CONFIG_VIDEO_OV2659=m
-CONFIG_VIDEO_OV2680=m
-CONFIG_VIDEO_OV2685=m
-CONFIG_VIDEO_OV2735=m
-CONFIG_VIDEO_OV2740=m
-CONFIG_VIDEO_OV4689=m
-CONFIG_VIDEO_OV5640=m
-CONFIG_VIDEO_OV5645=m
-CONFIG_VIDEO_OV5647=m
-CONFIG_VIDEO_OV5648=m
-CONFIG_VIDEO_OV5670=m
-CONFIG_VIDEO_OV5675=m
-CONFIG_VIDEO_OV5693=m
-CONFIG_VIDEO_OV5695=m
-CONFIG_VIDEO_OV6211=m
-CONFIG_VIDEO_OV64A40=m
-CONFIG_VIDEO_OV7251=m
-CONFIG_VIDEO_OV7640=m
-CONFIG_VIDEO_OV7670=m
-CONFIG_VIDEO_OV772X=m
-CONFIG_VIDEO_OV7740=m
-CONFIG_VIDEO_OV8856=m
-CONFIG_VIDEO_OV8858=m
-CONFIG_VIDEO_OV8865=m
-CONFIG_VIDEO_OV9282=m
-CONFIG_VIDEO_OV9640=m
-CONFIG_VIDEO_OV9650=m
-CONFIG_VIDEO_OV9734=m
-CONFIG_VIDEO_RDACM20=m
-CONFIG_VIDEO_RDACM21=m
-CONFIG_VIDEO_RJ54N1=m
-CONFIG_VIDEO_S5C73M3=m
-CONFIG_VIDEO_S5K5BAF=m
-CONFIG_VIDEO_S5K6A3=m
-CONFIG_VIDEO_VD55G1=m
-CONFIG_VIDEO_VD56G3=m
-CONFIG_VIDEO_VGXY61=m
-CONFIG_VIDEO_CCS=m
-CONFIG_VIDEO_ET8EK8=m
-
-#
-# Camera ISPs
-#
-CONFIG_VIDEO_THP7312=m
-# end of Camera ISPs
-
-CONFIG_VIDEO_CAMERA_LENS=y
-CONFIG_VIDEO_AD5820=m
-CONFIG_VIDEO_AK7375=m
-CONFIG_VIDEO_DW9714=m
-CONFIG_VIDEO_DW9719=m
-CONFIG_VIDEO_DW9768=m
-CONFIG_VIDEO_DW9807_VCM=m
-
-#
-# Flash devices
-#
-CONFIG_VIDEO_ADP1653=m
-CONFIG_VIDEO_LM3560=m
-CONFIG_VIDEO_LM3646=m
-# end of Flash devices
-
-#
-# Audio decoders, processors and mixers
-#
-CONFIG_VIDEO_CS3308=m
-CONFIG_VIDEO_CS5345=m
-CONFIG_VIDEO_CS53L32A=m
-CONFIG_VIDEO_MSP3400=m
-CONFIG_VIDEO_SONY_BTF_MPX=m
-CONFIG_VIDEO_TDA1997X=m
-CONFIG_VIDEO_TDA7432=m
-CONFIG_VIDEO_TDA9840=m
-CONFIG_VIDEO_TEA6415C=m
-CONFIG_VIDEO_TEA6420=m
-CONFIG_VIDEO_TLV320AIC23B=m
-CONFIG_VIDEO_TVAUDIO=m
-CONFIG_VIDEO_UDA1342=m
-CONFIG_VIDEO_VP27SMPX=m
-CONFIG_VIDEO_WM8739=m
-CONFIG_VIDEO_WM8775=m
-# end of Audio decoders, processors and mixers
-
-#
-# RDS decoders
-#
-CONFIG_VIDEO_SAA6588=m
-# end of RDS decoders
-
-#
-# Video decoders
-#
-CONFIG_VIDEO_ADV7180=m
-CONFIG_VIDEO_ADV7183=m
-CONFIG_VIDEO_ADV748X=m
-CONFIG_VIDEO_ADV7604=m
-# CONFIG_VIDEO_ADV7604_CEC is not set
-CONFIG_VIDEO_ADV7842=m
-# CONFIG_VIDEO_ADV7842_CEC is not set
-CONFIG_VIDEO_BT819=m
-CONFIG_VIDEO_BT856=m
-CONFIG_VIDEO_BT866=m
-CONFIG_VIDEO_ISL7998X=m
-CONFIG_VIDEO_LT6911UXE=m
-CONFIG_VIDEO_KS0127=m
-CONFIG_VIDEO_MAX9286=m
-CONFIG_VIDEO_ML86V7667=m
-CONFIG_VIDEO_SAA7110=m
-CONFIG_VIDEO_SAA711X=m
-CONFIG_VIDEO_TC358743=m
-# CONFIG_VIDEO_TC358743_CEC is not set
-CONFIG_VIDEO_TC358746=m
-CONFIG_VIDEO_TVP514X=m
-CONFIG_VIDEO_TVP5150=m
-CONFIG_VIDEO_TVP7002=m
-CONFIG_VIDEO_TW2804=m
-CONFIG_VIDEO_TW9900=m
-CONFIG_VIDEO_TW9903=m
-CONFIG_VIDEO_TW9906=m
-CONFIG_VIDEO_TW9910=m
-CONFIG_VIDEO_VPX3220=m
-
-#
-# Video and audio decoders
-#
-CONFIG_VIDEO_SAA717X=m
-CONFIG_VIDEO_CX25840=m
-# end of Video decoders
-
-#
-# Video encoders
-#
-CONFIG_VIDEO_ADV7170=m
-CONFIG_VIDEO_ADV7175=m
-CONFIG_VIDEO_ADV7343=m
-CONFIG_VIDEO_ADV7393=m
-CONFIG_VIDEO_AK881X=m
-CONFIG_VIDEO_SAA7127=m
-CONFIG_VIDEO_SAA7185=m
-CONFIG_VIDEO_THS8200=m
-# end of Video encoders
-
-#
-# Video improvement chips
-#
-CONFIG_VIDEO_UPD64031A=m
-CONFIG_VIDEO_UPD64083=m
-# end of Video improvement chips
-
-#
-# Audio/Video compression chips
-#
-CONFIG_VIDEO_SAA6752HS=m
-# end of Audio/Video compression chips
-
-#
-# SDR tuner chips
-#
-CONFIG_SDR_MAX2175=m
-# end of SDR tuner chips
-
-#
-# Miscellaneous helper chips
-#
-CONFIG_VIDEO_I2C=m
-CONFIG_VIDEO_M52790=m
-CONFIG_VIDEO_ST_MIPID02=m
-CONFIG_VIDEO_THS7303=m
-# end of Miscellaneous helper chips
-
-#
-# Video serializers and deserializers
-#
-CONFIG_VIDEO_DS90UB913=m
-CONFIG_VIDEO_DS90UB953=m
-CONFIG_VIDEO_DS90UB960=m
-CONFIG_VIDEO_MAX96714=m
-CONFIG_VIDEO_MAX96717=m
-# end of Video serializers and deserializers
-
-#
-# Media SPI Adapters
-#
-CONFIG_CXD2880_SPI_DRV=m
-CONFIG_VIDEO_GS1662=m
-# end of Media SPI Adapters
-
-CONFIG_MEDIA_TUNER=m
-
-#
-# Customize TV tuners
-#
-CONFIG_MEDIA_TUNER_E4000=m
-CONFIG_MEDIA_TUNER_FC0011=m
-CONFIG_MEDIA_TUNER_FC0012=m
-CONFIG_MEDIA_TUNER_FC0013=m
-CONFIG_MEDIA_TUNER_FC2580=m
-CONFIG_MEDIA_TUNER_IT913X=m
-CONFIG_MEDIA_TUNER_M88RS6000T=m
-CONFIG_MEDIA_TUNER_MAX2165=m
-CONFIG_MEDIA_TUNER_MC44S803=m
-CONFIG_MEDIA_TUNER_MSI001=m
-CONFIG_MEDIA_TUNER_MT2060=m
-CONFIG_MEDIA_TUNER_MT2063=m
-CONFIG_MEDIA_TUNER_MT20XX=m
-CONFIG_MEDIA_TUNER_MT2131=m
-CONFIG_MEDIA_TUNER_MT2266=m
-CONFIG_MEDIA_TUNER_MXL301RF=m
-CONFIG_MEDIA_TUNER_MXL5005S=m
-CONFIG_MEDIA_TUNER_MXL5007T=m
-CONFIG_MEDIA_TUNER_QM1D1B0004=m
-CONFIG_MEDIA_TUNER_QM1D1C0042=m
-CONFIG_MEDIA_TUNER_QT1010=m
-CONFIG_MEDIA_TUNER_R820T=m
-CONFIG_MEDIA_TUNER_SI2157=m
-CONFIG_MEDIA_TUNER_SIMPLE=m
-CONFIG_MEDIA_TUNER_TDA18212=m
-CONFIG_MEDIA_TUNER_TDA18218=m
-CONFIG_MEDIA_TUNER_TDA18250=m
-CONFIG_MEDIA_TUNER_TDA18271=m
-CONFIG_MEDIA_TUNER_TDA827X=m
-CONFIG_MEDIA_TUNER_TDA8290=m
-CONFIG_MEDIA_TUNER_TDA9887=m
-CONFIG_MEDIA_TUNER_TEA5761=m
-CONFIG_MEDIA_TUNER_TEA5767=m
-CONFIG_MEDIA_TUNER_TUA9001=m
-CONFIG_MEDIA_TUNER_XC2028=m
-CONFIG_MEDIA_TUNER_XC4000=m
-CONFIG_MEDIA_TUNER_XC5000=m
-# end of Customize TV tuners
-
-#
-# Customise DVB Frontends
-#
-
-#
-# Multistandard (satellite) frontends
-#
-CONFIG_DVB_M88DS3103=m
-CONFIG_DVB_MXL5XX=m
-CONFIG_DVB_STB0899=m
-CONFIG_DVB_STB6100=m
-CONFIG_DVB_STV090x=m
-CONFIG_DVB_STV0910=m
-CONFIG_DVB_STV6110x=m
-CONFIG_DVB_STV6111=m
-
-#
-# Multistandard (cable + terrestrial) frontends
-#
-CONFIG_DVB_DRXK=m
-CONFIG_DVB_MN88472=m
-CONFIG_DVB_MN88473=m
-CONFIG_DVB_SI2165=m
-CONFIG_DVB_TDA18271C2DD=m
-
-#
-# DVB-S (satellite) frontends
-#
-CONFIG_DVB_CX24110=m
-CONFIG_DVB_CX24116=m
-CONFIG_DVB_CX24117=m
-CONFIG_DVB_CX24120=m
-CONFIG_DVB_CX24123=m
-CONFIG_DVB_DS3000=m
-CONFIG_DVB_MB86A16=m
-CONFIG_DVB_MT312=m
-CONFIG_DVB_S5H1420=m
-CONFIG_DVB_SI21XX=m
-CONFIG_DVB_STB6000=m
-CONFIG_DVB_STV0288=m
-CONFIG_DVB_STV0299=m
-CONFIG_DVB_STV0900=m
-CONFIG_DVB_STV6110=m
-CONFIG_DVB_TDA10071=m
-CONFIG_DVB_TDA10086=m
-CONFIG_DVB_TDA8083=m
-CONFIG_DVB_TDA8261=m
-CONFIG_DVB_TDA826X=m
-CONFIG_DVB_TS2020=m
-CONFIG_DVB_TUA6100=m
-CONFIG_DVB_TUNER_CX24113=m
-CONFIG_DVB_TUNER_ITD1000=m
-CONFIG_DVB_VES1X93=m
-CONFIG_DVB_ZL10036=m
-CONFIG_DVB_ZL10039=m
-
-#
-# DVB-T (terrestrial) frontends
-#
-CONFIG_DVB_AF9013=m
-CONFIG_DVB_AS102_FE=m
-CONFIG_DVB_CX22700=m
-CONFIG_DVB_CX22702=m
-CONFIG_DVB_CXD2820R=m
-CONFIG_DVB_CXD2841ER=m
-CONFIG_DVB_DIB3000MB=m
-CONFIG_DVB_DIB3000MC=m
-CONFIG_DVB_DIB7000M=m
-CONFIG_DVB_DIB7000P=m
-CONFIG_DVB_DIB9000=m
-CONFIG_DVB_DRXD=m
-CONFIG_DVB_EC100=m
-CONFIG_DVB_GP8PSK_FE=m
-CONFIG_DVB_L64781=m
-CONFIG_DVB_MT352=m
-CONFIG_DVB_NXT6000=m
-CONFIG_DVB_RTL2830=m
-CONFIG_DVB_RTL2832=m
-CONFIG_DVB_RTL2832_SDR=m
-CONFIG_DVB_S5H1432=m
-CONFIG_DVB_SI2168=m
-CONFIG_DVB_SP887X=m
-CONFIG_DVB_STV0367=m
-CONFIG_DVB_TDA10048=m
-CONFIG_DVB_TDA1004X=m
-CONFIG_DVB_ZD1301_DEMOD=m
-CONFIG_DVB_ZL10353=m
-CONFIG_DVB_CXD2880=m
-
-#
-# DVB-C (cable) frontends
-#
-CONFIG_DVB_STV0297=m
-CONFIG_DVB_TDA10021=m
-CONFIG_DVB_TDA10023=m
-CONFIG_DVB_VES1820=m
-
-#
-# ATSC (North American/Korean Terrestrial/Cable DTV) frontends
-#
-CONFIG_DVB_AU8522=m
-CONFIG_DVB_AU8522_DTV=m
-CONFIG_DVB_AU8522_V4L=m
-CONFIG_DVB_BCM3510=m
-CONFIG_DVB_LG2160=m
-CONFIG_DVB_LGDT3305=m
-CONFIG_DVB_LGDT3306A=m
-CONFIG_DVB_LGDT330X=m
-CONFIG_DVB_MXL692=m
-CONFIG_DVB_NXT200X=m
-CONFIG_DVB_OR51132=m
-CONFIG_DVB_OR51211=m
-CONFIG_DVB_S5H1409=m
-CONFIG_DVB_S5H1411=m
-
-#
-# ISDB-T (terrestrial) frontends
-#
-CONFIG_DVB_DIB8000=m
-CONFIG_DVB_MB86A20S=m
-CONFIG_DVB_S921=m
-
-#
-# ISDB-S (satellite) & ISDB-T (terrestrial) frontends
-#
-CONFIG_DVB_MN88443X=m
-CONFIG_DVB_TC90522=m
-
-#
-# Digital terrestrial only tuners/PLL
-#
-CONFIG_DVB_PLL=m
-CONFIG_DVB_TUNER_DIB0070=m
-CONFIG_DVB_TUNER_DIB0090=m
-
-#
-# SEC control devices for DVB-S
-#
-CONFIG_DVB_A8293=m
-CONFIG_DVB_AF9033=m
-CONFIG_DVB_ASCOT2E=m
-CONFIG_DVB_ATBM8830=m
-CONFIG_DVB_HELENE=m
-CONFIG_DVB_HORUS3A=m
-CONFIG_DVB_ISL6405=m
-CONFIG_DVB_ISL6421=m
-CONFIG_DVB_ISL6423=m
-CONFIG_DVB_IX2505V=m
-CONFIG_DVB_LGS8GL5=m
-CONFIG_DVB_LGS8GXX=m
-CONFIG_DVB_LNBH25=m
-CONFIG_DVB_LNBH29=m
-CONFIG_DVB_LNBP21=m
-CONFIG_DVB_LNBP22=m
-CONFIG_DVB_M88RS2000=m
-CONFIG_DVB_TDA665x=m
-CONFIG_DVB_DRX39XYJ=m
-
-#
-# Common Interface (EN50221) controller drivers
-#
-CONFIG_DVB_CXD2099=m
-CONFIG_DVB_SP2=m
-# end of Customise DVB Frontends
-
-#
-# Tools to develop new frontends
-#
-CONFIG_DVB_DUMMY_FE=m
-# end of Media ancillary drivers
-
-#
-# Graphics support
-#
-CONFIG_APERTURE_HELPERS=y
-CONFIG_SCREEN_INFO=y
-CONFIG_VIDEO=y
-CONFIG_AUXDISPLAY=y
-CONFIG_CHARLCD=m
-CONFIG_HD44780_COMMON=m
-CONFIG_HD44780=m
-CONFIG_LCD2S=m
-CONFIG_PARPORT_PANEL=m
-CONFIG_PANEL_PARPORT=0
-CONFIG_PANEL_PROFILE=5
-# CONFIG_PANEL_CHANGE_MESSAGE is not set
-# CONFIG_CHARLCD_BL_OFF is not set
-# CONFIG_CHARLCD_BL_ON is not set
-CONFIG_CHARLCD_BL_FLASH=y
-CONFIG_KS0108=m
-CONFIG_KS0108_PORT=0x378
-CONFIG_KS0108_DELAY=2
-CONFIG_LINEDISP=m
-CONFIG_IMG_ASCII_LCD=m
-CONFIG_HT16K33=m
-CONFIG_MAX6959=m
-CONFIG_SEG_LED_GPIO=m
-CONFIG_PANEL=m
-CONFIG_GPU_BUDDY=y
-CONFIG_DRM=m
-
-#
-# DRM debugging options
-#
-# CONFIG_DRM_DEBUG_MM is not set
-# end of DRM debugging options
-
-CONFIG_DRM_MIPI_DBI=m
-CONFIG_DRM_MIPI_DSI=y
-CONFIG_DRM_KMS_HELPER=m
-CONFIG_DRM_DRAW=y
-CONFIG_DRM_PANIC=y
-CONFIG_DRM_PANIC_FOREGROUND_COLOR=0xffffff
-CONFIG_DRM_PANIC_BACKGROUND_COLOR=0x000000
-# CONFIG_DRM_PANIC_DEBUG is not set
-CONFIG_DRM_PANIC_SCREEN="kmsg"
-# CONFIG_DRM_DEBUG_DP_MST_TOPOLOGY_REFS is not set
-# CONFIG_DRM_DEBUG_MODESET_LOCK is not set
-CONFIG_DRM_CLIENT=y
-CONFIG_DRM_CLIENT_LIB=m
-CONFIG_DRM_CLIENT_SELECTION=m
-CONFIG_DRM_CLIENT_SETUP=y
-
-#
-# Supported DRM clients
-#
-CONFIG_DRM_FBDEV_EMULATION=y
-CONFIG_DRM_FBDEV_OVERALLOC=100
-# CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM is not set
-# CONFIG_DRM_CLIENT_LOG is not set
-CONFIG_DRM_CLIENT_DEFAULT_FBDEV=y
-CONFIG_DRM_CLIENT_DEFAULT="fbdev"
-# end of Supported DRM clients
-
-CONFIG_DRM_LOAD_EDID_FIRMWARE=y
-CONFIG_DRM_DISPLAY_DP_AUX_BUS=m
-CONFIG_DRM_DISPLAY_HELPER=m
-CONFIG_DRM_BRIDGE_CONNECTOR=y
-CONFIG_DRM_DISPLAY_DP_AUX_CEC=y
-CONFIG_DRM_DISPLAY_DP_AUX_CHARDEV=y
-CONFIG_DRM_DISPLAY_DP_HELPER=y
-CONFIG_DRM_DISPLAY_DP_TUNNEL=y
-CONFIG_DRM_DISPLAY_DSC_HELPER=y
-CONFIG_DRM_DISPLAY_HDCP_HELPER=y
-CONFIG_DRM_DISPLAY_HDMI_AUDIO_HELPER=y
-CONFIG_DRM_DISPLAY_HDMI_CEC_HELPER=y
-CONFIG_DRM_DISPLAY_HDMI_CEC_NOTIFIER_HELPER=y
-CONFIG_DRM_DISPLAY_HDMI_HELPER=y
-CONFIG_DRM_DISPLAY_HDMI_STATE_HELPER=y
-CONFIG_DRM_TTM=m
-CONFIG_DRM_EXEC=m
-CONFIG_DRM_GPUVM=m
-CONFIG_DRM_GPUSVM=m
-CONFIG_DRM_BUDDY=m
-CONFIG_DRM_VRAM_HELPER=m
-CONFIG_DRM_TTM_HELPER=m
-CONFIG_DRM_GEM_DMA_HELPER=m
-CONFIG_DRM_GEM_SHMEM_HELPER=m
-CONFIG_DRM_SUBALLOC_HELPER=m
-CONFIG_DRM_SCHED=m
-
-#
-# Drivers for system framebuffers
-#
-CONFIG_DRM_SYSFB_HELPER=m
-CONFIG_DRM_SIMPLEDRM=m
-# end of Drivers for system framebuffers
-
-#
-# ARM devices
-#
-CONFIG_DRM_KOMEDA=m
-# end of ARM devices
-
-CONFIG_DRM_RADEON=m
-# CONFIG_DRM_RADEON_USERPTR is not set
-CONFIG_DRM_AMDGPU=m
-CONFIG_DRM_AMDGPU_SI=y
-CONFIG_DRM_AMDGPU_CIK=y
-CONFIG_DRM_AMDGPU_USERPTR=y
-CONFIG_DRM_AMD_ISP=y
-# CONFIG_DRM_AMDGPU_WERROR is not set
-
-#
-# ACP (Audio CoProcessor) Configuration
-#
-CONFIG_DRM_AMD_ACP=y
-# end of ACP (Audio CoProcessor) Configuration
-
-#
-# Display Engine Configuration
-#
-CONFIG_DRM_AMD_DC=y
-CONFIG_DRM_AMD_DC_SI=y
-# end of Display Engine Configuration
-
-CONFIG_HSA_AMD=y
-CONFIG_HSA_AMD_SVM=y
-CONFIG_HSA_AMD_P2P=y
-CONFIG_DRM_NOUVEAU=m
-CONFIG_NOUVEAU_DEBUG=5
-CONFIG_NOUVEAU_DEBUG_DEFAULT=3
-# CONFIG_NOUVEAU_DEBUG_MMU is not set
-# CONFIG_NOUVEAU_DEBUG_PUSH is not set
-CONFIG_DRM_NOUVEAU_BACKLIGHT=y
-CONFIG_DRM_NOUVEAU_SVM=y
-CONFIG_DRM_NOUVEAU_CH7006=m
-CONFIG_DRM_NOUVEAU_SIL164=m
-CONFIG_DRM_XE=m
-CONFIG_DRM_XE_DISPLAY=y
-CONFIG_DRM_XE_DP_TUNNEL=y
-CONFIG_DRM_XE_GPUSVM=y
-CONFIG_DRM_XE_PAGEMAP=y
-CONFIG_DRM_XE_FORCE_PROBE=""
-
-#
-# drm/Xe Debugging
-#
-# CONFIG_DRM_XE_WERROR is not set
-# CONFIG_DRM_XE_DEBUG is not set
-# CONFIG_DRM_XE_DEBUG_VM is not set
-# CONFIG_DRM_XE_DEBUG_MEMIRQ is not set
-# CONFIG_DRM_XE_DEBUG_SRIOV is not set
-# CONFIG_DRM_XE_DEBUG_MEM is not set
-# CONFIG_DRM_XE_USERPTR_INVAL_INJECT is not set
-# end of drm/Xe Debugging
-
-#
-# drm/xe Profile Guided Optimisation
-#
-CONFIG_DRM_XE_JOB_TIMEOUT_MAX=10000
-CONFIG_DRM_XE_JOB_TIMEOUT_MIN=1
-CONFIG_DRM_XE_TIMESLICE_MAX=10000000
-CONFIG_DRM_XE_TIMESLICE_MIN=1
-CONFIG_DRM_XE_PREEMPT_TIMEOUT=640000
-CONFIG_DRM_XE_PREEMPT_TIMEOUT_MAX=10000000
-CONFIG_DRM_XE_PREEMPT_TIMEOUT_MIN=1
-CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT=y
-# end of drm/xe Profile Guided Optimisation
-
-CONFIG_DRM_VGEM=m
-CONFIG_DRM_VKMS=m
-CONFIG_DRM_UDL=m
-CONFIG_DRM_AST=m
-CONFIG_DRM_MGAG200=m
-CONFIG_DRM_SHMOBILE=m
-CONFIG_DRM_SUN4I=m
-CONFIG_DRM_SUN6I_DSI=m
-CONFIG_DRM_SUN8I_DW_HDMI=m
-CONFIG_DRM_SUN8I_MIXER=m
-CONFIG_DRM_SUN8I_TCON_TOP=m
-CONFIG_DRM_QXL=m
-CONFIG_DRM_VIRTIO_GPU=m
-CONFIG_DRM_VIRTIO_GPU_KMS=y
-CONFIG_DRM_PANEL=y
-
-#
-# Display Panels
-#
-CONFIG_DRM_PANEL_ABT_Y030XX067A=m
-CONFIG_DRM_PANEL_ARM_VERSATILE=m
-CONFIG_DRM_PANEL_ASUS_Z00T_TM5P5_NT35596=m
-CONFIG_DRM_PANEL_AUO_A030JTN01=m
-CONFIG_DRM_PANEL_BOE_BF060Y8M_AJ0=m
-CONFIG_DRM_PANEL_BOE_HIMAX8279D=m
-CONFIG_DRM_PANEL_BOE_TD4320=m
-CONFIG_DRM_PANEL_BOE_TH101MB31UIG002_28A=m
-CONFIG_DRM_PANEL_BOE_TV101WUM_NL6=m
-CONFIG_DRM_PANEL_BOE_TV101WUM_LL2=m
-CONFIG_DRM_PANEL_EBBG_FT8719=m
-CONFIG_DRM_PANEL_ELIDA_KD35T133=m
-CONFIG_DRM_PANEL_FEIXIN_K101_IM2BA02=m
-CONFIG_DRM_PANEL_FEIYANG_FY07024DI26A30D=m
-CONFIG_DRM_PANEL_DSI_CM=m
-CONFIG_DRM_PANEL_LVDS=m
-CONFIG_DRM_PANEL_HIMAX_HX8279=m
-CONFIG_DRM_PANEL_HIMAX_HX83102=m
-CONFIG_DRM_PANEL_HIMAX_HX83112A=m
-CONFIG_DRM_PANEL_HIMAX_HX83112B=m
-CONFIG_DRM_PANEL_HIMAX_HX8394=m
-CONFIG_DRM_PANEL_HYDIS_HV101HD1=m
-CONFIG_DRM_PANEL_ILITEK_IL9322=m
-CONFIG_DRM_PANEL_ILITEK_ILI9341=m
-CONFIG_DRM_PANEL_ILITEK_ILI9805=m
-CONFIG_DRM_PANEL_ILITEK_ILI9806E=m
-CONFIG_DRM_PANEL_ILITEK_ILI9881C=m
-CONFIG_DRM_PANEL_ILITEK_ILI9882T=m
-CONFIG_DRM_PANEL_INNOLUX_EJ030NA=m
-CONFIG_DRM_PANEL_INNOLUX_P079ZCA=m
-CONFIG_DRM_PANEL_JADARD_JD9365DA_H3=m
-CONFIG_DRM_PANEL_JDI_LPM102A188A=m
-CONFIG_DRM_PANEL_JDI_LT070ME05000=m
-CONFIG_DRM_PANEL_JDI_R63452=m
-CONFIG_DRM_PANEL_KHADAS_TS050=m
-CONFIG_DRM_PANEL_KINGDISPLAY_KD097D04=m
-CONFIG_DRM_PANEL_LEADTEK_LTK050H3146W=m
-CONFIG_DRM_PANEL_LEADTEK_LTK500HD1829=m
-CONFIG_DRM_PANEL_LINCOLNTECH_LCD197=m
-CONFIG_DRM_PANEL_LG_LB035Q02=m
-CONFIG_DRM_PANEL_LG_LG4573=m
-CONFIG_DRM_PANEL_LG_SW43408=m
-CONFIG_DRM_PANEL_MAGNACHIP_D53E6EA8966=m
-CONFIG_DRM_PANEL_MANTIX_MLAF057WE51=m
-CONFIG_DRM_PANEL_NEC_NL8048HL11=m
-CONFIG_DRM_PANEL_NEWVISION_NV3051D=m
-CONFIG_DRM_PANEL_NEWVISION_NV3052C=m
-CONFIG_DRM_PANEL_NOVATEK_NT35510=m
-CONFIG_DRM_PANEL_NOVATEK_NT35560=m
-CONFIG_DRM_PANEL_NOVATEK_NT35950=m
-CONFIG_DRM_PANEL_NOVATEK_NT36523=m
-CONFIG_DRM_PANEL_NOVATEK_NT36672A=m
-CONFIG_DRM_PANEL_NOVATEK_NT36672E=m
-CONFIG_DRM_PANEL_NOVATEK_NT37801=m
-CONFIG_DRM_PANEL_NOVATEK_NT39016=m
-CONFIG_DRM_PANEL_OLIMEX_LCD_OLINUXINO=m
-CONFIG_DRM_PANEL_ORISETECH_OTA5601A=m
-CONFIG_DRM_PANEL_ORISETECH_OTM8009A=m
-CONFIG_DRM_PANEL_OSD_OSD101T2587_53TS=m
-CONFIG_DRM_PANEL_PANASONIC_VVX10F034N00=m
-CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN=m
-CONFIG_DRM_PANEL_RAYDIUM_RM67191=m
-CONFIG_DRM_PANEL_RAYDIUM_RM67200=m
-CONFIG_DRM_PANEL_RAYDIUM_RM68200=m
-CONFIG_DRM_PANEL_RAYDIUM_RM692E5=m
-CONFIG_DRM_PANEL_RAYDIUM_RM69380=m
-CONFIG_DRM_PANEL_RENESAS_R61307=m
-CONFIG_DRM_PANEL_RENESAS_R69328=m
-CONFIG_DRM_PANEL_RONBO_RB070D30=m
-CONFIG_DRM_PANEL_SAMSUNG_AMS581VF01=m
-CONFIG_DRM_PANEL_SAMSUNG_AMS639RQ08=m
-CONFIG_DRM_PANEL_SAMSUNG_S6E88A0_AMS427AP24=m
-CONFIG_DRM_PANEL_SAMSUNG_S6E88A0_AMS452EF01=m
-CONFIG_DRM_PANEL_SAMSUNG_ATNA33XC20=m
-CONFIG_DRM_PANEL_SAMSUNG_DB7430=m
-CONFIG_DRM_PANEL_SAMSUNG_LD9040=m
-CONFIG_DRM_PANEL_SAMSUNG_S6E3FA7=m
-CONFIG_DRM_PANEL_SAMSUNG_S6D16D0=m
-CONFIG_DRM_PANEL_SAMSUNG_S6D27A1=m
-CONFIG_DRM_PANEL_SAMSUNG_S6D7AA0=m
-CONFIG_DRM_PANEL_SAMSUNG_S6E3HA2=m
-CONFIG_DRM_PANEL_SAMSUNG_S6E3HA8=m
-CONFIG_DRM_PANEL_SAMSUNG_S6E63J0X03=m
-CONFIG_DRM_PANEL_SAMSUNG_S6E63M0=m
-CONFIG_DRM_PANEL_SAMSUNG_S6E63M0_SPI=m
-CONFIG_DRM_PANEL_SAMSUNG_S6E63M0_DSI=m
-CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0=m
-CONFIG_DRM_PANEL_SAMSUNG_S6E8AA5X01_AMS561RA01=m
-CONFIG_DRM_PANEL_SAMSUNG_SOFEF00=m
-CONFIG_DRM_PANEL_SEIKO_43WVF1G=m
-CONFIG_DRM_PANEL_SHARP_LQ101R1SX01=m
-CONFIG_DRM_PANEL_SHARP_LS037V7DW01=m
-CONFIG_DRM_PANEL_SHARP_LS043T1LE01=m
-CONFIG_DRM_PANEL_SHARP_LS060T1SX01=m
-CONFIG_DRM_PANEL_SITRONIX_ST7701=m
-CONFIG_DRM_PANEL_SITRONIX_ST7703=m
-CONFIG_DRM_PANEL_SITRONIX_ST7789V=m
-CONFIG_DRM_PANEL_SONY_ACX565AKM=m
-CONFIG_DRM_PANEL_SONY_TD4353_JDI=m
-CONFIG_DRM_PANEL_SONY_TULIP_TRULY_NT35521=m
-CONFIG_DRM_PANEL_STARTEK_KD070FHFID015=m
-CONFIG_DRM_PANEL_EDP=m
-CONFIG_DRM_PANEL_SIMPLE=m
-CONFIG_DRM_PANEL_SUMMIT=m
-CONFIG_DRM_PANEL_SYNAPTICS_R63353=m
-CONFIG_DRM_PANEL_TDO_TL070WSH30=m
-CONFIG_DRM_PANEL_TPO_TD028TTEC1=m
-CONFIG_DRM_PANEL_TPO_TD043MTEA1=m
-CONFIG_DRM_PANEL_TPO_TPG110=m
-CONFIG_DRM_PANEL_TRULY_NT35597_WQXGA=m
-CONFIG_DRM_PANEL_VISIONOX_G2647FB105=m
-CONFIG_DRM_PANEL_VISIONOX_R66451=m
-CONFIG_DRM_PANEL_VISIONOX_RM69299=m
-CONFIG_DRM_PANEL_VISIONOX_RM692E5=m
-CONFIG_DRM_PANEL_VISIONOX_VTDR6130=m
-CONFIG_DRM_PANEL_WIDECHIPS_WS2401=m
-CONFIG_DRM_PANEL_XINPENG_XPP055C272=m
-# end of Display Panels
-
-CONFIG_DRM_BRIDGE=y
-CONFIG_DRM_PANEL_BRIDGE=y
-CONFIG_DRM_AUX_BRIDGE=m
-CONFIG_DRM_AUX_HPD_BRIDGE=m
-
-#
-# Display Interface Bridges
-#
-CONFIG_DRM_CHIPONE_ICN6211=m
-CONFIG_DRM_CHRONTEL_CH7033=m
-CONFIG_DRM_DISPLAY_CONNECTOR=m
-CONFIG_DRM_I2C_NXP_TDA998X=m
-CONFIG_DRM_ITE_IT6263=m
-CONFIG_DRM_ITE_IT6505=m
-CONFIG_DRM_LONTIUM_LT8912B=m
-CONFIG_DRM_LONTIUM_LT9211=m
-CONFIG_DRM_LONTIUM_LT9611=m
-CONFIG_DRM_LONTIUM_LT9611UXC=m
-CONFIG_DRM_ITE_IT66121=m
-CONFIG_DRM_LVDS_CODEC=m
-CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW=m
-CONFIG_DRM_NWL_MIPI_DSI=m
-CONFIG_DRM_NXP_PTN3460=m
-CONFIG_DRM_PARADE_PS8622=m
-CONFIG_DRM_PARADE_PS8640=m
-CONFIG_DRM_SAMSUNG_DSIM=m
-CONFIG_DRM_SIL_SII8620=m
-CONFIG_DRM_SII902X=m
-CONFIG_DRM_SII9234=m
-CONFIG_DRM_SIMPLE_BRIDGE=m
-CONFIG_DRM_SOLOMON_SSD2825=m
-CONFIG_DRM_THINE_THC63LVD1024=m
-CONFIG_DRM_TOSHIBA_TC358762=m
-CONFIG_DRM_TOSHIBA_TC358764=m
-CONFIG_DRM_TOSHIBA_TC358767=m
-CONFIG_DRM_TOSHIBA_TC358768=m
-CONFIG_DRM_TOSHIBA_TC358775=m
-CONFIG_DRM_TI_DLPC3433=m
-CONFIG_DRM_TI_TDP158=m
-CONFIG_DRM_TI_TFP410=m
-CONFIG_DRM_TI_SN65DSI83=m
-CONFIG_DRM_TI_SN65DSI86=m
-CONFIG_DRM_TI_TPD12S015=m
-CONFIG_DRM_WAVESHARE_BRIDGE=m
-CONFIG_DRM_ANALOGIX_ANX6345=m
-CONFIG_DRM_ANALOGIX_ANX78XX=m
-CONFIG_DRM_ANALOGIX_DP=m
-CONFIG_DRM_ANALOGIX_ANX7625=m
-CONFIG_DRM_I2C_ADV7511=m
-# CONFIG_DRM_I2C_ADV7511_AUDIO is not set
-CONFIG_DRM_I2C_ADV7511_CEC=y
-CONFIG_DRM_CDNS_DSI=m
-CONFIG_DRM_CDNS_DSI_J721E=y
-CONFIG_DRM_CDNS_MHDP8546=m
-CONFIG_DRM_DW_HDMI=m
-CONFIG_DRM_DW_HDMI_AHB_AUDIO=m
-CONFIG_DRM_DW_HDMI_I2S_AUDIO=m
-CONFIG_DRM_DW_HDMI_GP_AUDIO=m
-CONFIG_DRM_DW_HDMI_CEC=m
-# end of Display Interface Bridges
-
-CONFIG_DRM_ETNAVIV=m
-CONFIG_DRM_ETNAVIV_THERMAL=y
-CONFIG_DRM_HISI_HIBMC=m
-CONFIG_DRM_LOGICVC=m
-CONFIG_DRM_ARCPGU=m
-CONFIG_DRM_BOCHS=m
-CONFIG_DRM_CIRRUS_QEMU=m
-CONFIG_DRM_GM12U320=m
-CONFIG_DRM_PANEL_MIPI_DBI=m
-CONFIG_DRM_PIXPAPER=m
-CONFIG_TINYDRM_HX8357D=m
-CONFIG_TINYDRM_ILI9163=m
-CONFIG_TINYDRM_ILI9225=m
-CONFIG_TINYDRM_ILI9341=m
-CONFIG_TINYDRM_ILI9486=m
-CONFIG_TINYDRM_MI0283QT=m
-CONFIG_TINYDRM_REPAPER=m
-CONFIG_TINYDRM_SHARP_MEMORY=m
-CONFIG_DRM_GUD=m
-CONFIG_DRM_ST7571_I2C=m
-CONFIG_DRM_ST7586=m
-CONFIG_DRM_ST7735R=m
-CONFIG_DRM_SSD130X=m
-CONFIG_DRM_SSD130X_I2C=m
-CONFIG_DRM_SSD130X_SPI=m
-CONFIG_DRM_POWERVR=m
-CONFIG_DRM_PANEL_BACKLIGHT_QUIRKS=m
-CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=m
-
-#
-# Frame buffer Devices
-#
-CONFIG_FB=m
-CONFIG_FB_SVGALIB=m
-CONFIG_FB_CIRRUS=m
-CONFIG_FB_PM2=m
-# CONFIG_FB_PM2_FIFO_DISCONNECT is not set
-CONFIG_FB_CYBER2000=m
-CONFIG_FB_CYBER2000_DDC=y
-CONFIG_FB_UVESA=m
-CONFIG_FB_OPENCORES=m
-CONFIG_FB_S1D13XXX=m
-CONFIG_FB_NVIDIA=m
-CONFIG_FB_NVIDIA_I2C=y
-# CONFIG_FB_NVIDIA_DEBUG is not set
-CONFIG_FB_NVIDIA_BACKLIGHT=y
-CONFIG_FB_RIVA=m
-CONFIG_FB_RIVA_I2C=y
-# CONFIG_FB_RIVA_DEBUG is not set
-CONFIG_FB_RIVA_BACKLIGHT=y
-CONFIG_FB_I740=m
-CONFIG_FB_MATROX=m
-# CONFIG_FB_MATROX_MILLENIUM is not set
-# CONFIG_FB_MATROX_MYSTIQUE is not set
-# CONFIG_FB_MATROX_G is not set
-CONFIG_FB_MATROX_I2C=m
-CONFIG_FB_RADEON=m
-CONFIG_FB_RADEON_I2C=y
-CONFIG_FB_RADEON_BACKLIGHT=y
-# CONFIG_FB_RADEON_DEBUG is not set
-CONFIG_FB_ATY128=m
-CONFIG_FB_ATY128_BACKLIGHT=y
-CONFIG_FB_ATY=m
-CONFIG_FB_ATY_CT=y
-# CONFIG_FB_ATY_GENERIC_LCD is not set
-CONFIG_FB_ATY_GX=y
-CONFIG_FB_ATY_BACKLIGHT=y
-CONFIG_FB_S3=m
-CONFIG_FB_S3_DDC=y
-CONFIG_FB_SAVAGE=m
-CONFIG_FB_SAVAGE_I2C=y
-CONFIG_FB_SAVAGE_ACCEL=y
-CONFIG_FB_SIS=m
-CONFIG_FB_SIS_300=y
-CONFIG_FB_SIS_315=y
-CONFIG_FB_NEOMAGIC=m
-CONFIG_FB_KYRO=m
-CONFIG_FB_3DFX=m
-CONFIG_FB_3DFX_ACCEL=y
-CONFIG_FB_3DFX_I2C=y
-CONFIG_FB_VOODOO1=m
-CONFIG_FB_VT8623=m
-CONFIG_FB_TRIDENT=m
-CONFIG_FB_ARK=m
-CONFIG_FB_PM3=m
-CONFIG_FB_CARMINE=m
-CONFIG_FB_CARMINE_DRAM_EVAL=y
-# CONFIG_CARMINE_DRAM_CUSTOM is not set
-CONFIG_FB_SM501=m
-CONFIG_FB_SMSCUFX=m
-CONFIG_FB_UDL=m
-CONFIG_FB_IBM_GXT4500=m
-CONFIG_FB_GOLDFISH=m
-CONFIG_FB_VIRTUAL=m
-CONFIG_FB_METRONOME=m
-CONFIG_FB_MB862XX=m
-CONFIG_FB_MB862XX_PCI_GDC=y
-CONFIG_FB_MB862XX_I2C=y
-CONFIG_FB_SIMPLE=m
-CONFIG_FB_SSD1307=m
-CONFIG_FB_SM712=m
-CONFIG_FB_CORE=m
-CONFIG_FB_NOTIFY=y
-CONFIG_FB_DEVICE=y
-CONFIG_FB_DDC=m
-CONFIG_FB_CFB_FILLRECT=m
-CONFIG_FB_CFB_COPYAREA=m
-CONFIG_FB_CFB_IMAGEBLIT=m
-CONFIG_FB_CFB_REV_PIXELS_IN_BYTE=y
-CONFIG_FB_SYS_FILLRECT=m
-CONFIG_FB_SYS_COPYAREA=m
-CONFIG_FB_SYS_IMAGEBLIT=m
-# CONFIG_FB_FOREIGN_ENDIAN is not set
-CONFIG_FB_SYSMEM_FOPS=m
-CONFIG_FB_DEFERRED_IO=y
-CONFIG_FB_DMAMEM_HELPERS=y
-CONFIG_FB_DMAMEM_HELPERS_DEFERRED=y
-CONFIG_FB_IOMEM_FOPS=m
-CONFIG_FB_IOMEM_HELPERS=y
-CONFIG_FB_SYSMEM_HELPERS=y
-CONFIG_FB_SYSMEM_HELPERS_DEFERRED=y
-CONFIG_FB_BACKLIGHT=y
-CONFIG_FB_MODE_HELPERS=y
-CONFIG_FB_TILEBLITTING=y
-# end of Frame buffer Devices
-
-#
-# Backlight & LCD device support
-#
-CONFIG_LCD_CLASS_DEVICE=m
-CONFIG_LCD_L4F00242T03=m
-CONFIG_LCD_LMS283GF05=m
-CONFIG_LCD_LTV350QV=m
-CONFIG_LCD_ILI922X=m
-CONFIG_LCD_ILI9320=m
-CONFIG_LCD_TDO24M=m
-CONFIG_LCD_VGG2432A4=m
-CONFIG_LCD_PLATFORM=m
-CONFIG_LCD_AMS369FG06=m
-CONFIG_LCD_LMS501KF03=m
-CONFIG_LCD_HX8357=m
-CONFIG_LCD_OTM3225A=m
-CONFIG_BACKLIGHT_CLASS_DEVICE=m
-CONFIG_BACKLIGHT_KTD253=m
-CONFIG_BACKLIGHT_KTD2801=m
-CONFIG_BACKLIGHT_KTZ8866=m
-CONFIG_BACKLIGHT_LM3533=m
-CONFIG_BACKLIGHT_PWM=m
-CONFIG_BACKLIGHT_MT6370=m
-CONFIG_BACKLIGHT_QCOM_WLED=m
-CONFIG_BACKLIGHT_RT4831=m
-CONFIG_BACKLIGHT_ADP8860=m
-CONFIG_BACKLIGHT_ADP8870=m
-CONFIG_BACKLIGHT_LM3509=m
-CONFIG_BACKLIGHT_LM3630A=m
-CONFIG_BACKLIGHT_LM3639=m
-CONFIG_BACKLIGHT_LP855X=m
-CONFIG_BACKLIGHT_MP3309C=m
-CONFIG_BACKLIGHT_SKY81452=m
-CONFIG_BACKLIGHT_TPS65217=m
-CONFIG_BACKLIGHT_GPIO=m
-CONFIG_BACKLIGHT_LV5207LP=m
-CONFIG_BACKLIGHT_BD6107=m
-CONFIG_BACKLIGHT_ARCXCNN=m
-CONFIG_BACKLIGHT_RAVE_SP=m
-CONFIG_BACKLIGHT_LED=m
-# end of Backlight & LCD device support
-
-CONFIG_VGASTATE=m
-CONFIG_VIDEOMODE_HELPERS=y
-CONFIG_HDMI=y
-
-#
-# Console display driver support
-#
-CONFIG_DUMMY_CONSOLE=y
-CONFIG_DUMMY_CONSOLE_COLUMNS=80
-CONFIG_DUMMY_CONSOLE_ROWS=25
-CONFIG_FRAMEBUFFER_CONSOLE=y
-# CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION is not set
-CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
-CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
-# end of Console display driver support
-
-# CONFIG_LOGO is not set
-# CONFIG_TRACE_GPU_MEM is not set
-# end of Graphics support
-
-CONFIG_DRM_ACCEL=y
-CONFIG_DRM_ACCEL_QAIC=m
-CONFIG_SOUND=m
-CONFIG_SOUND_OSS_CORE=y
-CONFIG_SOUND_OSS_CORE_PRECLAIM=y
-CONFIG_SND=m
-CONFIG_SND_TIMER=m
-CONFIG_SND_PCM=m
-CONFIG_SND_PCM_ELD=y
-CONFIG_SND_PCM_IEC958=y
-CONFIG_SND_DMAENGINE_PCM=m
-CONFIG_SND_HWDEP=m
-CONFIG_SND_SEQ_DEVICE=m
-CONFIG_SND_RAWMIDI=m
-CONFIG_SND_UMP=m
-# CONFIG_SND_UMP_LEGACY_RAWMIDI is not set
-CONFIG_SND_COMPRESS_OFFLOAD=m
-CONFIG_SND_COMPRESS_ACCEL=y
-CONFIG_SND_JACK=y
-CONFIG_SND_JACK_INPUT_DEV=y
-CONFIG_SND_OSSEMUL=y
-CONFIG_SND_MIXER_OSS=m
-CONFIG_SND_PCM_OSS=m
-CONFIG_SND_PCM_OSS_PLUGINS=y
-CONFIG_SND_PCM_TIMER=y
-CONFIG_SND_HRTIMER=m
-CONFIG_SND_DYNAMIC_MINORS=y
-CONFIG_SND_MAX_CARDS=32
-CONFIG_SND_SUPPORT_OLD_API=y
-CONFIG_SND_PROC_FS=y
-CONFIG_SND_VERBOSE_PROCFS=y
-CONFIG_SND_CTL_FAST_LOOKUP=y
-# CONFIG_SND_DEBUG is not set
-# CONFIG_SND_CTL_INPUT_VALIDATION is not set
-# CONFIG_SND_UTIMER is not set
-CONFIG_SND_VMASTER=y
-CONFIG_SND_CTL_LED=m
-CONFIG_SND_SEQUENCER=m
-CONFIG_SND_SEQ_DUMMY=m
-CONFIG_SND_SEQUENCER_OSS=m
-CONFIG_SND_SEQ_HRTIMER_DEFAULT=y
-CONFIG_SND_SEQ_MIDI_EVENT=m
-CONFIG_SND_SEQ_MIDI=m
-CONFIG_SND_SEQ_MIDI_EMUL=m
-CONFIG_SND_SEQ_VIRMIDI=m
-# CONFIG_SND_SEQ_UMP is not set
-CONFIG_SND_MPU401_UART=m
-CONFIG_SND_OPL3_LIB=m
-CONFIG_SND_OPL3_LIB_SEQ=m
-CONFIG_SND_VX_LIB=m
-CONFIG_SND_AC97_CODEC=m
-CONFIG_SND_DRIVERS=y
-CONFIG_SND_DUMMY=m
-CONFIG_SND_ALOOP=m
-CONFIG_SND_PCMTEST=m
-CONFIG_SND_VIRMIDI=m
-CONFIG_SND_MTPAV=m
-CONFIG_SND_MTS64=m
-CONFIG_SND_SERIAL_U16550=m
-CONFIG_SND_SERIAL_GENERIC=m
-CONFIG_SND_MPU401=m
-CONFIG_SND_PORTMAN2X4=m
-CONFIG_SND_AC97_POWER_SAVE=y
-CONFIG_SND_AC97_POWER_SAVE_DEFAULT=60
-CONFIG_SND_PCI=y
-CONFIG_SND_AD1889=m
-CONFIG_SND_ATIIXP=m
-CONFIG_SND_ATIIXP_MODEM=m
-CONFIG_SND_AU8810=m
-CONFIG_SND_AU8820=m
-CONFIG_SND_AU8830=m
-CONFIG_SND_AW2=m
-CONFIG_SND_BT87X=m
-# CONFIG_SND_BT87X_OVERCLOCK is not set
-CONFIG_SND_CA0106=m
-CONFIG_SND_CMIPCI=m
-CONFIG_SND_OXYGEN_LIB=m
-CONFIG_SND_OXYGEN=m
-CONFIG_SND_CS4281=m
-CONFIG_SND_CS46XX=m
-CONFIG_SND_CS46XX_NEW_DSP=y
-CONFIG_SND_CTXFI=m
-CONFIG_SND_DARLA20=m
-CONFIG_SND_GINA20=m
-CONFIG_SND_LAYLA20=m
-CONFIG_SND_DARLA24=m
-CONFIG_SND_GINA24=m
-CONFIG_SND_LAYLA24=m
-CONFIG_SND_MONA=m
-CONFIG_SND_MIA=m
-CONFIG_SND_ECHO3G=m
-CONFIG_SND_INDIGO=m
-CONFIG_SND_INDIGOIO=m
-CONFIG_SND_INDIGODJ=m
-CONFIG_SND_INDIGOIOX=m
-CONFIG_SND_INDIGODJX=m
-CONFIG_SND_ENS1370=m
-CONFIG_SND_ENS1371=m
-CONFIG_SND_FM801=m
-# CONFIG_SND_FM801_TEA575X_BOOL is not set
-CONFIG_SND_HDSP=m
-CONFIG_SND_HDSPM=m
-CONFIG_SND_ICE1724=m
-CONFIG_SND_INTEL8X0=m
-CONFIG_SND_INTEL8X0M=m
-CONFIG_SND_KORG1212=m
-CONFIG_SND_LOLA=m
-CONFIG_SND_LX6464ES=m
-CONFIG_SND_MIXART=m
-CONFIG_SND_NM256=m
-CONFIG_SND_PCXHR=m
-CONFIG_SND_RIPTIDE=m
-CONFIG_SND_RME32=m
-CONFIG_SND_RME96=m
-CONFIG_SND_RME9652=m
-CONFIG_SND_VIA82XX=m
-CONFIG_SND_VIA82XX_MODEM=m
-CONFIG_SND_VIRTUOSO=m
-CONFIG_SND_VX222=m
-CONFIG_SND_YMFPCI=m
-
-#
-# HD-Audio
-#
-CONFIG_SND_HDA=m
-CONFIG_SND_HDA_HWDEP=y
-CONFIG_SND_HDA_RECONFIG=y
-CONFIG_SND_HDA_INPUT_BEEP=y
-CONFIG_SND_HDA_INPUT_BEEP_MODE=1
-CONFIG_SND_HDA_PATCH_LOADER=y
-CONFIG_SND_HDA_POWER_SAVE_DEFAULT=60
-# CONFIG_SND_HDA_CTL_DEV_ID is not set
-CONFIG_SND_HDA_PREALLOC_SIZE=0
-CONFIG_SND_HDA_INTEL=m
-CONFIG_SND_HDA_ACPI=m
-CONFIG_SND_HDA_GENERIC_LEDS=y
-CONFIG_SND_HDA_CODEC_ANALOG=m
-CONFIG_SND_HDA_CODEC_SIGMATEL=m
-CONFIG_SND_HDA_CODEC_VIA=m
-CONFIG_SND_HDA_CODEC_CONEXANT=m
-CONFIG_SND_HDA_CODEC_SENARYTECH=m
-CONFIG_SND_HDA_CODEC_CA0110=m
-CONFIG_SND_HDA_CODEC_CA0132=m
-CONFIG_SND_HDA_CODEC_CA0132_DSP=y
-CONFIG_SND_HDA_CODEC_CMEDIA=m
-CONFIG_SND_HDA_CODEC_CM9825=m
-CONFIG_SND_HDA_CODEC_SI3054=m
-CONFIG_SND_HDA_GENERIC=m
-CONFIG_SND_HDA_CODEC_REALTEK=m
-CONFIG_SND_HDA_CODEC_REALTEK_LIB=m
-CONFIG_SND_HDA_CODEC_ALC260=m
-CONFIG_SND_HDA_CODEC_ALC262=m
-CONFIG_SND_HDA_CODEC_ALC268=m
-CONFIG_SND_HDA_CODEC_ALC269=m
-CONFIG_SND_HDA_CODEC_ALC662=m
-CONFIG_SND_HDA_CODEC_ALC680=m
-CONFIG_SND_HDA_CODEC_ALC861=m
-CONFIG_SND_HDA_CODEC_ALC861VD=m
-CONFIG_SND_HDA_CODEC_ALC880=m
-CONFIG_SND_HDA_CODEC_ALC882=m
-CONFIG_SND_HDA_CODEC_CIRRUS=m
-CONFIG_SND_HDA_CODEC_CS420X=m
-CONFIG_SND_HDA_CODEC_CS421X=m
-CONFIG_SND_HDA_CODEC_CS8409=m
-CONFIG_SND_HDA_CODEC_HDMI=m
-CONFIG_SND_HDA_CODEC_HDMI_GENERIC=m
-CONFIG_SND_HDA_CODEC_HDMI_SIMPLE=m
-CONFIG_SND_HDA_CODEC_HDMI_INTEL=m
-# CONFIG_SND_HDA_INTEL_HDMI_SILENT_STREAM is not set
-CONFIG_SND_HDA_CODEC_HDMI_ATI=m
-CONFIG_SND_HDA_CODEC_HDMI_NVIDIA=m
-CONFIG_SND_HDA_CODEC_HDMI_NVIDIA_MCP=m
-CONFIG_SND_HDA_CODEC_HDMI_TEGRA=m
-CONFIG_SND_HDA_CIRRUS_SCODEC=m
-CONFIG_SND_HDA_SCODEC_CS35L41=m
-CONFIG_SND_HDA_SCODEC_COMPONENT=m
-CONFIG_SND_HDA_SCODEC_CS35L41_I2C=m
-CONFIG_SND_HDA_SCODEC_CS35L41_SPI=m
-CONFIG_SND_HDA_SCODEC_CS35L56=m
-CONFIG_SND_HDA_SCODEC_CS35L56_I2C=m
-CONFIG_SND_HDA_SCODEC_CS35L56_SPI=m
-CONFIG_SND_HDA_SCODEC_TAS2781=m
-CONFIG_SND_HDA_SCODEC_TAS2781_I2C=m
-CONFIG_SND_HDA_SCODEC_TAS2781_SPI=m
-CONFIG_SND_HDA_CORE=m
-CONFIG_SND_HDA_DSP_LOADER=y
-CONFIG_SND_HDA_COMPONENT=y
-CONFIG_SND_HDA_I915=y
-CONFIG_SND_HDA_EXT_CORE=m
-CONFIG_SND_INTEL_NHLT=y
-CONFIG_SND_INTEL_DSP_CONFIG=m
-CONFIG_SND_INTEL_SOUNDWIRE_ACPI=m
-# end of HD-Audio
-
-CONFIG_SND_SPI=y
-CONFIG_SND_USB=y
-CONFIG_SND_USB_AUDIO=m
-CONFIG_SND_USB_AUDIO_MIDI_V2=y
-CONFIG_SND_USB_AUDIO_USE_MEDIA_CONTROLLER=y
-CONFIG_SND_USB_UA101=m
-CONFIG_SND_USB_CAIAQ=m
-CONFIG_SND_USB_CAIAQ_INPUT=y
-CONFIG_SND_USB_6FIRE=m
-CONFIG_SND_USB_HIFACE=m
-CONFIG_SND_BCD2000=m
-CONFIG_SND_USB_AUDIO_QMI=m
-CONFIG_SND_USB_LINE6=m
-CONFIG_SND_USB_POD=m
-CONFIG_SND_USB_PODHD=m
-CONFIG_SND_USB_TONEPORT=m
-CONFIG_SND_USB_VARIAX=m
-CONFIG_SND_FIREWIRE=y
-CONFIG_SND_FIREWIRE_LIB=m
-CONFIG_SND_DICE=m
-CONFIG_SND_OXFW=m
-CONFIG_SND_ISIGHT=m
-CONFIG_SND_FIREWORKS=m
-CONFIG_SND_BEBOB=m
-CONFIG_SND_FIREWIRE_DIGI00X=m
-CONFIG_SND_FIREWIRE_TASCAM=m
-CONFIG_SND_FIREWIRE_MOTU=m
-CONFIG_SND_FIREFACE=m
-CONFIG_SND_PCMCIA=y
-CONFIG_SND_VXPOCKET=m
-CONFIG_SND_PDAUDIOCF=m
-CONFIG_SND_SOC=m
-CONFIG_SND_SOC_AC97_BUS=y
-CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y
-CONFIG_SND_SOC_COMPRESS=y
-CONFIG_SND_SOC_ACPI=m
-CONFIG_SND_SOC_USB=m
-
-#
-# Analog Devices
-#
-CONFIG_SND_SOC_ADI_AXI_I2S=m
-CONFIG_SND_SOC_ADI_AXI_SPDIF=m
-# end of Analog Devices
-
-#
-# AMD
-#
-CONFIG_SND_SOC_AMD_ACP=m
-CONFIG_SND_SOC_AMD_CZ_DA7219MX98357_MACH=m
-CONFIG_SND_SOC_AMD_CZ_RT5645_MACH=m
-CONFIG_SND_SOC_AMD_ST_ES8336_MACH=m
-CONFIG_SND_AMD_ACP_CONFIG=m
-# end of AMD
-
-#
-# Apple
-#
-# end of Apple
-
-#
-# Atmel
-#
-CONFIG_SND_SOC_MIKROE_PROTO=m
-# end of Atmel
-
-#
-# Au1x
-#
-# end of Au1x
-
-#
-# Broadcom
-#
-CONFIG_SND_BCM63XX_I2S_WHISTLER=m
-# end of Broadcom
-
-#
-# Cirrus Logic
-#
-# end of Cirrus Logic
-
-#
-# DesignWare
-#
-CONFIG_SND_DESIGNWARE_I2S=m
-# CONFIG_SND_DESIGNWARE_PCM is not set
-# end of DesignWare
-
-#
-# Freescale
-#
-
-#
-# Common SoC Audio options for Freescale CPUs:
-#
-CONFIG_SND_SOC_FSL_ASRC=m
-CONFIG_SND_SOC_FSL_SAI=m
-CONFIG_SND_SOC_FSL_MQS=m
-CONFIG_SND_SOC_FSL_AUDMIX=m
-CONFIG_SND_SOC_FSL_SSI=m
-CONFIG_SND_SOC_FSL_SPDIF=m
-CONFIG_SND_SOC_FSL_ESAI=m
-CONFIG_SND_SOC_FSL_MICFIL=m
-CONFIG_SND_SOC_FSL_EASRC=m
-CONFIG_SND_SOC_FSL_XCVR=m
-CONFIG_SND_SOC_FSL_UTILS=m
-CONFIG_SND_SOC_FSL_RPMSG=m
-CONFIG_SND_SOC_IMX_AUDMUX=m
-# end of Freescale
-
-#
-# Google
-#
-CONFIG_SND_SOC_CHV3_I2S=m
-# end of Google
-
-#
-# Hisilicon
-#
-CONFIG_SND_I2S_HI6210_I2S=m
-# end of Hisilicon
-
-#
-# JZ4740
-#
-# end of JZ4740
-
-#
-# Kirkwood
-#
-# end of Kirkwood
-
-#
-# Loongson
-#
-# end of Loongson
-
-#
-# Intel
-#
-# end of Intel
-
-#
-# Mediatek
-#
-CONFIG_SND_SOC_MTK_BTCVSD=m
-# end of Mediatek
-
-#
-# PXA
-#
-# end of PXA
-
-#
-# Renesas
-#
-CONFIG_SND_SOC_SH4_FSI=m
-CONFIG_SND_SOC_RCAR=m
-CONFIG_SND_SOC_MSIOF=m
-# end of Renesas
-
-#
-# SoundWire (SDCA)
-#
-CONFIG_SND_SOC_SDCA_OPTIONAL=m
-# end of SoundWire (SDCA)
-
-#
-# ST SPEAr
-#
-# end of ST SPEAr
-
-#
-# Spreadtrum
-#
-# end of Spreadtrum
-
-#
-# StarFive
-#
-CONFIG_SND_SOC_JH7110_PWMDAC=m
-CONFIG_SND_SOC_JH7110_TDM=m
-# end of StarFive
-
-#
-# STMicroelectronics STM32
-#
-# end of STMicroelectronics STM32
-
-#
-# Allwinner
-#
-CONFIG_SND_SUN4I_CODEC=m
-CONFIG_SND_SUN4I_I2S=m
-CONFIG_SND_SUN4I_SPDIF=m
-CONFIG_SND_SUN50I_DMIC=m
-# end of Allwinner
-
-#
-# Tegra
-#
-# end of Tegra
-
-#
-# Xilinx
-#
-CONFIG_SND_SOC_XILINX_I2S=m
-CONFIG_SND_SOC_XILINX_AUDIO_FORMATTER=m
-CONFIG_SND_SOC_XILINX_SPDIF=m
-# end of Xilinx
-
-#
-# Xtensa
-#
-CONFIG_SND_SOC_XTFPGA_I2S=m
-# end of Xtensa
-
-CONFIG_SND_SOC_SOF_TOPLEVEL=y
-CONFIG_SND_SOC_SOF_PCI=m
-CONFIG_SND_SOC_SOF_ACPI=m
-CONFIG_SND_SOC_SOF_OF=m
-CONFIG_SND_SOC_I2C_AND_SPI=m
-
-#
-# CODEC drivers
-#
-CONFIG_SND_SOC_WM_ADSP=m
-CONFIG_SND_SOC_AC97_CODEC=m
-CONFIG_SND_SOC_ADAU_UTILS=m
-CONFIG_SND_SOC_ADAU1372=m
-CONFIG_SND_SOC_ADAU1372_I2C=m
-CONFIG_SND_SOC_ADAU1372_SPI=m
-CONFIG_SND_SOC_ADAU1373=m
-CONFIG_SND_SOC_ADAU1701=m
-CONFIG_SND_SOC_ADAU17X1=m
-CONFIG_SND_SOC_ADAU1761=m
-CONFIG_SND_SOC_ADAU1761_I2C=m
-CONFIG_SND_SOC_ADAU1761_SPI=m
-CONFIG_SND_SOC_ADAU7002=m
-CONFIG_SND_SOC_ADAU7118=m
-CONFIG_SND_SOC_ADAU7118_HW=m
-CONFIG_SND_SOC_ADAU7118_I2C=m
-CONFIG_SND_SOC_AK4104=m
-CONFIG_SND_SOC_AK4118=m
-CONFIG_SND_SOC_AK4375=m
-CONFIG_SND_SOC_AK4458=m
-CONFIG_SND_SOC_AK4554=m
-CONFIG_SND_SOC_AK4613=m
-CONFIG_SND_SOC_AK4619=m
-CONFIG_SND_SOC_AK4642=m
-CONFIG_SND_SOC_AK5386=m
-CONFIG_SND_SOC_AK5558=m
-CONFIG_SND_SOC_ALC5623=m
-CONFIG_SND_SOC_AUDIO_IIO_AUX=m
-CONFIG_SND_SOC_AW8738=m
-CONFIG_SND_SOC_AW88395_LIB=m
-CONFIG_SND_SOC_AW88395=m
-CONFIG_SND_SOC_AW88166=m
-CONFIG_SND_SOC_AW88261=m
-CONFIG_SND_SOC_AW88081=m
-CONFIG_SND_SOC_AW87390=m
-CONFIG_SND_SOC_AW88399=m
-CONFIG_SND_SOC_BD28623=m
-CONFIG_SND_SOC_BT_SCO=m
-CONFIG_SND_SOC_CHV3_CODEC=m
-CONFIG_SND_SOC_CPCAP=m
-CONFIG_SND_SOC_CS_AMP_LIB=m
-CONFIG_SND_SOC_CS35L32=m
-CONFIG_SND_SOC_CS35L33=m
-CONFIG_SND_SOC_CS35L34=m
-CONFIG_SND_SOC_CS35L35=m
-CONFIG_SND_SOC_CS35L36=m
-CONFIG_SND_SOC_CS35L41_LIB=m
-CONFIG_SND_SOC_CS35L41=m
-CONFIG_SND_SOC_CS35L41_SPI=m
-CONFIG_SND_SOC_CS35L41_I2C=m
-CONFIG_SND_SOC_CS35L45=m
-CONFIG_SND_SOC_CS35L45_SPI=m
-CONFIG_SND_SOC_CS35L45_I2C=m
-CONFIG_SND_SOC_CS35L56=m
-CONFIG_SND_SOC_CS35L56_SHARED=m
-CONFIG_SND_SOC_CS35L56_I2C=m
-CONFIG_SND_SOC_CS35L56_SPI=m
-CONFIG_SND_SOC_CS35L56_SDW=m
-CONFIG_SND_SOC_CS40L50=m
-CONFIG_SND_SOC_CS42L42_CORE=m
-CONFIG_SND_SOC_CS42L42=m
-CONFIG_SND_SOC_CS42L42_SDW=m
-CONFIG_SND_SOC_CS42L43=m
-CONFIG_SND_SOC_CS42L43_SDW=m
-CONFIG_SND_SOC_CS42L51=m
-CONFIG_SND_SOC_CS42L51_I2C=m
-CONFIG_SND_SOC_CS42L52=m
-CONFIG_SND_SOC_CS42L56=m
-CONFIG_SND_SOC_CS42L73=m
-CONFIG_SND_SOC_CS42L83=m
-CONFIG_SND_SOC_CS42L84=m
-CONFIG_SND_SOC_CS4234=m
-CONFIG_SND_SOC_CS4265=m
-CONFIG_SND_SOC_CS4270=m
-CONFIG_SND_SOC_CS4271=m
-CONFIG_SND_SOC_CS4271_I2C=m
-CONFIG_SND_SOC_CS4271_SPI=m
-CONFIG_SND_SOC_CS42XX8=m
-CONFIG_SND_SOC_CS42XX8_I2C=m
-CONFIG_SND_SOC_CS43130=m
-CONFIG_SND_SOC_CS4341=m
-CONFIG_SND_SOC_CS4349=m
-CONFIG_SND_SOC_CS48L32=m
-CONFIG_SND_SOC_CS53L30=m
-CONFIG_SND_SOC_CS530X=m
-CONFIG_SND_SOC_CS530X_I2C=m
-CONFIG_SND_SOC_CX2072X=m
-CONFIG_SND_SOC_DA7213=m
-CONFIG_SND_SOC_DA7219=m
-CONFIG_SND_SOC_DMIC=m
-CONFIG_SND_SOC_HDMI_CODEC=m
-CONFIG_SND_SOC_ES7134=m
-CONFIG_SND_SOC_ES7241=m
-CONFIG_SND_SOC_ES8311=m
-CONFIG_SND_SOC_ES8316=m
-CONFIG_SND_SOC_ES8323=m
-CONFIG_SND_SOC_ES8326=m
-CONFIG_SND_SOC_ES8328=m
-CONFIG_SND_SOC_ES8328_I2C=m
-CONFIG_SND_SOC_ES8328_SPI=m
-CONFIG_SND_SOC_ES8375=m
-CONFIG_SND_SOC_ES8389=m
-CONFIG_SND_SOC_FRAMER=m
-CONFIG_SND_SOC_FS_AMP_LIB=m
-CONFIG_SND_SOC_FS210X=m
-CONFIG_SND_SOC_GTM601=m
-CONFIG_SND_SOC_HDA=m
-CONFIG_SND_SOC_ICS43432=m
-CONFIG_SND_SOC_IDT821034=m
-CONFIG_SND_SOC_MAX98088=m
-CONFIG_SND_SOC_MAX98090=m
-CONFIG_SND_SOC_MAX98357A=m
-CONFIG_SND_SOC_MAX98504=m
-CONFIG_SND_SOC_MAX9867=m
-CONFIG_SND_SOC_MAX98927=m
-CONFIG_SND_SOC_MAX98520=m
-CONFIG_SND_SOC_MAX98363=m
-CONFIG_SND_SOC_MAX98373=m
-CONFIG_SND_SOC_MAX98373_I2C=m
-CONFIG_SND_SOC_MAX98373_SDW=m
-CONFIG_SND_SOC_MAX98388=m
-CONFIG_SND_SOC_MAX98390=m
-CONFIG_SND_SOC_MAX98396=m
-CONFIG_SND_SOC_MAX9860=m
-CONFIG_SND_SOC_MSM8916_WCD_ANALOG=m
-CONFIG_SND_SOC_MSM8916_WCD_DIGITAL=m
-CONFIG_SND_SOC_PCM1681=m
-CONFIG_SND_SOC_PCM1754=m
-CONFIG_SND_SOC_PCM1789=m
-CONFIG_SND_SOC_PCM1789_I2C=m
-CONFIG_SND_SOC_PCM179X=m
-CONFIG_SND_SOC_PCM179X_I2C=m
-CONFIG_SND_SOC_PCM179X_SPI=m
-CONFIG_SND_SOC_PCM186X=m
-CONFIG_SND_SOC_PCM186X_I2C=m
-CONFIG_SND_SOC_PCM186X_SPI=m
-CONFIG_SND_SOC_PCM3060=m
-CONFIG_SND_SOC_PCM3060_I2C=m
-CONFIG_SND_SOC_PCM3060_SPI=m
-CONFIG_SND_SOC_PCM3168A=m
-CONFIG_SND_SOC_PCM3168A_I2C=m
-CONFIG_SND_SOC_PCM3168A_SPI=m
-CONFIG_SND_SOC_PCM5102A=m
-CONFIG_SND_SOC_PCM512x=m
-CONFIG_SND_SOC_PCM512x_I2C=m
-CONFIG_SND_SOC_PCM512x_SPI=m
-CONFIG_SND_SOC_PCM6240=m
-CONFIG_SND_SOC_PEB2466=m
-CONFIG_SND_SOC_PM4125=m
-CONFIG_SND_SOC_PM4125_SDW=m
-CONFIG_SND_SOC_RK817=m
-CONFIG_SND_SOC_RL6231=m
-CONFIG_SND_SOC_RT_SDW_COMMON=m
-CONFIG_SND_SOC_RT1017_SDCA_SDW=m
-CONFIG_SND_SOC_RT1308_SDW=m
-CONFIG_SND_SOC_RT1316_SDW=m
-CONFIG_SND_SOC_RT1318_SDW=m
-CONFIG_SND_SOC_RT1320_SDW=m
-CONFIG_SND_SOC_RT5616=m
-CONFIG_SND_SOC_RT5631=m
-CONFIG_SND_SOC_RT5640=m
-CONFIG_SND_SOC_RT5645=m
-CONFIG_SND_SOC_RT5659=m
-CONFIG_SND_SOC_RT5682=m
-CONFIG_SND_SOC_RT5682_I2C=m
-CONFIG_SND_SOC_RT5682_SDW=m
-CONFIG_SND_SOC_RT700=m
-CONFIG_SND_SOC_RT700_SDW=m
-CONFIG_SND_SOC_RT711=m
-CONFIG_SND_SOC_RT711_SDW=m
-CONFIG_SND_SOC_RT711_SDCA_SDW=m
-CONFIG_SND_SOC_RT712_SDCA_SDW=m
-CONFIG_SND_SOC_RT712_SDCA_DMIC_SDW=m
-CONFIG_SND_SOC_RT721_SDCA_SDW=m
-CONFIG_SND_SOC_RT722_SDCA_SDW=m
-CONFIG_SND_SOC_RT715=m
-CONFIG_SND_SOC_RT715_SDW=m
-CONFIG_SND_SOC_RT715_SDCA_SDW=m
-CONFIG_SND_SOC_RT9120=m
-CONFIG_SND_SOC_RT9123=m
-CONFIG_SND_SOC_RT9123P=m
-CONFIG_SND_SOC_RTQ9124=m
-CONFIG_SND_SOC_RTQ9128=m
-CONFIG_SND_SOC_SDW_MOCKUP=m
-CONFIG_SND_SOC_SGTL5000=m
-CONFIG_SND_SOC_SI476X=m
-CONFIG_SND_SOC_SIGMADSP=m
-CONFIG_SND_SOC_SIGMADSP_I2C=m
-CONFIG_SND_SOC_SIGMADSP_REGMAP=m
-CONFIG_SND_SOC_SIMPLE_AMPLIFIER=m
-CONFIG_SND_SOC_SIMPLE_MUX=m
-CONFIG_SND_SOC_SMA1303=m
-CONFIG_SND_SOC_SMA1307=m
-CONFIG_SND_SOC_SPDIF=m
-CONFIG_SND_SOC_SRC4XXX_I2C=m
-CONFIG_SND_SOC_SRC4XXX=m
-CONFIG_SND_SOC_SSM2305=m
-CONFIG_SND_SOC_SSM2518=m
-CONFIG_SND_SOC_SSM2602=m
-CONFIG_SND_SOC_SSM2602_SPI=m
-CONFIG_SND_SOC_SSM2602_I2C=m
-CONFIG_SND_SOC_SSM3515=m
-CONFIG_SND_SOC_SSM4567=m
-CONFIG_SND_SOC_STA32X=m
-CONFIG_SND_SOC_STA350=m
-CONFIG_SND_SOC_STI_SAS=m
-CONFIG_SND_SOC_TAS2552=m
-CONFIG_SND_SOC_TAS2562=m
-CONFIG_SND_SOC_TAS2764=m
-CONFIG_SND_SOC_TAS2770=m
-CONFIG_SND_SOC_TAS2780=m
-CONFIG_SND_SOC_TAS2781_COMLIB=m
-CONFIG_SND_SOC_TAS2781_COMLIB_I2C=m
-CONFIG_SND_SOC_TAS2781_FMWLIB=m
-CONFIG_SND_SOC_TAS2781_I2C=m
-CONFIG_SND_SOC_TAS2783_SDW=m
-CONFIG_SND_SOC_TAS5086=m
-CONFIG_SND_SOC_TAS571X=m
-CONFIG_SND_SOC_TAS5720=m
-CONFIG_SND_SOC_TAS5805M=m
-CONFIG_SND_SOC_TAS6424=m
-CONFIG_SND_SOC_TDA7419=m
-CONFIG_SND_SOC_TFA9879=m
-CONFIG_SND_SOC_TFA989X=m
-CONFIG_SND_SOC_TLV320ADC3XXX=m
-CONFIG_SND_SOC_TLV320AIC23=m
-CONFIG_SND_SOC_TLV320AIC23_I2C=m
-CONFIG_SND_SOC_TLV320AIC23_SPI=m
-CONFIG_SND_SOC_TLV320AIC31XX=m
-CONFIG_SND_SOC_TLV320AIC32X4=m
-CONFIG_SND_SOC_TLV320AIC32X4_I2C=m
-CONFIG_SND_SOC_TLV320AIC32X4_SPI=m
-CONFIG_SND_SOC_TLV320AIC3X=m
-CONFIG_SND_SOC_TLV320AIC3X_I2C=m
-CONFIG_SND_SOC_TLV320AIC3X_SPI=m
-CONFIG_SND_SOC_TLV320ADCX140=m
-CONFIG_SND_SOC_TS3A227E=m
-CONFIG_SND_SOC_TSCS42XX=m
-CONFIG_SND_SOC_TSCS454=m
-CONFIG_SND_SOC_UDA1334=m
-CONFIG_SND_SOC_UDA1342=m
-CONFIG_SND_SOC_WCD_CLASSH=m
-CONFIG_SND_SOC_WCD_COMMON=m
-CONFIG_SND_SOC_WCD9335=m
-CONFIG_SND_SOC_WCD_MBHC=m
-CONFIG_SND_SOC_WCD934X=m
-CONFIG_SND_SOC_WCD937X=m
-CONFIG_SND_SOC_WCD937X_SDW=m
-CONFIG_SND_SOC_WCD938X=m
-CONFIG_SND_SOC_WCD938X_SDW=m
-CONFIG_SND_SOC_WCD939X=m
-CONFIG_SND_SOC_WCD939X_SDW=m
-CONFIG_SND_SOC_WM8510=m
-CONFIG_SND_SOC_WM8523=m
-CONFIG_SND_SOC_WM8524=m
-CONFIG_SND_SOC_WM8580=m
-CONFIG_SND_SOC_WM8711=m
-CONFIG_SND_SOC_WM8728=m
-CONFIG_SND_SOC_WM8731=m
-CONFIG_SND_SOC_WM8731_I2C=m
-CONFIG_SND_SOC_WM8731_SPI=m
-CONFIG_SND_SOC_WM8737=m
-CONFIG_SND_SOC_WM8741=m
-CONFIG_SND_SOC_WM8750=m
-CONFIG_SND_SOC_WM8753=m
-CONFIG_SND_SOC_WM8770=m
-CONFIG_SND_SOC_WM8776=m
-CONFIG_SND_SOC_WM8782=m
-CONFIG_SND_SOC_WM8804=m
-CONFIG_SND_SOC_WM8804_I2C=m
-CONFIG_SND_SOC_WM8804_SPI=m
-CONFIG_SND_SOC_WM8903=m
-CONFIG_SND_SOC_WM8904=m
-CONFIG_SND_SOC_WM8940=m
-CONFIG_SND_SOC_WM8960=m
-CONFIG_SND_SOC_WM8961=m
-CONFIG_SND_SOC_WM8962=m
-CONFIG_SND_SOC_WM8974=m
-CONFIG_SND_SOC_WM8978=m
-CONFIG_SND_SOC_WM8985=m
-CONFIG_SND_SOC_WSA881X=m
-CONFIG_SND_SOC_WSA883X=m
-CONFIG_SND_SOC_WSA884X=m
-CONFIG_SND_SOC_ZL38060=m
-CONFIG_SND_SOC_MAX9759=m
-CONFIG_SND_SOC_MT6351=m
-CONFIG_SND_SOC_MT6357=m
-CONFIG_SND_SOC_MT6358=m
-CONFIG_SND_SOC_MT6660=m
-CONFIG_SND_SOC_NAU8315=m
-CONFIG_SND_SOC_NAU8325=m
-CONFIG_SND_SOC_NAU8540=m
-CONFIG_SND_SOC_NAU8810=m
-CONFIG_SND_SOC_NAU8821=m
-CONFIG_SND_SOC_NAU8822=m
-CONFIG_SND_SOC_NAU8824=m
-CONFIG_SND_SOC_NTPFW=m
-CONFIG_SND_SOC_NTP8918=m
-CONFIG_SND_SOC_NTP8835=m
-CONFIG_SND_SOC_TPA6130A2=m
-CONFIG_SND_SOC_LPASS_MACRO_COMMON=m
-CONFIG_SND_SOC_LPASS_WSA_MACRO=m
-CONFIG_SND_SOC_LPASS_VA_MACRO=m
-CONFIG_SND_SOC_LPASS_RX_MACRO=m
-CONFIG_SND_SOC_LPASS_TX_MACRO=m
-# end of CODEC drivers
-
-#
-# Generic drivers
-#
-CONFIG_SND_SIMPLE_CARD_UTILS=m
-CONFIG_SND_SIMPLE_CARD=m
-CONFIG_SND_AUDIO_GRAPH_CARD=m
-CONFIG_SND_AUDIO_GRAPH_CARD2=m
-CONFIG_SND_AUDIO_GRAPH_CARD2_CUSTOM_SAMPLE=m
-CONFIG_SND_TEST_COMPONENT=m
-# end of Generic drivers
-
-CONFIG_SND_VIRTIO=m
-CONFIG_AC97_BUS=m
-CONFIG_HID_SUPPORT=y
-CONFIG_HID=m
-CONFIG_HID_BATTERY_STRENGTH=y
-CONFIG_HIDRAW=y
-CONFIG_UHID=m
-CONFIG_HID_GENERIC=m
-CONFIG_HID_HAPTIC=y
-
-#
-# Special HID drivers
-#
-CONFIG_HID_A4TECH=m
-CONFIG_HID_ACCUTOUCH=m
-CONFIG_HID_ACRUX=m
-CONFIG_HID_ACRUX_FF=y
-CONFIG_HID_APPLE=m
-CONFIG_HID_APPLEIR=m
-CONFIG_HID_ASUS=m
-CONFIG_HID_AUREAL=m
-CONFIG_HID_BELKIN=m
-CONFIG_HID_BETOP_FF=m
-CONFIG_HID_BIGBEN_FF=m
-CONFIG_HID_CHERRY=m
-CONFIG_HID_CHICONY=m
-CONFIG_HID_CORSAIR=m
-CONFIG_HID_COUGAR=m
-CONFIG_HID_MACALLY=m
-CONFIG_HID_PRODIKEYS=m
-CONFIG_HID_CMEDIA=m
-CONFIG_HID_CP2112=m
-CONFIG_HID_CREATIVE_SB0540=m
-CONFIG_HID_CYPRESS=m
-CONFIG_HID_DRAGONRISE=m
-CONFIG_DRAGONRISE_FF=y
-CONFIG_HID_EMS_FF=m
-CONFIG_HID_ELAN=m
-CONFIG_HID_ELECOM=m
-CONFIG_HID_ELO=m
-CONFIG_HID_EVISION=m
-CONFIG_HID_EZKEY=m
-CONFIG_HID_FT260=m
-CONFIG_HID_GEMBIRD=m
-CONFIG_HID_GFRM=m
-CONFIG_HID_GLORIOUS=m
-CONFIG_HID_HOLTEK=m
-CONFIG_HOLTEK_FF=y
-CONFIG_HID_VIVALDI_COMMON=m
-CONFIG_HID_GOODIX_SPI=m
-CONFIG_HID_GOOGLE_STADIA_FF=m
-CONFIG_HID_VIVALDI=m
-CONFIG_HID_GT683R=m
-CONFIG_HID_KEYTOUCH=m
-CONFIG_HID_KYE=m
-CONFIG_HID_KYSONA=m
-CONFIG_HID_UCLOGIC=m
-CONFIG_HID_WALTOP=m
-CONFIG_HID_VIEWSONIC=m
-CONFIG_HID_VRC2=m
-CONFIG_HID_XIAOMI=m
-CONFIG_HID_GYRATION=m
-CONFIG_HID_ICADE=m
-CONFIG_HID_ITE=m
-CONFIG_HID_JABRA=m
-CONFIG_HID_TWINHAN=m
-CONFIG_HID_KENSINGTON=m
-CONFIG_HID_LCPOWER=m
-CONFIG_HID_LED=m
-CONFIG_HID_LENOVO=m
-CONFIG_HID_LETSKETCH=m
-CONFIG_HID_LOGITECH=m
-CONFIG_HID_LOGITECH_DJ=m
-CONFIG_HID_LOGITECH_HIDPP=m
-CONFIG_LOGITECH_FF=y
-CONFIG_LOGIRUMBLEPAD2_FF=y
-CONFIG_LOGIG940_FF=y
-CONFIG_LOGIWHEELS_FF=y
-CONFIG_HID_MAGICMOUSE=m
-CONFIG_HID_MALTRON=m
-CONFIG_HID_MAYFLASH=m
-CONFIG_HID_MEGAWORLD_FF=m
-CONFIG_HID_REDRAGON=m
-CONFIG_HID_MICROSOFT=m
-CONFIG_HID_MONTEREY=m
-CONFIG_HID_MULTITOUCH=m
-CONFIG_HID_NINTENDO=m
-CONFIG_NINTENDO_FF=y
-CONFIG_HID_NTI=m
-CONFIG_HID_NTRIG=m
-CONFIG_HID_NVIDIA_SHIELD=m
-CONFIG_NVIDIA_SHIELD_FF=y
-CONFIG_HID_ORTEK=m
-CONFIG_HID_PANTHERLORD=m
-CONFIG_PANTHERLORD_FF=y
-CONFIG_HID_PENMOUNT=m
-CONFIG_HID_PETALYNX=m
-CONFIG_HID_PICOLCD=m
-# CONFIG_HID_PICOLCD_FB is not set
-# CONFIG_HID_PICOLCD_BACKLIGHT is not set
-# CONFIG_HID_PICOLCD_LCD is not set
-# CONFIG_HID_PICOLCD_LEDS is not set
-# CONFIG_HID_PICOLCD_CIR is not set
-CONFIG_HID_PLANTRONICS=m
-CONFIG_HID_PLAYSTATION=m
-CONFIG_PLAYSTATION_FF=y
-CONFIG_HID_PXRC=m
-CONFIG_HID_RAZER=m
-CONFIG_HID_PRIMAX=m
-CONFIG_HID_RETRODE=m
-CONFIG_HID_ROCCAT=m
-CONFIG_HID_SAITEK=m
-CONFIG_HID_SAMSUNG=m
-CONFIG_HID_SEMITEK=m
-CONFIG_HID_SIGMAMICRO=m
-CONFIG_HID_SONY=m
-CONFIG_SONY_FF=y
-CONFIG_HID_SPEEDLINK=m
-CONFIG_HID_STEAM=m
-CONFIG_STEAM_FF=y
-CONFIG_HID_STEELSERIES=m
-CONFIG_HID_SUNPLUS=m
-CONFIG_HID_RMI=m
-CONFIG_HID_GREENASIA=m
-CONFIG_GREENASIA_FF=y
-CONFIG_HID_SMARTJOYPLUS=m
-CONFIG_SMARTJOYPLUS_FF=y
-CONFIG_HID_TIVO=m
-CONFIG_HID_TOPSEED=m
-CONFIG_HID_TOPRE=m
-CONFIG_HID_THINGM=m
-CONFIG_HID_THRUSTMASTER=m
-CONFIG_THRUSTMASTER_FF=y
-CONFIG_HID_UDRAW_PS3=m
-CONFIG_HID_U2FZERO=m
-CONFIG_HID_UNIVERSAL_PIDFF=m
-CONFIG_HID_WACOM=m
-CONFIG_HID_WIIMOTE=m
-CONFIG_HID_WINWING=m
-CONFIG_HID_XINMO=m
-CONFIG_HID_ZEROPLUS=m
-CONFIG_ZEROPLUS_FF=y
-CONFIG_HID_ZYDACRON=m
-CONFIG_HID_SENSOR_HUB=m
-CONFIG_HID_SENSOR_CUSTOM_SENSOR=m
-CONFIG_HID_ALPS=m
-CONFIG_HID_MCP2200=m
-CONFIG_HID_MCP2221=m
-# end of Special HID drivers
-
-#
-# HID-BPF support
-#
-# end of HID-BPF support
-
-CONFIG_I2C_HID=m
-CONFIG_I2C_HID_ACPI=m
-CONFIG_I2C_HID_OF=m
-CONFIG_I2C_HID_OF_ELAN=m
-CONFIG_I2C_HID_OF_GOODIX=m
-CONFIG_I2C_HID_CORE=m
-
-#
-# USB HID support
-#
-CONFIG_USB_HID=m
-CONFIG_HID_PID=y
-CONFIG_USB_HIDDEV=y
-
-#
-# USB HID Boot Protocol drivers
-#
-CONFIG_USB_KBD=m
-CONFIG_USB_MOUSE=m
-# end of USB HID Boot Protocol drivers
-# end of USB HID support
-
-CONFIG_USB_OHCI_LITTLE_ENDIAN=y
-CONFIG_USB_SUPPORT=y
-CONFIG_USB_COMMON=m
-# CONFIG_USB_LED_TRIG is not set
-CONFIG_USB_ULPI_BUS=m
-CONFIG_USB_CONN_GPIO=m
-CONFIG_USB_ARCH_HAS_HCD=y
-CONFIG_USB=m
-CONFIG_USB_PCI=y
-CONFIG_USB_PCI_AMD=y
-CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
-
-#
-# Miscellaneous USB options
-#
-CONFIG_USB_DEFAULT_PERSIST=y
-# CONFIG_USB_FEW_INIT_RETRIES is not set
-# CONFIG_USB_DYNAMIC_MINORS is not set
-# CONFIG_USB_OTG is not set
-# CONFIG_USB_OTG_PRODUCTLIST is not set
-# CONFIG_USB_OTG_DISABLE_EXTERNAL_HUB is not set
-CONFIG_USB_LEDS_TRIGGER_USBPORT=m
-CONFIG_USB_AUTOSUSPEND_DELAY=2
-CONFIG_USB_DEFAULT_AUTHORIZATION_MODE=1
-CONFIG_USB_MON=m
-
-#
-# USB Host Controller Drivers
-#
-CONFIG_USB_C67X00_HCD=m
-CONFIG_USB_XHCI_HCD=m
-# CONFIG_USB_XHCI_DBGCAP is not set
-CONFIG_USB_XHCI_PCI=m
-CONFIG_USB_XHCI_PCI_RENESAS=m
-CONFIG_USB_XHCI_PLATFORM=m
-CONFIG_USB_XHCI_RCAR=m
-CONFIG_USB_XHCI_SIDEBAND=y
-CONFIG_USB_EHCI_HCD=m
-CONFIG_USB_EHCI_ROOT_HUB_TT=y
-CONFIG_USB_EHCI_TT_NEWSCHED=y
-CONFIG_USB_EHCI_PCI=m
-CONFIG_USB_EHCI_FSL=m
-CONFIG_USB_EHCI_HCD_PLATFORM=m
-CONFIG_USB_OXU210HP_HCD=m
-CONFIG_USB_ISP116X_HCD=m
-CONFIG_USB_MAX3421_HCD=m
-CONFIG_USB_OHCI_HCD=m
-CONFIG_USB_OHCI_HCD_PCI=m
-# CONFIG_USB_OHCI_HCD_SSB is not set
-CONFIG_USB_OHCI_HCD_PLATFORM=m
-CONFIG_USB_UHCI_HCD=m
-CONFIG_USB_SL811_HCD=m
-# CONFIG_USB_SL811_HCD_ISO is not set
-CONFIG_USB_SL811_CS=m
-CONFIG_USB_R8A66597_HCD=m
-CONFIG_USB_RENESAS_USBHS_HCD=m
-CONFIG_USB_HCD_BCMA=m
-CONFIG_USB_HCD_SSB=m
-# CONFIG_USB_HCD_TEST_MODE is not set
-CONFIG_USB_RENESAS_USBHS=m
-
-#
-# USB Device Class drivers
-#
-CONFIG_USB_ACM=m
-CONFIG_USB_PRINTER=m
-CONFIG_USB_WDM=m
-CONFIG_USB_TMC=m
-
-#
-# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed; see USB_STORAGE Help for more info
-#
-CONFIG_USB_STORAGE=m
-# CONFIG_USB_STORAGE_DEBUG is not set
-CONFIG_USB_STORAGE_REALTEK=m
-CONFIG_REALTEK_AUTOPM=y
-CONFIG_USB_STORAGE_DATAFAB=m
-CONFIG_USB_STORAGE_FREECOM=m
-CONFIG_USB_STORAGE_ISD200=m
-CONFIG_USB_STORAGE_USBAT=m
-CONFIG_USB_STORAGE_SDDR09=m
-CONFIG_USB_STORAGE_SDDR55=m
-CONFIG_USB_STORAGE_JUMPSHOT=m
-CONFIG_USB_STORAGE_ALAUDA=m
-CONFIG_USB_STORAGE_ONETOUCH=m
-CONFIG_USB_STORAGE_KARMA=m
-CONFIG_USB_STORAGE_CYPRESS_ATACB=m
-CONFIG_USB_STORAGE_ENE_UB6250=m
-CONFIG_USB_UAS=m
-
-#
-# USB Imaging devices
-#
-CONFIG_USB_MDC800=m
-CONFIG_USB_MICROTEK=m
-CONFIG_USBIP_CORE=m
-CONFIG_USBIP_VHCI_HCD=m
-CONFIG_USBIP_VHCI_HC_PORTS=8
-CONFIG_USBIP_VHCI_NR_HCS=1
-CONFIG_USBIP_HOST=m
-CONFIG_USBIP_VUDC=m
-# CONFIG_USBIP_DEBUG is not set
-
-#
-# USB dual-mode controller drivers
-#
-CONFIG_USB_CDNS_SUPPORT=m
-CONFIG_USB_CDNS3=m
-# CONFIG_USB_CDNS3_GADGET is not set
-# CONFIG_USB_CDNS3_HOST is not set
-CONFIG_USB_CDNS3_PCI_WRAP=m
-CONFIG_USB_CDNS3_STARFIVE=m
-CONFIG_USB_CDNSP_PCI=m
-# CONFIG_USB_CDNSP_GADGET is not set
-# CONFIG_USB_CDNSP_HOST is not set
-CONFIG_USB_MUSB_HDRC=m
-CONFIG_USB_MUSB_HOST=y
-# CONFIG_USB_MUSB_GADGET is not set
-# CONFIG_USB_MUSB_DUAL_ROLE is not set
-
-#
-# Platform Glue Layer
-#
-CONFIG_USB_MUSB_SUNXI=m
-CONFIG_USB_MUSB_POLARFIRE_SOC=m
-
-#
-# MUSB DMA mode
-#
-# CONFIG_MUSB_PIO_ONLY is not set
-CONFIG_USB_INVENTRA_DMA=y
-CONFIG_USB_DWC3=m
-# CONFIG_USB_DWC3_ULPI is not set
-# CONFIG_USB_DWC3_HOST is not set
-# CONFIG_USB_DWC3_GADGET is not set
-CONFIG_USB_DWC3_DUAL_ROLE=y
-
-#
-# Platform Glue Driver Support
-#
-CONFIG_USB_DWC3_PCI=m
-CONFIG_USB_DWC3_HAPS=m
-CONFIG_USB_DWC3_OF_SIMPLE=m
-CONFIG_USB_DWC3_GENERIC_PLAT=m
-CONFIG_USB_DWC2=m
-# CONFIG_USB_DWC2_HOST is not set
-
-#
-# Gadget/Dual-role mode requires USB Gadget support to be enabled
-#
-# CONFIG_USB_DWC2_PERIPHERAL is not set
-CONFIG_USB_DWC2_DUAL_ROLE=y
-CONFIG_USB_DWC2_PCI=m
-# CONFIG_USB_DWC2_DEBUG is not set
-# CONFIG_USB_DWC2_TRACK_MISSED_SOFS is not set
-CONFIG_USB_CHIPIDEA=m
-# CONFIG_USB_CHIPIDEA_UDC is not set
-# CONFIG_USB_CHIPIDEA_HOST is not set
-CONFIG_USB_CHIPIDEA_PCI=m
-CONFIG_USB_CHIPIDEA_MSM=m
-CONFIG_USB_CHIPIDEA_NPCM=m
-CONFIG_USB_CHIPIDEA_IMX=m
-CONFIG_USB_CHIPIDEA_GENERIC=m
-CONFIG_USB_CHIPIDEA_TEGRA=m
-CONFIG_USB_ISP1760=m
-CONFIG_USB_ISP1760_HCD=y
-CONFIG_USB_ISP1760_HOST_ROLE=y
-# CONFIG_USB_ISP1760_GADGET_ROLE is not set
-# CONFIG_USB_ISP1760_DUAL_ROLE is not set
-
-#
-# USB port drivers
-#
-CONFIG_USB_SERIAL=m
-CONFIG_USB_SERIAL_GENERIC=y
-CONFIG_USB_SERIAL_SIMPLE=m
-CONFIG_USB_SERIAL_AIRCABLE=m
-CONFIG_USB_SERIAL_ARK3116=m
-CONFIG_USB_SERIAL_BELKIN=m
-CONFIG_USB_SERIAL_CH341=m
-CONFIG_USB_SERIAL_WHITEHEAT=m
-CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
-CONFIG_USB_SERIAL_CP210X=m
-CONFIG_USB_SERIAL_CYPRESS_M8=m
-CONFIG_USB_SERIAL_EMPEG=m
-CONFIG_USB_SERIAL_FTDI_SIO=m
-CONFIG_USB_SERIAL_VISOR=m
-CONFIG_USB_SERIAL_IPAQ=m
-CONFIG_USB_SERIAL_IR=m
-CONFIG_USB_SERIAL_EDGEPORT=m
-CONFIG_USB_SERIAL_EDGEPORT_TI=m
-CONFIG_USB_SERIAL_F81232=m
-CONFIG_USB_SERIAL_F8153X=m
-CONFIG_USB_SERIAL_GARMIN=m
-CONFIG_USB_SERIAL_IPW=m
-CONFIG_USB_SERIAL_IUU=m
-CONFIG_USB_SERIAL_KEYSPAN_PDA=m
-CONFIG_USB_SERIAL_KEYSPAN=m
-CONFIG_USB_SERIAL_KLSI=m
-CONFIG_USB_SERIAL_KOBIL_SCT=m
-CONFIG_USB_SERIAL_MCT_U232=m
-CONFIG_USB_SERIAL_METRO=m
-CONFIG_USB_SERIAL_MOS7720=m
-# CONFIG_USB_SERIAL_MOS7715_PARPORT is not set
-CONFIG_USB_SERIAL_MOS7840=m
-CONFIG_USB_SERIAL_MXUPORT=m
-CONFIG_USB_SERIAL_NAVMAN=m
-CONFIG_USB_SERIAL_PL2303=m
-CONFIG_USB_SERIAL_OTI6858=m
-CONFIG_USB_SERIAL_QCAUX=m
-CONFIG_USB_SERIAL_QUALCOMM=m
-CONFIG_USB_SERIAL_SPCP8X5=m
-CONFIG_USB_SERIAL_SAFE=m
-# CONFIG_USB_SERIAL_SAFE_PADDED is not set
-CONFIG_USB_SERIAL_SIERRAWIRELESS=m
-CONFIG_USB_SERIAL_SYMBOL=m
-CONFIG_USB_SERIAL_TI=m
-CONFIG_USB_SERIAL_CYBERJACK=m
-CONFIG_USB_SERIAL_WWAN=m
-CONFIG_USB_SERIAL_OPTION=m
-CONFIG_USB_SERIAL_OMNINET=m
-CONFIG_USB_SERIAL_OPTICON=m
-CONFIG_USB_SERIAL_XSENS_MT=m
-CONFIG_USB_SERIAL_WISHBONE=m
-CONFIG_USB_SERIAL_SSU100=m
-CONFIG_USB_SERIAL_QT2=m
-CONFIG_USB_SERIAL_UPD78F0730=m
-CONFIG_USB_SERIAL_XR=m
-CONFIG_USB_SERIAL_DEBUG=m
-
-#
-# USB Miscellaneous drivers
-#
-CONFIG_USB_USS720=m
-CONFIG_USB_EMI62=m
-CONFIG_USB_EMI26=m
-CONFIG_USB_ADUTUX=m
-CONFIG_USB_SEVSEG=m
-CONFIG_USB_LEGOTOWER=m
-CONFIG_USB_LCD=m
-CONFIG_USB_CYPRESS_CY7C63=m
-CONFIG_USB_CYTHERM=m
-CONFIG_USB_IDMOUSE=m
-CONFIG_USB_APPLEDISPLAY=m
-CONFIG_APPLE_MFI_FASTCHARGE=m
-CONFIG_USB_LJCA=m
-CONFIG_USB_SISUSBVGA=m
-CONFIG_USB_LD=m
-CONFIG_USB_TRANCEVIBRATOR=m
-CONFIG_USB_IOWARRIOR=m
-CONFIG_USB_TEST=m
-CONFIG_USB_EHSET_TEST_FIXTURE=m
-CONFIG_USB_ISIGHTFW=m
-CONFIG_USB_YUREX=m
-CONFIG_USB_EZUSB_FX2=m
-CONFIG_USB_HUB_USB251XB=m
-CONFIG_USB_HSIC_USB3503=m
-CONFIG_USB_HSIC_USB4604=m
-CONFIG_USB_LINK_LAYER_TEST=m
-CONFIG_USB_CHAOSKEY=m
-CONFIG_USB_ONBOARD_DEV=m
-# CONFIG_USB_ONBOARD_DEV_USB5744 is not set
-CONFIG_USB_ATM=m
-CONFIG_USB_SPEEDTOUCH=m
-CONFIG_USB_CXACRU=m
-CONFIG_USB_UEAGLEATM=m
-CONFIG_USB_XUSBATM=m
-
-#
-# USB Physical Layer drivers
-#
-CONFIG_USB_PHY=y
-CONFIG_NOP_USB_XCEIV=m
-CONFIG_USB_GPIO_VBUS=m
-CONFIG_TAHVO_USB=m
-# CONFIG_TAHVO_USB_HOST_BY_DEFAULT is not set
-CONFIG_USB_ISP1301=m
-# end of USB Physical Layer drivers
-
-CONFIG_USB_GADGET=m
-# CONFIG_USB_GADGET_DEBUG is not set
-# CONFIG_USB_GADGET_DEBUG_FILES is not set
-# CONFIG_USB_GADGET_DEBUG_FS is not set
-CONFIG_USB_GADGET_VBUS_DRAW=2
-CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2
-CONFIG_U_SERIAL_CONSOLE=y
-
-#
-# USB Peripheral Controller
-#
-CONFIG_USB_GR_UDC=m
-CONFIG_USB_R8A66597=m
-CONFIG_USB_RENESAS_USBHS_UDC=m
-CONFIG_USB_RENESAS_USB3=m
-CONFIG_USB_RENESAS_USBF=m
-CONFIG_USB_PXA27X=m
-CONFIG_USB_SNP_CORE=m
-CONFIG_USB_SNP_UDC_PLAT=m
-CONFIG_USB_M66592=m
-CONFIG_USB_BDC_UDC=m
-CONFIG_USB_AMD5536UDC=m
-CONFIG_USB_NET2280=m
-CONFIG_USB_GOKU=m
-CONFIG_USB_EG20T=m
-CONFIG_USB_GADGET_XILINX=m
-CONFIG_USB_MAX3420_UDC=m
-CONFIG_USB_CDNS2_UDC=m
-CONFIG_USB_DUMMY_HCD=m
-# end of USB Peripheral Controller
-
-CONFIG_USB_LIBCOMPOSITE=m
-CONFIG_USB_F_ACM=m
-CONFIG_USB_F_SS_LB=m
-CONFIG_USB_U_SERIAL=m
-CONFIG_USB_U_ETHER=m
-CONFIG_USB_U_AUDIO=m
-CONFIG_USB_F_SERIAL=m
-CONFIG_USB_F_OBEX=m
-CONFIG_USB_F_NCM=m
-CONFIG_USB_F_ECM=m
-CONFIG_USB_F_PHONET=m
-CONFIG_USB_F_SUBSET=m
-CONFIG_USB_F_RNDIS=m
-CONFIG_USB_F_MASS_STORAGE=m
-CONFIG_USB_F_FS=m
-CONFIG_USB_F_UAC2=m
-CONFIG_USB_F_UVC=m
-CONFIG_USB_F_MIDI=m
-CONFIG_USB_F_HID=m
-CONFIG_USB_F_PRINTER=m
-CONFIG_USB_F_TCM=m
-CONFIG_USB_CONFIGFS=m
-# CONFIG_USB_CONFIGFS_SERIAL is not set
-# CONFIG_USB_CONFIGFS_ACM is not set
-# CONFIG_USB_CONFIGFS_OBEX is not set
-# CONFIG_USB_CONFIGFS_NCM is not set
-# CONFIG_USB_CONFIGFS_ECM is not set
-# CONFIG_USB_CONFIGFS_ECM_SUBSET is not set
-# CONFIG_USB_CONFIGFS_RNDIS is not set
-# CONFIG_USB_CONFIGFS_EEM is not set
-# CONFIG_USB_CONFIGFS_PHONET is not set
-# CONFIG_USB_CONFIGFS_MASS_STORAGE is not set
-# CONFIG_USB_CONFIGFS_F_LB_SS is not set
-# CONFIG_USB_CONFIGFS_F_FS is not set
-# CONFIG_USB_CONFIGFS_F_UAC1 is not set
-# CONFIG_USB_CONFIGFS_F_UAC1_LEGACY is not set
-# CONFIG_USB_CONFIGFS_F_UAC2 is not set
-# CONFIG_USB_CONFIGFS_F_MIDI is not set
-# CONFIG_USB_CONFIGFS_F_MIDI2 is not set
-# CONFIG_USB_CONFIGFS_F_HID is not set
-# CONFIG_USB_CONFIGFS_F_UVC is not set
-# CONFIG_USB_CONFIGFS_F_PRINTER is not set
-# CONFIG_USB_CONFIGFS_F_TCM is not set
-
-#
-# USB Gadget precomposed configurations
-#
-CONFIG_USB_ZERO=m
-CONFIG_USB_AUDIO=m
-# CONFIG_GADGET_UAC1 is not set
-CONFIG_USB_ETH=m
-CONFIG_USB_ETH_RNDIS=y
-# CONFIG_USB_ETH_EEM is not set
-CONFIG_USB_G_NCM=m
-CONFIG_USB_GADGETFS=m
-CONFIG_USB_FUNCTIONFS=m
-# CONFIG_USB_FUNCTIONFS_ETH is not set
-# CONFIG_USB_FUNCTIONFS_RNDIS is not set
-CONFIG_USB_FUNCTIONFS_GENERIC=y
-CONFIG_USB_MASS_STORAGE=m
-CONFIG_USB_GADGET_TARGET=m
-CONFIG_USB_G_SERIAL=m
-CONFIG_USB_MIDI_GADGET=m
-CONFIG_USB_G_PRINTER=m
-CONFIG_USB_CDC_COMPOSITE=m
-CONFIG_USB_G_NOKIA=m
-CONFIG_USB_G_ACM_MS=m
-CONFIG_USB_G_MULTI=m
-CONFIG_USB_G_MULTI_RNDIS=y
-# CONFIG_USB_G_MULTI_CDC is not set
-CONFIG_USB_G_HID=m
-CONFIG_USB_G_DBGP=m
-# CONFIG_USB_G_DBGP_PRINTK is not set
-CONFIG_USB_G_DBGP_SERIAL=y
-CONFIG_USB_G_WEBCAM=m
-CONFIG_USB_RAW_GADGET=m
-# end of USB Gadget precomposed configurations
-
-CONFIG_TYPEC=m
-CONFIG_TYPEC_TCPM=m
-CONFIG_TYPEC_TCPCI=m
-CONFIG_TYPEC_RT1711H=m
-CONFIG_TYPEC_MT6360=m
-CONFIG_TYPEC_TCPCI_MT6370=m
-CONFIG_TYPEC_TCPCI_MAXIM=m
-CONFIG_TYPEC_FUSB302=m
-CONFIG_TYPEC_UCSI=m
-CONFIG_UCSI_CCG=m
-CONFIG_UCSI_ACPI=m
-CONFIG_UCSI_STM32G0=m
-CONFIG_UCSI_PMIC_GLINK=m
-CONFIG_TYPEC_TPS6598X=m
-CONFIG_TYPEC_ANX7411=m
-CONFIG_TYPEC_RT1719=m
-CONFIG_TYPEC_HD3SS3220=m
-CONFIG_TYPEC_STUSB160X=m
-CONFIG_TYPEC_WUSB3801=m
-
-#
-# USB Type-C Multiplexer/DeMultiplexer Switch support
-#
-CONFIG_TYPEC_MUX_FSA4480=m
-CONFIG_TYPEC_MUX_GPIO_SBU=m
-CONFIG_TYPEC_MUX_PI3USB30532=m
-CONFIG_TYPEC_MUX_IT5205=m
-CONFIG_TYPEC_MUX_NB7VPQ904M=m
-CONFIG_TYPEC_MUX_PS883X=m
-CONFIG_TYPEC_MUX_PTN36502=m
-CONFIG_TYPEC_MUX_TUSB1046=m
-CONFIG_TYPEC_MUX_WCD939X_USBSS=m
-# end of USB Type-C Multiplexer/DeMultiplexer Switch support
-
-#
-# USB Type-C Alternate Mode drivers
-#
-CONFIG_TYPEC_DP_ALTMODE=m
-CONFIG_TYPEC_NVIDIA_ALTMODE=m
-CONFIG_TYPEC_TBT_ALTMODE=m
-# end of USB Type-C Alternate Mode drivers
-
-CONFIG_USB_ROLE_SWITCH=m
-CONFIG_MMC=m
-CONFIG_PWRSEQ_EMMC=m
-CONFIG_PWRSEQ_SD8787=m
-CONFIG_PWRSEQ_SIMPLE=m
-CONFIG_MMC_BLOCK=m
-CONFIG_MMC_BLOCK_MINORS=32
-CONFIG_SDIO_UART=m
-CONFIG_MMC_TEST=m
-# CONFIG_MMC_CRYPTO is not set
-
-#
-# MMC/SD/SDIO Host Controller Drivers
-#
-# CONFIG_MMC_DEBUG is not set
-CONFIG_MMC_ARMMMCI=m
-CONFIG_MMC_STM32_SDMMC=y
-CONFIG_MMC_SDHCI=m
-CONFIG_MMC_SDHCI_IO_ACCESSORS=y
-CONFIG_MMC_SDHCI_UHS2=m
-CONFIG_MMC_SDHCI_PCI=m
-CONFIG_MMC_RICOH_MMC=y
-CONFIG_MMC_SDHCI_ACPI=m
-CONFIG_MMC_SDHCI_PLTFM=m
-CONFIG_MMC_SDHCI_OF_ARASAN=m
-CONFIG_MMC_SDHCI_OF_AT91=m
-CONFIG_MMC_SDHCI_OF_DWCMSHC=m
-CONFIG_MMC_SDHCI_OF_K1=m
-CONFIG_MMC_SDHCI_CADENCE=m
-CONFIG_MMC_SDHCI_F_SDH30=m
-CONFIG_MMC_SDHCI_MILBEAUT=m
-CONFIG_MMC_ALCOR=m
-CONFIG_MMC_TIFM_SD=m
-CONFIG_MMC_SPI=m
-CONFIG_MMC_SDRICOH_CS=m
-CONFIG_MMC_TMIO_CORE=m
-CONFIG_MMC_SDHI=m
-CONFIG_MMC_SDHI_SYS_DMAC=m
-CONFIG_MMC_SDHI_INTERNAL_DMAC=m
-CONFIG_MMC_CB710=m
-CONFIG_MMC_VIA_SDMMC=m
-CONFIG_MMC_DW=m
-CONFIG_MMC_DW_PLTFM=m
-CONFIG_MMC_DW_BLUEFIELD=m
-CONFIG_MMC_DW_EXYNOS=m
-CONFIG_MMC_DW_HI3798CV200=m
-CONFIG_MMC_DW_HI3798MV200=m
-CONFIG_MMC_DW_K3=m
-CONFIG_MMC_DW_PCI=m
-CONFIG_MMC_DW_STARFIVE=m
-CONFIG_MMC_SH_MMCIF=m
-CONFIG_MMC_VUB300=m
-CONFIG_MMC_USHC=m
-CONFIG_MMC_USDHI6ROL0=m
-CONFIG_MMC_REALTEK_PCI=m
-CONFIG_MMC_REALTEK_USB=m
-CONFIG_MMC_SUNXI=m
-CONFIG_MMC_CQHCI=m
-CONFIG_MMC_HSQ=m
-CONFIG_MMC_TOSHIBA_PCI=m
-CONFIG_MMC_MTK=m
-CONFIG_MMC_SDHCI_XENON=m
-CONFIG_MMC_LITEX=m
-CONFIG_SCSI_UFSHCD=m
-# CONFIG_SCSI_UFS_BSG is not set
-# CONFIG_SCSI_UFS_CRYPTO is not set
-# CONFIG_SCSI_UFS_HWMON is not set
-CONFIG_SCSI_UFSHCD_PCI=m
-CONFIG_SCSI_UFS_DWC_TC_PCI=m
-CONFIG_SCSI_UFSHCD_PLATFORM=m
-CONFIG_SCSI_UFS_CDNS_PLATFORM=m
-CONFIG_SCSI_UFS_DWC_TC_PLATFORM=m
-CONFIG_SCSI_UFS_RENESAS=m
-CONFIG_MEMSTICK=m
-# CONFIG_MEMSTICK_DEBUG is not set
-
-#
-# MemoryStick drivers
-#
-# CONFIG_MEMSTICK_UNSAFE_RESUME is not set
-CONFIG_MSPRO_BLOCK=m
-CONFIG_MS_BLOCK=m
-
-#
-# MemoryStick Host Controller Drivers
-#
-CONFIG_MEMSTICK_TIFM_MS=m
-CONFIG_MEMSTICK_JMICRON_38X=m
-CONFIG_MEMSTICK_R592=m
-CONFIG_MEMSTICK_REALTEK_USB=m
-CONFIG_LEDS_EXPRESSWIRE=y
-CONFIG_NEW_LEDS=y
-CONFIG_LEDS_CLASS=m
-CONFIG_LEDS_CLASS_FLASH=m
-CONFIG_LEDS_CLASS_MULTICOLOR=m
-# CONFIG_LEDS_BRIGHTNESS_HW_CHANGED is not set
-
-#
-# LED drivers
-#
-CONFIG_LEDS_AN30259A=m
-CONFIG_LEDS_AW200XX=m
-CONFIG_LEDS_AW2013=m
-CONFIG_LEDS_BCM6328=m
-CONFIG_LEDS_BCM6358=m
-CONFIG_LEDS_CPCAP=m
-CONFIG_LEDS_CR0014114=m
-CONFIG_LEDS_EL15203000=m
-CONFIG_LEDS_LM3530=m
-CONFIG_LEDS_LM3532=m
-CONFIG_LEDS_LM3533=m
-CONFIG_LEDS_LM3642=m
-CONFIG_LEDS_LM3692X=m
-CONFIG_LEDS_MT6323=m
-CONFIG_LEDS_SUN50I_A100=m
-CONFIG_LEDS_PCA9532=m
-# CONFIG_LEDS_PCA9532_GPIO is not set
-CONFIG_LEDS_GPIO=m
-CONFIG_LEDS_LP3944=m
-CONFIG_LEDS_LP3952=m
-CONFIG_LEDS_LP50XX=m
-CONFIG_LEDS_LP55XX_COMMON=m
-CONFIG_LEDS_LP5521=m
-CONFIG_LEDS_LP5523=m
-CONFIG_LEDS_LP5562=m
-CONFIG_LEDS_LP5569=m
-CONFIG_LEDS_LP8501=m
-CONFIG_LEDS_LP8860=m
-CONFIG_LEDS_LP8864=m
-CONFIG_LEDS_PCA955X=m
-# CONFIG_LEDS_PCA955X_GPIO is not set
-CONFIG_LEDS_PCA963X=m
-CONFIG_LEDS_PCA995X=m
-CONFIG_LEDS_QNAP_MCU=m
-CONFIG_LEDS_DAC124S085=m
-CONFIG_LEDS_PWM=m
-CONFIG_LEDS_REGULATOR=m
-CONFIG_LEDS_BD2606MVV=m
-CONFIG_LEDS_BD2802=m
-CONFIG_LEDS_LT3593=m
-CONFIG_LEDS_MAX5970=m
-CONFIG_LEDS_MC13783=m
-CONFIG_LEDS_TCA6507=m
-CONFIG_LEDS_TLC591XX=m
-CONFIG_LEDS_MAX77650=m
-CONFIG_LEDS_MAX77705=m
-CONFIG_LEDS_LM355x=m
-CONFIG_LEDS_MENF21BMC=m
-CONFIG_LEDS_IS31FL319X=m
-CONFIG_LEDS_IS31FL32XX=m
-
-#
-# LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM)
-#
-CONFIG_LEDS_BLINKM=m
-# CONFIG_LEDS_BLINKM_MULTICOLOR is not set
-CONFIG_LEDS_MLXREG=m
-CONFIG_LEDS_USER=m
-CONFIG_LEDS_SPI_BYTE=m
-CONFIG_LEDS_TI_LMU_COMMON=m
-CONFIG_LEDS_LM3697=m
-CONFIG_LEDS_LM36274=m
-CONFIG_LEDS_ST1202=m
-CONFIG_LEDS_TPS6105X=m
-
-#
-# Flash and Torch LED drivers
-#
-CONFIG_LEDS_AAT1290=m
-CONFIG_LEDS_AS3645A=m
-CONFIG_LEDS_KTD2692=m
-CONFIG_LEDS_LM3601X=m
-CONFIG_LEDS_MAX77693=m
-CONFIG_LEDS_MT6360=m
-CONFIG_LEDS_MT6370_FLASH=m
-CONFIG_LEDS_RT4505=m
-CONFIG_LEDS_RT8515=m
-CONFIG_LEDS_SGM3140=m
-CONFIG_LEDS_SY7802=m
-CONFIG_LEDS_TPS6131X=m
-
-#
-# RGB LED drivers
-#
-CONFIG_LEDS_GROUP_MULTICOLOR=m
-CONFIG_LEDS_KTD202X=m
-CONFIG_LEDS_NCP5623=m
-CONFIG_LEDS_PWM_MULTICOLOR=m
-CONFIG_LEDS_QCOM_LPG=m
-CONFIG_LEDS_MT6370_RGB=m
-
-#
-# LED Triggers
-#
-CONFIG_LEDS_TRIGGERS=y
-CONFIG_LEDS_TRIGGER_TIMER=m
-CONFIG_LEDS_TRIGGER_ONESHOT=m
-# CONFIG_LEDS_TRIGGER_DISK is not set
-# CONFIG_LEDS_TRIGGER_MTD is not set
-CONFIG_LEDS_TRIGGER_HEARTBEAT=m
-CONFIG_LEDS_TRIGGER_BACKLIGHT=m
-# CONFIG_LEDS_TRIGGER_CPU is not set
-CONFIG_LEDS_TRIGGER_ACTIVITY=m
-CONFIG_LEDS_TRIGGER_GPIO=m
-CONFIG_LEDS_TRIGGER_DEFAULT_ON=m
-
-#
-# iptables trigger is under Netfilter config (LED target)
-#
-CONFIG_LEDS_TRIGGER_TRANSIENT=m
-CONFIG_LEDS_TRIGGER_CAMERA=m
-# CONFIG_LEDS_TRIGGER_PANIC is not set
-CONFIG_LEDS_TRIGGER_NETDEV=m
-CONFIG_LEDS_TRIGGER_PATTERN=m
-CONFIG_LEDS_TRIGGER_TTY=m
-CONFIG_LEDS_TRIGGER_INPUT_EVENTS=m
-
-#
-# Simatic LED drivers
-#
-CONFIG_ACCESSIBILITY=y
-CONFIG_A11Y_BRAILLE_CONSOLE=y
-
-#
-# Speakup console speech
-#
-CONFIG_SPEAKUP=m
-CONFIG_SPEAKUP_SYNTH_ACNTSA=m
-CONFIG_SPEAKUP_SYNTH_APOLLO=m
-CONFIG_SPEAKUP_SYNTH_AUDPTR=m
-CONFIG_SPEAKUP_SYNTH_BNS=m
-CONFIG_SPEAKUP_SYNTH_DECTLK=m
-CONFIG_SPEAKUP_SYNTH_DECEXT=m
-CONFIG_SPEAKUP_SYNTH_LTLK=m
-CONFIG_SPEAKUP_SYNTH_SOFT=m
-CONFIG_SPEAKUP_SYNTH_SPKOUT=m
-CONFIG_SPEAKUP_SYNTH_TXPRT=m
-CONFIG_SPEAKUP_SYNTH_DUMMY=m
-# end of Speakup console speech
-
-CONFIG_INFINIBAND=m
-CONFIG_INFINIBAND_USER_MAD=m
-CONFIG_INFINIBAND_USER_ACCESS=m
-CONFIG_INFINIBAND_USER_MEM=y
-CONFIG_INFINIBAND_ON_DEMAND_PAGING=y
-CONFIG_INFINIBAND_ADDR_TRANS=y
-CONFIG_INFINIBAND_ADDR_TRANS_CONFIGFS=y
-CONFIG_INFINIBAND_VIRT_DMA=y
-CONFIG_INFINIBAND_BNXT_RE=m
-CONFIG_INFINIBAND_CXGB4=m
-CONFIG_INFINIBAND_EFA=m
-CONFIG_INFINIBAND_ERDMA=m
-CONFIG_INFINIBAND_IONIC=m
-CONFIG_INFINIBAND_IRDMA=m
-CONFIG_MLX4_INFINIBAND=m
-CONFIG_MLX5_INFINIBAND=m
-CONFIG_INFINIBAND_MTHCA=m
-CONFIG_INFINIBAND_MTHCA_DEBUG=y
-CONFIG_INFINIBAND_OCRDMA=m
-CONFIG_INFINIBAND_QEDR=m
-CONFIG_INFINIBAND_VMWARE_PVRDMA=m
-CONFIG_RDMA_RXE=m
-CONFIG_RDMA_SIW=m
-CONFIG_INFINIBAND_IPOIB=m
-CONFIG_INFINIBAND_IPOIB_CM=y
-CONFIG_INFINIBAND_IPOIB_DEBUG=y
-# CONFIG_INFINIBAND_IPOIB_DEBUG_DATA is not set
-CONFIG_INFINIBAND_SRP=m
-CONFIG_INFINIBAND_SRPT=m
-CONFIG_INFINIBAND_ISER=m
-CONFIG_INFINIBAND_ISERT=m
-CONFIG_INFINIBAND_RTRS=m
-CONFIG_INFINIBAND_RTRS_CLIENT=m
-CONFIG_INFINIBAND_RTRS_SERVER=m
-CONFIG_EDAC_SUPPORT=y
-CONFIG_EDAC=m
-CONFIG_EDAC_LEGACY_SYSFS=y
-# CONFIG_EDAC_DEBUG is not set
-CONFIG_EDAC_SCRUB=y
-CONFIG_EDAC_ECS=y
-CONFIG_EDAC_MEM_REPAIR=y
-CONFIG_RTC_LIB=y
-CONFIG_RTC_CLASS=y
-CONFIG_RTC_HCTOSYS=y
-CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
-CONFIG_RTC_SYSTOHC=y
-CONFIG_RTC_SYSTOHC_DEVICE="rtc0"
-# CONFIG_RTC_DEBUG is not set
-CONFIG_RTC_NVMEM=y
-
-#
-# RTC interfaces
-#
-CONFIG_RTC_INTF_SYSFS=y
-CONFIG_RTC_INTF_PROC=y
-CONFIG_RTC_INTF_DEV=y
-# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
-CONFIG_RTC_DRV_TEST=m
-
-#
-# I2C RTC drivers
-#
-CONFIG_RTC_DRV_88PM80X=m
-CONFIG_RTC_DRV_ABB5ZES3=m
-CONFIG_RTC_DRV_ABEOZ9=m
-CONFIG_RTC_DRV_ABX80X=m
-CONFIG_RTC_DRV_AC100=m
-CONFIG_RTC_DRV_DS1307=m
-# CONFIG_RTC_DRV_DS1307_CENTURY is not set
-CONFIG_RTC_DRV_DS1374=m
-# CONFIG_RTC_DRV_DS1374_WDT is not set
-CONFIG_RTC_DRV_DS1672=m
-CONFIG_RTC_DRV_HYM8563=m
-CONFIG_RTC_DRV_MAX6900=m
-CONFIG_RTC_DRV_MAX8907=m
-CONFIG_RTC_DRV_MAX31335=m
-CONFIG_RTC_DRV_MAX77686=m
-CONFIG_RTC_DRV_SPACEMIT_P1=m
-CONFIG_RTC_DRV_NCT3018Y=m
-CONFIG_RTC_DRV_NCT6694=m
-CONFIG_RTC_DRV_RK808=m
-CONFIG_RTC_DRV_RS5C372=m
-CONFIG_RTC_DRV_ISL1208=m
-CONFIG_RTC_DRV_ISL12022=m
-CONFIG_RTC_DRV_ISL12026=m
-CONFIG_RTC_DRV_X1205=m
-CONFIG_RTC_DRV_PCF8523=m
-CONFIG_RTC_DRV_PCF85363=m
-CONFIG_RTC_DRV_PCF8563=m
-CONFIG_RTC_DRV_PCF8583=m
-CONFIG_RTC_DRV_M41T80=m
-# CONFIG_RTC_DRV_M41T80_WDT is not set
-CONFIG_RTC_DRV_BQ32K=m
-CONFIG_RTC_DRV_TPS6594=m
-CONFIG_RTC_DRV_RC5T619=m
-CONFIG_RTC_DRV_S35390A=m
-CONFIG_RTC_DRV_FM3130=m
-CONFIG_RTC_DRV_RX8010=m
-CONFIG_RTC_DRV_RX8111=m
-CONFIG_RTC_DRV_RX8581=m
-CONFIG_RTC_DRV_RX8025=m
-CONFIG_RTC_DRV_EM3027=m
-CONFIG_RTC_DRV_RV3028=m
-CONFIG_RTC_DRV_RV3032=m
-CONFIG_RTC_DRV_RV8803=m
-CONFIG_RTC_DRV_SD2405AL=m
-CONFIG_RTC_DRV_SD3078=m
-
-#
-# SPI RTC drivers
-#
-CONFIG_RTC_DRV_M41T93=m
-CONFIG_RTC_DRV_M41T94=m
-CONFIG_RTC_DRV_DS1302=m
-CONFIG_RTC_DRV_DS1305=m
-CONFIG_RTC_DRV_DS1343=m
-CONFIG_RTC_DRV_DS1347=m
-CONFIG_RTC_DRV_DS1390=m
-CONFIG_RTC_DRV_MAX6916=m
-CONFIG_RTC_DRV_R9701=m
-CONFIG_RTC_DRV_RX4581=m
-CONFIG_RTC_DRV_RS5C348=m
-CONFIG_RTC_DRV_MAX6902=m
-CONFIG_RTC_DRV_PCF2123=m
-CONFIG_RTC_DRV_MCP795=m
-CONFIG_RTC_I2C_AND_SPI=m
-
-#
-# SPI and I2C RTC drivers
-#
-CONFIG_RTC_DRV_DS3232=m
-CONFIG_RTC_DRV_DS3232_HWMON=y
-CONFIG_RTC_DRV_PCF2127=m
-CONFIG_RTC_DRV_PCF85063=m
-CONFIG_RTC_DRV_RV3029C2=m
-CONFIG_RTC_DRV_RV3029_HWMON=y
-CONFIG_RTC_DRV_RX6110=m
-
-#
-# Platform RTC drivers
-#
-CONFIG_RTC_DRV_DS1286=m
-CONFIG_RTC_DRV_DS1511=m
-CONFIG_RTC_DRV_DS1553=m
-CONFIG_RTC_DRV_DS1685_FAMILY=m
-CONFIG_RTC_DRV_DS1685=y
-# CONFIG_RTC_DRV_DS1689 is not set
-# CONFIG_RTC_DRV_DS17285 is not set
-# CONFIG_RTC_DRV_DS17485 is not set
-# CONFIG_RTC_DRV_DS17885 is not set
-CONFIG_RTC_DRV_DS1742=m
-CONFIG_RTC_DRV_DS2404=m
-CONFIG_RTC_DRV_DA9063=m
-CONFIG_RTC_DRV_EFI=m
-CONFIG_RTC_DRV_STK17TA8=m
-CONFIG_RTC_DRV_M48T86=m
-CONFIG_RTC_DRV_M48T35=m
-CONFIG_RTC_DRV_M48T59=m
-CONFIG_RTC_DRV_MSM6242=m
-CONFIG_RTC_DRV_RP5C01=m
-CONFIG_RTC_DRV_ZYNQMP=m
-CONFIG_RTC_DRV_NTXEC=m
-
-#
-# on-CPU RTC drivers
-#
-CONFIG_RTC_DRV_CV1800=m
-CONFIG_RTC_DRV_SH=m
-CONFIG_RTC_DRV_PL030=m
-CONFIG_RTC_DRV_PL031=m
-CONFIG_RTC_DRV_SUN6I=y
-CONFIG_RTC_DRV_CADENCE=m
-CONFIG_RTC_DRV_FTRTC010=m
-CONFIG_RTC_DRV_MC13XXX=m
-CONFIG_RTC_DRV_MT6397=m
-CONFIG_RTC_DRV_R7301=m
-CONFIG_RTC_DRV_CPCAP=m
-CONFIG_RTC_DRV_RENESAS_RTCA3=m
-CONFIG_RTC_DRV_GOLDFISH=y
-CONFIG_RTC_DRV_POLARFIRE_SOC=m
-
-#
-# HID Sensor RTC drivers
-#
-CONFIG_RTC_DRV_HID_SENSOR_TIME=m
-CONFIG_DMADEVICES=y
-# CONFIG_DMADEVICES_DEBUG is not set
-
-#
-# DMA Devices
-#
-CONFIG_DMA_ENGINE=y
-CONFIG_DMA_VIRTUAL_CHANNELS=y
-CONFIG_DMA_ACPI=y
-CONFIG_DMA_OF=y
-CONFIG_ALTERA_MSGDMA=m
-CONFIG_AMBA_PL08X=y
-CONFIG_AT_XDMAC=m
-CONFIG_DMA_SUN6I=m
-CONFIG_DW_AXI_DMAC=m
-CONFIG_FSL_EDMA=m
-CONFIG_INTEL_IDMA64=m
-CONFIG_MMP_PDMA=m
-CONFIG_PL330_DMA=m
-CONFIG_PLX_DMA=m
-CONFIG_SOPHGO_CV1800B_DMAMUX=m
-CONFIG_XILINX_DMA=m
-CONFIG_XILINX_XDMA=m
-CONFIG_XILINX_ZYNQMP_DPDMA=m
-CONFIG_AMD_QDMA=m
-CONFIG_QCOM_HIDMA_MGMT=m
-CONFIG_QCOM_HIDMA=m
-CONFIG_DW_DMAC_CORE=m
-CONFIG_DW_DMAC=m
-CONFIG_DW_DMAC_PCI=m
-CONFIG_DW_EDMA=m
-CONFIG_DW_EDMA_PCIE=m
-CONFIG_SF_PDMA=m
-CONFIG_RENESAS_DMA=y
-CONFIG_RCAR_DMAC=m
-CONFIG_RENESAS_USB_DMAC=m
-
-#
-# DMA Clients
-#
-# CONFIG_ASYNC_TX_DMA is not set
-CONFIG_DMATEST=m
-CONFIG_DMA_ENGINE_RAID=y
-
-#
-# DMABUF options
-#
-CONFIG_SYNC_FILE=y
-# CONFIG_SW_SYNC is not set
-CONFIG_UDMABUF=y
-CONFIG_DMABUF_MOVE_NOTIFY=y
-# CONFIG_DMABUF_DEBUG is not set
-CONFIG_DMABUF_SELFTESTS=m
-# CONFIG_DMABUF_HEAPS is not set
-# CONFIG_DMABUF_SYSFS_STATS is not set
-# end of DMABUF options
-
-CONFIG_UIO=m
-CONFIG_UIO_CIF=m
-CONFIG_UIO_PDRV_GENIRQ=m
-CONFIG_UIO_DMEM_GENIRQ=m
-CONFIG_UIO_AEC=m
-CONFIG_UIO_SERCOS3=m
-CONFIG_UIO_PCI_GENERIC=m
-CONFIG_UIO_NETX=m
-CONFIG_UIO_MF624=m
-CONFIG_UIO_DFL=m
-CONFIG_VFIO=m
-CONFIG_VFIO_DEVICE_CDEV=y
-CONFIG_VFIO_GROUP=y
-CONFIG_VFIO_CONTAINER=y
-CONFIG_VFIO_NOIOMMU=y
-CONFIG_VFIO_VIRQFD=y
-# CONFIG_VFIO_DEBUGFS is not set
-
-#
-# VFIO support for PCI devices
-#
-CONFIG_VFIO_PCI_CORE=m
-CONFIG_VFIO_PCI_INTX=y
-CONFIG_VFIO_PCI=m
-CONFIG_MLX5_VFIO_PCI=m
-CONFIG_PDS_VFIO_PCI=m
-CONFIG_VIRTIO_VFIO_PCI=m
-CONFIG_QAT_VFIO_PCI=m
-# end of VFIO support for PCI devices
-
-CONFIG_IRQ_BYPASS_MANAGER=m
-CONFIG_VIRT_DRIVERS=y
-CONFIG_VMGENID=m
-CONFIG_VIRTIO_ANCHOR=y
-CONFIG_VIRTIO=y
-CONFIG_VIRTIO_PCI_LIB=y
-CONFIG_VIRTIO_PCI_LIB_LEGACY=y
-CONFIG_VIRTIO_MENU=y
-CONFIG_VIRTIO_PCI=y
-CONFIG_VIRTIO_PCI_LEGACY=y
-CONFIG_VIRTIO_VDPA=m
-CONFIG_VIRTIO_PMEM=m
-CONFIG_VIRTIO_BALLOON=m
-CONFIG_VIRTIO_MEM=m
-CONFIG_VIRTIO_INPUT=m
-CONFIG_VIRTIO_MMIO=m
-CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES=y
-CONFIG_VIRTIO_DMA_SHARED_BUFFER=m
-# CONFIG_VIRTIO_DEBUG is not set
-CONFIG_VIRTIO_RTC=m
-CONFIG_VIRTIO_RTC_PTP=y
-CONFIG_VIRTIO_RTC_CLASS=y
-CONFIG_VDPA=m
-CONFIG_VDPA_SIM=m
-CONFIG_VDPA_SIM_NET=m
-CONFIG_VDPA_SIM_BLOCK=m
-CONFIG_VDPA_USER=m
-CONFIG_IFCVF=m
-CONFIG_MLX5_VDPA=y
-CONFIG_MLX5_VDPA_NET=m
-# CONFIG_MLX5_VDPA_STEERING_DEBUG is not set
-CONFIG_VP_VDPA=m
-CONFIG_SNET_VDPA=m
-CONFIG_PDS_VDPA=m
-CONFIG_OCTEONEP_VDPA=m
-CONFIG_VHOST_IOTLB=m
-CONFIG_VHOST_RING=m
-CONFIG_VHOST_TASK=y
-CONFIG_VHOST=m
-CONFIG_VHOST_MENU=y
-CONFIG_VHOST_NET=m
-CONFIG_VHOST_SCSI=m
-CONFIG_VHOST_VSOCK=m
-CONFIG_VHOST_VDPA=m
-# CONFIG_VHOST_CROSS_ENDIAN_LEGACY is not set
-CONFIG_VHOST_ENABLE_FORK_OWNER_CONTROL=y
-
-#
-# Microsoft Hyper-V guest support
-#
-# end of Microsoft Hyper-V guest support
-
-CONFIG_GREYBUS=m
-CONFIG_GREYBUS_BEAGLEPLAY=m
-CONFIG_GREYBUS_ES2=m
-CONFIG_COMEDI=m
-# CONFIG_COMEDI_DEBUG is not set
-CONFIG_COMEDI_DEFAULT_BUF_SIZE_KB=2048
-CONFIG_COMEDI_DEFAULT_BUF_MAXSIZE_KB=20480
-# CONFIG_COMEDI_MISC_DRIVERS is not set
-CONFIG_COMEDI_PCI_DRIVERS=m
-CONFIG_COMEDI_8255_PCI=m
-CONFIG_COMEDI_ADDI_WATCHDOG=m
-CONFIG_COMEDI_ADDI_APCI_1032=m
-CONFIG_COMEDI_ADDI_APCI_1500=m
-CONFIG_COMEDI_ADDI_APCI_1516=m
-CONFIG_COMEDI_ADDI_APCI_1564=m
-CONFIG_COMEDI_ADDI_APCI_16XX=m
-CONFIG_COMEDI_ADDI_APCI_2032=m
-CONFIG_COMEDI_ADDI_APCI_2200=m
-CONFIG_COMEDI_ADDI_APCI_3120=m
-CONFIG_COMEDI_ADDI_APCI_3501=m
-CONFIG_COMEDI_ADDI_APCI_3XXX=m
-CONFIG_COMEDI_ADL_PCI6208=m
-CONFIG_COMEDI_ADL_PCI7250=m
-CONFIG_COMEDI_ADL_PCI7X3X=m
-CONFIG_COMEDI_ADL_PCI8164=m
-CONFIG_COMEDI_ADL_PCI9111=m
-CONFIG_COMEDI_ADL_PCI9118=m
-CONFIG_COMEDI_ADV_PCI1710=m
-CONFIG_COMEDI_ADV_PCI1720=m
-CONFIG_COMEDI_ADV_PCI1723=m
-CONFIG_COMEDI_ADV_PCI1724=m
-CONFIG_COMEDI_ADV_PCI1760=m
-CONFIG_COMEDI_ADV_PCI_DIO=m
-CONFIG_COMEDI_AMPLC_DIO200_PCI=m
-CONFIG_COMEDI_AMPLC_PC236_PCI=m
-CONFIG_COMEDI_AMPLC_PC263_PCI=m
-CONFIG_COMEDI_AMPLC_PCI224=m
-CONFIG_COMEDI_AMPLC_PCI230=m
-CONFIG_COMEDI_CONTEC_PCI_DIO=m
-CONFIG_COMEDI_DAS08_PCI=m
-CONFIG_COMEDI_DT3000=m
-CONFIG_COMEDI_DYNA_PCI10XX=m
-CONFIG_COMEDI_GSC_HPDI=m
-CONFIG_COMEDI_MF6X4=m
-CONFIG_COMEDI_ICP_MULTI=m
-CONFIG_COMEDI_DAQBOARD2000=m
-CONFIG_COMEDI_JR3_PCI=m
-CONFIG_COMEDI_KE_COUNTER=m
-CONFIG_COMEDI_CB_PCIDAS64=m
-CONFIG_COMEDI_CB_PCIDAS=m
-CONFIG_COMEDI_CB_PCIDDA=m
-CONFIG_COMEDI_CB_PCIMDAS=m
-CONFIG_COMEDI_CB_PCIMDDA=m
-CONFIG_COMEDI_ME4000=m
-CONFIG_COMEDI_ME_DAQ=m
-CONFIG_COMEDI_NI_6527=m
-CONFIG_COMEDI_NI_65XX=m
-CONFIG_COMEDI_NI_660X=m
-CONFIG_COMEDI_NI_670X=m
-CONFIG_COMEDI_NI_LABPC_PCI=m
-CONFIG_COMEDI_NI_PCIDIO=m
-CONFIG_COMEDI_NI_PCIMIO=m
-CONFIG_COMEDI_RTD520=m
-CONFIG_COMEDI_S626=m
-CONFIG_COMEDI_MITE=m
-CONFIG_COMEDI_NI_TIOCMD=m
-CONFIG_COMEDI_PCMCIA_DRIVERS=m
-CONFIG_COMEDI_CB_DAS16_CS=m
-CONFIG_COMEDI_DAS08_CS=m
-CONFIG_COMEDI_NI_DAQ_700_CS=m
-CONFIG_COMEDI_NI_DAQ_DIO24_CS=m
-CONFIG_COMEDI_NI_LABPC_CS=m
-CONFIG_COMEDI_NI_MIO_CS=m
-CONFIG_COMEDI_QUATECH_DAQP_CS=m
-CONFIG_COMEDI_USB_DRIVERS=m
-CONFIG_COMEDI_DT9812=m
-CONFIG_COMEDI_NI_USB6501=m
-CONFIG_COMEDI_USBDUX=m
-CONFIG_COMEDI_USBDUXFAST=m
-CONFIG_COMEDI_USBDUXSIGMA=m
-CONFIG_COMEDI_VMK80XX=m
-CONFIG_COMEDI_8254=m
-CONFIG_COMEDI_8255=m
-CONFIG_COMEDI_8255_SA=m
-CONFIG_COMEDI_KCOMEDILIB=m
-CONFIG_COMEDI_AMPLC_DIO200=m
-CONFIG_COMEDI_AMPLC_PC236=m
-CONFIG_COMEDI_DAS08=m
-CONFIG_COMEDI_NI_LABPC=m
-CONFIG_COMEDI_NI_TIO=m
-CONFIG_COMEDI_NI_ROUTING=m
-CONFIG_COMEDI_TESTS=m
-CONFIG_COMEDI_TESTS_EXAMPLE=m
-CONFIG_COMEDI_TESTS_NI_ROUTES=m
-CONFIG_STAGING=y
-CONFIG_RTL8723BS=m
-
-#
-# IIO staging drivers
-#
-
-#
-# Accelerometers
-#
-CONFIG_ADIS16203=m
-# end of Accelerometers
-
-#
-# Analog to digital converters
-#
-CONFIG_AD7816=m
-# end of Analog to digital converters
-
-#
-# Analog digital bi-direction converters
-#
-CONFIG_ADT7316=m
-CONFIG_ADT7316_SPI=m
-CONFIG_ADT7316_I2C=m
-# end of Analog digital bi-direction converters
-
-#
-# Direct Digital Synthesis
-#
-CONFIG_AD9832=m
-CONFIG_AD9834=m
-# end of Direct Digital Synthesis
-
-#
-# Network Analyzer, Impedance Converters
-#
-CONFIG_AD5933=m
-# end of Network Analyzer, Impedance Converters
-# end of IIO staging drivers
-
-CONFIG_FB_SM750=m
-CONFIG_STAGING_MEDIA=y
-CONFIG_DVB_AV7110_IR=y
-CONFIG_DVB_AV7110=m
-CONFIG_DVB_AV7110_OSD=y
-CONFIG_DVB_SP8870=m
-CONFIG_VIDEO_MAX96712=m
-
-#
-# StarFive media platform drivers
-#
-CONFIG_VIDEO_SUNXI=y
-CONFIG_VIDEO_SUNXI_CEDRUS=m
-# CONFIG_STAGING_MEDIA_DEPRECATED is not set
-CONFIG_FB_TFT=m
-CONFIG_FB_TFT_AGM1264K_FL=m
-CONFIG_FB_TFT_BD663474=m
-CONFIG_FB_TFT_HX8340BN=m
-CONFIG_FB_TFT_HX8347D=m
-CONFIG_FB_TFT_HX8353D=m
-CONFIG_FB_TFT_HX8357D=m
-CONFIG_FB_TFT_ILI9163=m
-CONFIG_FB_TFT_ILI9320=m
-CONFIG_FB_TFT_ILI9325=m
-CONFIG_FB_TFT_ILI9340=m
-CONFIG_FB_TFT_ILI9341=m
-CONFIG_FB_TFT_ILI9481=m
-CONFIG_FB_TFT_ILI9486=m
-CONFIG_FB_TFT_PCD8544=m
-CONFIG_FB_TFT_RA8875=m
-CONFIG_FB_TFT_S6D02A1=m
-CONFIG_FB_TFT_S6D1121=m
-CONFIG_FB_TFT_SEPS525=m
-CONFIG_FB_TFT_SH1106=m
-CONFIG_FB_TFT_SSD1289=m
-CONFIG_FB_TFT_SSD1305=m
-CONFIG_FB_TFT_SSD1306=m
-CONFIG_FB_TFT_SSD1331=m
-CONFIG_FB_TFT_SSD1351=m
-CONFIG_FB_TFT_ST7735R=m
-CONFIG_FB_TFT_ST7789V=m
-CONFIG_FB_TFT_TINYLCD=m
-CONFIG_FB_TFT_TLS8204=m
-CONFIG_FB_TFT_UC1611=m
-CONFIG_FB_TFT_UC1701=m
-CONFIG_FB_TFT_UPD161704=m
-CONFIG_MOST_COMPONENTS=m
-CONFIG_MOST_NET=m
-CONFIG_MOST_VIDEO=m
-CONFIG_MOST_DIM2=m
-CONFIG_GREYBUS_AUDIO=m
-CONFIG_GREYBUS_AUDIO_APB_CODEC=m
-CONFIG_GREYBUS_BOOTROM=m
-CONFIG_GREYBUS_FIRMWARE=m
-CONFIG_GREYBUS_HID=m
-CONFIG_GREYBUS_LIGHT=m
-CONFIG_GREYBUS_LOG=m
-CONFIG_GREYBUS_LOOPBACK=m
-CONFIG_GREYBUS_POWER=m
-CONFIG_GREYBUS_RAW=m
-CONFIG_GREYBUS_VIBRATOR=m
-CONFIG_GREYBUS_BRIDGED_PHY=m
-CONFIG_GREYBUS_GPIO=m
-CONFIG_GREYBUS_I2C=m
-CONFIG_GREYBUS_PWM=m
-CONFIG_GREYBUS_SDIO=m
-CONFIG_GREYBUS_SPI=m
-CONFIG_GREYBUS_UART=m
-CONFIG_GREYBUS_USB=m
-CONFIG_XIL_AXIS_FIFO=m
-# CONFIG_VME_BUS is not set
-CONFIG_GPIB=m
-CONFIG_GPIB_COMMON=m
-CONFIG_GPIB_AGILENT_82350B=m
-CONFIG_GPIB_AGILENT_82357A=m
-CONFIG_GPIB_CEC_PCI=m
-CONFIG_GPIB_NI_PCI_ISA=m
-CONFIG_GPIB_CB7210=m
-CONFIG_GPIB_NI_USB=m
-CONFIG_GPIB_FLUKE=m
-CONFIG_GPIB_FMH=m
-CONFIG_GPIB_INES=m
-CONFIG_GPIB_PCMCIA=y
-CONFIG_GPIB_LPVO=m
-CONFIG_GPIB_TMS9914=m
-CONFIG_GPIB_NEC7210=m
-CONFIG_GOLDFISH=y
-CONFIG_GOLDFISH_PIPE=m
-# CONFIG_SERIAL_MULTI_INSTANTIATE is not set
-CONFIG_HAVE_CLK=y
-CONFIG_HAVE_CLK_PREPARE=y
-CONFIG_COMMON_CLK=y
-CONFIG_LMK04832=m
-CONFIG_COMMON_CLK_MAX77686=m
-CONFIG_COMMON_CLK_MAX9485=m
-CONFIG_COMMON_CLK_RK808=m
-CONFIG_COMMON_CLK_RP1=m
-CONFIG_COMMON_CLK_SI5341=m
-CONFIG_COMMON_CLK_SI5351=m
-CONFIG_COMMON_CLK_SI514=m
-CONFIG_COMMON_CLK_SI544=m
-CONFIG_COMMON_CLK_SI570=m
-CONFIG_COMMON_CLK_CDCE706=m
-CONFIG_COMMON_CLK_CDCE925=m
-CONFIG_COMMON_CLK_CS2000_CP=m
-CONFIG_COMMON_CLK_AXI_CLKGEN=m
-CONFIG_COMMON_CLK_PWM=m
-CONFIG_COMMON_CLK_RS9_PCIE=m
-CONFIG_COMMON_CLK_SI521XX=m
-CONFIG_COMMON_CLK_VC3=m
-CONFIG_COMMON_CLK_VC5=m
-CONFIG_COMMON_CLK_VC7=m
-# CONFIG_COMMON_CLK_FIXED_MMIO is not set
-CONFIG_COMMON_CLK_RPMI=m
-CONFIG_CLK_ANALOGBITS_WRPLL_CLN28HPC=m
-CONFIG_MCHP_CLK_MPFS=y
-CONFIG_CLK_RENESAS=y
-# CONFIG_CLK_RCAR_USB2_CLOCK_SEL is not set
-CONFIG_CLK_SIFIVE=y
-CONFIG_CLK_SIFIVE_PRCI=m
-CONFIG_CLK_SOPHGO_CV1800=m
-CONFIG_CLK_SOPHGO_SG2042_PLL=m
-CONFIG_CLK_SOPHGO_SG2042_CLKGEN=m
-CONFIG_CLK_SOPHGO_SG2042_RPGATE=m
-CONFIG_CLK_SOPHGO_SG2044=m
-CONFIG_CLK_SOPHGO_SG2044_PLL=m
-CONFIG_SPACEMIT_CCU=m
-CONFIG_SPACEMIT_K1_CCU=m
-CONFIG_CLK_STARFIVE_JH71X0=y
-CONFIG_CLK_STARFIVE_JH7100=y
-CONFIG_CLK_STARFIVE_JH7100_AUDIO=m
-CONFIG_CLK_STARFIVE_JH7110_PLL=y
-CONFIG_CLK_STARFIVE_JH7110_SYS=y
-CONFIG_CLK_STARFIVE_JH7110_AON=m
-CONFIG_CLK_STARFIVE_JH7110_STG=m
-CONFIG_CLK_STARFIVE_JH7110_ISP=m
-CONFIG_CLK_STARFIVE_JH7110_VOUT=m
-CONFIG_SUNXI_CCU=m
-CONFIG_SUN20I_D1_CCU=m
-CONFIG_SUN20I_D1_R_CCU=m
-CONFIG_SUN6I_RTC_CCU=m
-CONFIG_SUN8I_DE2_CCU=m
-CONFIG_CLK_THEAD_TH1520_AP=y
-CONFIG_XILINX_VCU=m
-CONFIG_COMMON_CLK_XLNX_CLKWZRD=m
-# CONFIG_HWSPINLOCK is not set
-
-#
-# Clock Source drivers
-#
-CONFIG_TIMER_OF=y
-CONFIG_TIMER_PROBE=y
-CONFIG_CLKSRC_MMIO=y
-CONFIG_SUN4I_TIMER=y
-CONFIG_RENESAS_OSTM=y
-CONFIG_RISCV_TIMER=y
-# end of Clock Source drivers
-
-CONFIG_MAILBOX=y
-CONFIG_ARM_MHU=m
-CONFIG_ARM_MHU_V2=m
-CONFIG_CV1800_MBOX=m
-CONFIG_PLATFORM_MHU=m
-CONFIG_PL320_MBOX=y
-CONFIG_PCC=y
-CONFIG_ALTERA_MBOX=m
-CONFIG_MAILBOX_TEST=m
-CONFIG_POLARFIRE_SOC_MAILBOX=m
-CONFIG_MCHP_SBI_IPC_MBOX=m
-CONFIG_SUN6I_MSGBOX=m
-CONFIG_THEAD_TH1520_MBOX=m
-CONFIG_RISCV_SBI_MPXY_MBOX=m
-CONFIG_IOMMU_IOVA=m
-CONFIG_IOMMU_API=y
-CONFIG_IOMMUFD_DRIVER=y
-CONFIG_IOMMU_SUPPORT=y
-
-#
-# Generic IOMMU Pagetable Support
-#
-# end of Generic IOMMU Pagetable Support
-
-# CONFIG_IOMMU_DEBUGFS is not set
-# CONFIG_IOMMU_DEFAULT_DMA_STRICT is not set
-CONFIG_IOMMU_DEFAULT_DMA_LAZY=y
-# CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set
-CONFIG_OF_IOMMU=y
-CONFIG_IOMMUFD_DRIVER_CORE=y
-CONFIG_IOMMUFD=m
-CONFIG_RISCV_IOMMU=y
-CONFIG_RISCV_IOMMU_PCI=y
-CONFIG_SUN50I_IOMMU=y
-
-#
-# Remoteproc drivers
-#
-# CONFIG_REMOTEPROC is not set
-# end of Remoteproc drivers
-
-#
-# Rpmsg drivers
-#
-CONFIG_RPMSG=m
-CONFIG_RPMSG_CHAR=m
-CONFIG_RPMSG_CTRL=m
-CONFIG_RPMSG_NS=m
-CONFIG_RPMSG_QCOM_GLINK=m
-CONFIG_RPMSG_QCOM_GLINK_RPM=m
-CONFIG_RPMSG_VIRTIO=m
-# end of Rpmsg drivers
-
-CONFIG_SOUNDWIRE=m
-
-#
-# SoundWire Devices
-#
-CONFIG_SOUNDWIRE_AMD=m
-CONFIG_SOUNDWIRE_CADENCE=m
-CONFIG_SOUNDWIRE_INTEL=m
-CONFIG_SOUNDWIRE_QCOM=m
-CONFIG_SOUNDWIRE_GENERIC_ALLOCATION=m
-
-#
-# SOC (System On Chip) specific Drivers
-#
-
-#
-# Amlogic SoC drivers
-#
-# end of Amlogic SoC drivers
-
-#
-# Broadcom SoC drivers
-#
-# end of Broadcom SoC drivers
-
-#
-# NXP/Freescale QorIQ SoC drivers
-#
-# end of NXP/Freescale QorIQ SoC drivers
-
-#
-# fujitsu SoC drivers
-#
-# end of fujitsu SoC drivers
-
-#
-# i.MX SoC drivers
-#
-# end of i.MX SoC drivers
-
-#
-# Enable LiteX SoC Builder specific drivers
-#
-CONFIG_LITEX=y
-CONFIG_LITEX_SOC_CONTROLLER=m
-# end of Enable LiteX SoC Builder specific drivers
-
-CONFIG_POLARFIRE_SOC_SYS_CTRL=m
-CONFIG_WPCM450_SOC=m
-
-#
-# Qualcomm SoC drivers
-#
-CONFIG_QCOM_PDR_HELPERS=m
-CONFIG_QCOM_PDR_MSG=m
-CONFIG_QCOM_PMIC_PDCHARGER_ULOG=m
-CONFIG_QCOM_PMIC_GLINK=m
-CONFIG_QCOM_QMI_HELPERS=m
-CONFIG_QCOM_PBS=m
-# end of Qualcomm SoC drivers
-
-CONFIG_SOC_RENESAS=y
-
-#
-# Sophgo SoC drivers
-#
-CONFIG_SOPHGO_CV1800_RTCSYS=m
-CONFIG_SOPHGO_SG2044_TOPSYS=m
-# end of Sophgo SoC drivers
-
-CONFIG_SUNXI_SRAM=y
-# CONFIG_SOC_TI is not set
-
-#
-# Xilinx SoC drivers
-#
-# end of Xilinx SoC drivers
-# end of SOC (System On Chip) specific Drivers
-
-#
-# PM Domains
-#
-
-#
-# Amlogic PM Domains
-#
-# end of Amlogic PM Domains
-
-#
-# Broadcom PM Domains
-#
-# end of Broadcom PM Domains
-
-#
-# i.MX PM Domains
-#
-# end of i.MX PM Domains
-
-#
-# Qualcomm PM Domains
-#
-# end of Qualcomm PM Domains
-
-#
-# Renesas PM Domains
-#
-# end of Renesas PM Domains
-
-CONFIG_JH71XX_PMU=y
-CONFIG_SUN20I_PPU=y
-CONFIG_SUN50I_H6_PRCM_PPU=m
-CONFIG_SUN55I_PCK600=m
-CONFIG_TH1520_PM_DOMAINS=m
-# end of PM Domains
-
-CONFIG_PM_DEVFREQ=y
-
-#
-# DEVFREQ Governors
-#
-CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=m
-CONFIG_DEVFREQ_GOV_PERFORMANCE=m
-CONFIG_DEVFREQ_GOV_POWERSAVE=m
-CONFIG_DEVFREQ_GOV_USERSPACE=m
-CONFIG_DEVFREQ_GOV_PASSIVE=m
-
-#
-# DEVFREQ Drivers
-#
-CONFIG_ARM_HISI_UNCORE_DEVFREQ=m
-CONFIG_ARM_SUN8I_A33_MBUS_DEVFREQ=m
-# CONFIG_PM_DEVFREQ_EVENT is not set
-CONFIG_EXTCON=y
-
-#
-# Extcon Device Drivers
-#
-CONFIG_EXTCON_ADC_JACK=m
-CONFIG_EXTCON_FSA9480=m
-CONFIG_EXTCON_GPIO=m
-CONFIG_EXTCON_LC824206XA=m
-CONFIG_EXTCON_MAX14577=m
-CONFIG_EXTCON_MAX3355=m
-CONFIG_EXTCON_MAX77693=m
-CONFIG_EXTCON_MAX14526=m
-CONFIG_EXTCON_PTN5150=m
-CONFIG_EXTCON_RT8973A=m
-CONFIG_EXTCON_SM5502=m
-CONFIG_EXTCON_USB_GPIO=m
-CONFIG_EXTCON_USBC_TUSB320=m
-# CONFIG_MEMORY is not set
-CONFIG_IIO=m
-CONFIG_IIO_BUFFER=y
-CONFIG_IIO_BUFFER_CB=m
-CONFIG_IIO_BUFFER_DMA=m
-CONFIG_IIO_BUFFER_DMAENGINE=m
-CONFIG_IIO_BUFFER_HW_CONSUMER=m
-CONFIG_IIO_KFIFO_BUF=m
-CONFIG_IIO_TRIGGERED_BUFFER=m
-CONFIG_IIO_CONFIGFS=m
-CONFIG_IIO_GTS_HELPER=m
-CONFIG_IIO_TRIGGER=y
-CONFIG_IIO_CONSUMERS_PER_TRIGGER=2
-CONFIG_IIO_SW_DEVICE=m
-CONFIG_IIO_SW_TRIGGER=m
-CONFIG_IIO_TRIGGERED_EVENT=m
-CONFIG_IIO_BACKEND=m
-
-#
-# Accelerometers
-#
-CONFIG_ADIS16201=m
-CONFIG_ADIS16209=m
-CONFIG_ADXL313=m
-CONFIG_ADXL313_I2C=m
-CONFIG_ADXL313_SPI=m
-CONFIG_ADXL355=m
-CONFIG_ADXL355_I2C=m
-CONFIG_ADXL355_SPI=m
-CONFIG_ADXL367=m
-CONFIG_ADXL367_SPI=m
-CONFIG_ADXL367_I2C=m
-CONFIG_ADXL372=m
-CONFIG_ADXL372_SPI=m
-CONFIG_ADXL372_I2C=m
-CONFIG_ADXL380=m
-CONFIG_ADXL380_SPI=m
-CONFIG_ADXL380_I2C=m
-CONFIG_BMA220=m
-CONFIG_BMA400=m
-CONFIG_BMA400_I2C=m
-CONFIG_BMA400_SPI=m
-CONFIG_BMC150_ACCEL=m
-CONFIG_BMC150_ACCEL_I2C=m
-CONFIG_BMC150_ACCEL_SPI=m
-CONFIG_BMI088_ACCEL=m
-CONFIG_BMI088_ACCEL_I2C=m
-CONFIG_BMI088_ACCEL_SPI=m
-CONFIG_DA280=m
-CONFIG_DA311=m
-CONFIG_DMARD06=m
-CONFIG_DMARD09=m
-CONFIG_DMARD10=m
-CONFIG_FXLS8962AF=m
-CONFIG_FXLS8962AF_I2C=m
-CONFIG_FXLS8962AF_SPI=m
-CONFIG_HID_SENSOR_ACCEL_3D=m
-CONFIG_IIO_ST_ACCEL_3AXIS=m
-CONFIG_IIO_ST_ACCEL_I2C_3AXIS=m
-CONFIG_IIO_ST_ACCEL_SPI_3AXIS=m
-CONFIG_IIO_KX022A=m
-CONFIG_IIO_KX022A_SPI=m
-CONFIG_IIO_KX022A_I2C=m
-CONFIG_KXSD9=m
-CONFIG_KXSD9_SPI=m
-CONFIG_KXSD9_I2C=m
-CONFIG_KXCJK1013=m
-CONFIG_MC3230=m
-CONFIG_MMA7455=m
-CONFIG_MMA7455_I2C=m
-CONFIG_MMA7455_SPI=m
-CONFIG_MMA7660=m
-CONFIG_MMA8452=m
-CONFIG_MMA9551_CORE=m
-CONFIG_MMA9551=m
-CONFIG_MMA9553=m
-CONFIG_MSA311=m
-CONFIG_MXC4005=m
-CONFIG_MXC6255=m
-CONFIG_SCA3000=m
-CONFIG_SCA3300=m
-CONFIG_STK8312=m
-CONFIG_STK8BA50=m
-# end of Accelerometers
-
-#
-# Analog to digital converters
-#
-CONFIG_IIO_ADC_HELPER=m
-CONFIG_AD_SIGMA_DELTA=m
-CONFIG_AD4000=m
-CONFIG_AD4030=m
-CONFIG_AD4080=m
-CONFIG_AD4130=m
-CONFIG_AD4170_4=m
-CONFIG_AD4695=m
-CONFIG_AD4851=m
-CONFIG_AD7091R=m
-CONFIG_AD7091R5=m
-CONFIG_AD7091R8=m
-CONFIG_AD7124=m
-CONFIG_AD7173=m
-CONFIG_AD7191=m
-CONFIG_AD7192=m
-CONFIG_AD7266=m
-CONFIG_AD7280=m
-CONFIG_AD7291=m
-CONFIG_AD7292=m
-CONFIG_AD7298=m
-CONFIG_AD7380=m
-CONFIG_AD7405=m
-CONFIG_AD7476=m
-CONFIG_AD7606=m
-CONFIG_AD7606_IFACE_PARALLEL=m
-CONFIG_AD7606_IFACE_SPI=m
-CONFIG_AD7625=m
-CONFIG_AD7766=m
-CONFIG_AD7768_1=m
-CONFIG_AD7779=m
-CONFIG_AD7780=m
-CONFIG_AD7791=m
-CONFIG_AD7793=m
-CONFIG_AD7887=m
-CONFIG_AD7923=m
-CONFIG_AD7944=m
-CONFIG_AD7949=m
-CONFIG_AD799X=m
-CONFIG_AD9467=m
-CONFIG_ADE9000=m
-CONFIG_AXP20X_ADC=m
-CONFIG_AXP288_ADC=m
-CONFIG_CC10001_ADC=m
-CONFIG_CPCAP_ADC=m
-CONFIG_DA9150_GPADC=m
-CONFIG_DLN2_ADC=m
-CONFIG_ENVELOPE_DETECTOR=m
-CONFIG_GEHC_PMC_ADC=m
-CONFIG_HI8435=m
-CONFIG_HX711=m
-CONFIG_INA2XX_ADC=m
-CONFIG_LTC2309=m
-CONFIG_LTC2471=m
-CONFIG_LTC2485=m
-CONFIG_LTC2496=m
-CONFIG_LTC2497=m
-CONFIG_MAX1027=m
-CONFIG_MAX11100=m
-CONFIG_MAX1118=m
-CONFIG_MAX11205=m
-CONFIG_MAX11410=m
-CONFIG_MAX1241=m
-CONFIG_MAX1363=m
-CONFIG_MAX34408=m
-CONFIG_MAX9611=m
-CONFIG_MCP320X=m
-CONFIG_MCP3422=m
-CONFIG_MCP3564=m
-CONFIG_MCP3911=m
-CONFIG_MEDIATEK_MT6359_AUXADC=m
-CONFIG_MEDIATEK_MT6360_ADC=m
-CONFIG_MEDIATEK_MT6370_ADC=m
-CONFIG_MEN_Z188_ADC=m
-CONFIG_MP2629_ADC=m
-CONFIG_NAU7802=m
-CONFIG_NCT7201=m
-CONFIG_PAC1921=m
-CONFIG_PAC1934=m
-CONFIG_QCOM_VADC_COMMON=m
-CONFIG_QCOM_SPMI_IADC=m
-CONFIG_QCOM_SPMI_VADC=m
-CONFIG_QCOM_SPMI_ADC5=m
-CONFIG_RN5T618_ADC=m
-CONFIG_ROHM_BD79112=m
-CONFIG_ROHM_BD79124=m
-CONFIG_RICHTEK_RTQ6056=m
-CONFIG_SOPHGO_CV1800B_ADC=m
-CONFIG_SD_ADC_MODULATOR=m
-CONFIG_SUN4I_GPADC=m
-CONFIG_SUN20I_GPADC=m
-CONFIG_TI_ADC081C=m
-CONFIG_TI_ADC0832=m
-CONFIG_TI_ADC084S021=m
-CONFIG_TI_ADC108S102=m
-CONFIG_TI_ADC12138=m
-CONFIG_TI_ADC128S052=m
-CONFIG_TI_ADC161S626=m
-CONFIG_TI_ADS1015=m
-CONFIG_TI_ADS1100=m
-CONFIG_TI_ADS1119=m
-CONFIG_TI_ADS124S08=m
-CONFIG_TI_ADS1298=m
-CONFIG_TI_ADS131E08=m
-CONFIG_TI_ADS7138=m
-CONFIG_TI_ADS7924=m
-CONFIG_TI_ADS7950=m
-CONFIG_TI_ADS8344=m
-CONFIG_TI_ADS8688=m
-CONFIG_TI_LMP92064=m
-CONFIG_TI_TLC4541=m
-CONFIG_TI_TSC2046=m
-CONFIG_VF610_ADC=m
-CONFIG_VIPERBOARD_ADC=m
-CONFIG_XILINX_XADC=m
-# end of Analog to digital converters
-
-#
-# Analog to digital and digital to analog converters
-#
-CONFIG_AD74115=m
-CONFIG_AD74413R=m
-# end of Analog to digital and digital to analog converters
-
-#
-# Analog Front Ends
-#
-CONFIG_IIO_RESCALE=m
-# end of Analog Front Ends
-
-#
-# Amplifiers
-#
-CONFIG_AD8366=m
-CONFIG_ADA4250=m
-CONFIG_HMC425=m
-# end of Amplifiers
-
-#
-# Capacitance to digital converters
-#
-CONFIG_AD7150=m
-CONFIG_AD7746=m
-# end of Capacitance to digital converters
-
-#
-# Chemical Sensors
-#
-CONFIG_AOSONG_AGS02MA=m
-CONFIG_ATLAS_PH_SENSOR=m
-CONFIG_ATLAS_EZO_SENSOR=m
-CONFIG_BME680=m
-CONFIG_BME680_I2C=m
-CONFIG_BME680_SPI=m
-CONFIG_CCS811=m
-CONFIG_ENS160=m
-CONFIG_ENS160_I2C=m
-CONFIG_ENS160_SPI=m
-CONFIG_IAQCORE=m
-CONFIG_MHZ19B=m
-CONFIG_PMS7003=m
-CONFIG_SCD30_CORE=m
-CONFIG_SCD30_I2C=m
-CONFIG_SCD30_SERIAL=m
-CONFIG_SCD4X=m
-CONFIG_SEN0322=m
-CONFIG_SENSIRION_SGP30=m
-CONFIG_SENSIRION_SGP40=m
-CONFIG_SPS30=m
-CONFIG_SPS30_I2C=m
-CONFIG_SPS30_SERIAL=m
-CONFIG_SENSEAIR_SUNRISE_CO2=m
-CONFIG_VZ89X=m
-# end of Chemical Sensors
-
-#
-# Hid Sensor IIO Common
-#
-CONFIG_HID_SENSOR_IIO_COMMON=m
-CONFIG_HID_SENSOR_IIO_TRIGGER=m
-# end of Hid Sensor IIO Common
-
-CONFIG_IIO_INV_SENSORS_TIMESTAMP=m
-CONFIG_IIO_MS_SENSORS_I2C=m
-
-#
-# IIO SCMI Sensors
-#
-# end of IIO SCMI Sensors
-
-#
-# SSP Sensor Common
-#
-CONFIG_IIO_SSP_SENSORS_COMMONS=m
-CONFIG_IIO_SSP_SENSORHUB=m
-# end of SSP Sensor Common
-
-CONFIG_IIO_ST_SENSORS_I2C=m
-CONFIG_IIO_ST_SENSORS_SPI=m
-CONFIG_IIO_ST_SENSORS_CORE=m
-
-#
-# Digital to analog converters
-#
-CONFIG_AD3530R=m
-CONFIG_AD3552R_HS=m
-CONFIG_AD3552R_LIB=m
-CONFIG_AD3552R=m
-CONFIG_AD5064=m
-CONFIG_AD5360=m
-CONFIG_AD5380=m
-CONFIG_AD5421=m
-CONFIG_AD5446=m
-CONFIG_AD5449=m
-CONFIG_AD5592R_BASE=m
-CONFIG_AD5592R=m
-CONFIG_AD5593R=m
-CONFIG_AD5504=m
-CONFIG_AD5624R_SPI=m
-CONFIG_AD9739A=m
-CONFIG_LTC2688=m
-CONFIG_AD5686=m
-CONFIG_AD5686_SPI=m
-CONFIG_AD5696_I2C=m
-CONFIG_AD5755=m
-CONFIG_AD5758=m
-CONFIG_AD5761=m
-CONFIG_AD5764=m
-CONFIG_AD5766=m
-CONFIG_AD5770R=m
-CONFIG_AD5791=m
-CONFIG_AD7293=m
-CONFIG_AD7303=m
-CONFIG_AD8460=m
-CONFIG_AD8801=m
-CONFIG_BD79703=m
-CONFIG_DPOT_DAC=m
-CONFIG_DS4424=m
-CONFIG_LTC1660=m
-CONFIG_LTC2632=m
-CONFIG_LTC2664=m
-CONFIG_M62332=m
-CONFIG_MAX517=m
-CONFIG_MAX5522=m
-CONFIG_MAX5821=m
-CONFIG_MCP4725=m
-CONFIG_MCP4728=m
-CONFIG_MCP4821=m
-CONFIG_MCP4922=m
-CONFIG_TI_DAC082S085=m
-CONFIG_TI_DAC5571=m
-CONFIG_TI_DAC7311=m
-CONFIG_TI_DAC7612=m
-CONFIG_VF610_DAC=m
-# end of Digital to analog converters
-
-#
-# IIO dummy driver
-#
-CONFIG_IIO_SIMPLE_DUMMY=m
-# CONFIG_IIO_SIMPLE_DUMMY_EVENTS is not set
-# CONFIG_IIO_SIMPLE_DUMMY_BUFFER is not set
-# end of IIO dummy driver
-
-#
-# Filters
-#
-CONFIG_ADMV8818=m
-# end of Filters
-
-#
-# Frequency Synthesizers DDS/PLL
-#
-
-#
-# Clock Generator/Distribution
-#
-CONFIG_AD9523=m
-# end of Clock Generator/Distribution
-
-#
-# Phase-Locked Loop (PLL) frequency synthesizers
-#
-CONFIG_ADF4350=m
-CONFIG_ADF4371=m
-CONFIG_ADF4377=m
-CONFIG_ADMFM2000=m
-CONFIG_ADMV1013=m
-CONFIG_ADMV1014=m
-CONFIG_ADMV4420=m
-CONFIG_ADRF6780=m
-# end of Phase-Locked Loop (PLL) frequency synthesizers
-# end of Frequency Synthesizers DDS/PLL
-
-#
-# Digital gyroscope sensors
-#
-CONFIG_ADIS16080=m
-CONFIG_ADIS16130=m
-CONFIG_ADIS16136=m
-CONFIG_ADIS16260=m
-CONFIG_ADXRS290=m
-CONFIG_ADXRS450=m
-CONFIG_BMG160=m
-CONFIG_BMG160_I2C=m
-CONFIG_BMG160_SPI=m
-CONFIG_FXAS21002C=m
-CONFIG_FXAS21002C_I2C=m
-CONFIG_FXAS21002C_SPI=m
-CONFIG_HID_SENSOR_GYRO_3D=m
-CONFIG_MPU3050=m
-CONFIG_MPU3050_I2C=m
-CONFIG_IIO_ST_GYRO_3AXIS=m
-CONFIG_IIO_ST_GYRO_I2C_3AXIS=m
-CONFIG_IIO_ST_GYRO_SPI_3AXIS=m
-CONFIG_ITG3200=m
-# end of Digital gyroscope sensors
-
-#
-# Health Sensors
-#
-
-#
-# Heart Rate Monitors
-#
-CONFIG_AFE4403=m
-CONFIG_AFE4404=m
-CONFIG_MAX30100=m
-CONFIG_MAX30102=m
-# end of Heart Rate Monitors
-# end of Health Sensors
-
-#
-# Humidity sensors
-#
-CONFIG_AM2315=m
-CONFIG_DHT11=m
-CONFIG_ENS210=m
-CONFIG_HDC100X=m
-CONFIG_HDC2010=m
-CONFIG_HDC3020=m
-CONFIG_HID_SENSOR_HUMIDITY=m
-CONFIG_HTS221=m
-CONFIG_HTS221_I2C=m
-CONFIG_HTS221_SPI=m
-CONFIG_HTU21=m
-CONFIG_SI7005=m
-CONFIG_SI7020=m
-# end of Humidity sensors
-
-#
-# Inertial measurement units
-#
-CONFIG_ADIS16400=m
-CONFIG_ADIS16460=m
-CONFIG_ADIS16475=m
-CONFIG_ADIS16480=m
-CONFIG_ADIS16550=m
-CONFIG_BMI160=m
-CONFIG_BMI160_I2C=m
-CONFIG_BMI160_SPI=m
-CONFIG_BMI270=m
-CONFIG_BMI270_I2C=m
-CONFIG_BMI270_SPI=m
-CONFIG_BMI323=m
-CONFIG_BMI323_I2C=m
-CONFIG_BMI323_SPI=m
-CONFIG_BOSCH_BNO055=m
-CONFIG_BOSCH_BNO055_SERIAL=m
-CONFIG_BOSCH_BNO055_I2C=m
-CONFIG_FXOS8700=m
-CONFIG_FXOS8700_I2C=m
-CONFIG_FXOS8700_SPI=m
-CONFIG_KMX61=m
-CONFIG_INV_ICM42600=m
-CONFIG_INV_ICM42600_I2C=m
-CONFIG_INV_ICM42600_SPI=m
-CONFIG_INV_MPU6050_IIO=m
-CONFIG_INV_MPU6050_I2C=m
-CONFIG_INV_MPU6050_SPI=m
-CONFIG_SMI240=m
-CONFIG_IIO_ST_LSM6DSX=m
-CONFIG_IIO_ST_LSM6DSX_I2C=m
-CONFIG_IIO_ST_LSM6DSX_SPI=m
-CONFIG_IIO_ST_LSM6DSX_I3C=m
-CONFIG_IIO_ST_LSM9DS0=m
-CONFIG_IIO_ST_LSM9DS0_I2C=m
-CONFIG_IIO_ST_LSM9DS0_SPI=m
-# end of Inertial measurement units
-
-CONFIG_IIO_ADIS_LIB=m
-CONFIG_IIO_ADIS_LIB_BUFFER=y
-
-#
-# Light sensors
-#
-CONFIG_ACPI_ALS=m
-CONFIG_ADJD_S311=m
-CONFIG_ADUX1020=m
-CONFIG_AL3000A=m
-CONFIG_AL3010=m
-CONFIG_AL3320A=m
-CONFIG_APDS9160=m
-CONFIG_APDS9300=m
-CONFIG_APDS9306=m
-CONFIG_APDS9960=m
-CONFIG_AS73211=m
-CONFIG_BH1745=m
-CONFIG_BH1750=m
-CONFIG_BH1780=m
-CONFIG_CM32181=m
-CONFIG_CM3232=m
-CONFIG_CM3323=m
-CONFIG_CM3605=m
-CONFIG_CM36651=m
-CONFIG_GP2AP002=m
-CONFIG_GP2AP020A00F=m
-CONFIG_IQS621_ALS=m
-CONFIG_SENSORS_ISL29018=m
-CONFIG_SENSORS_ISL29028=m
-CONFIG_ISL29125=m
-CONFIG_ISL76682=m
-CONFIG_HID_SENSOR_ALS=m
-CONFIG_HID_SENSOR_PROX=m
-CONFIG_JSA1212=m
-CONFIG_ROHM_BU27034=m
-CONFIG_RPR0521=m
-CONFIG_SENSORS_LM3533=m
-CONFIG_LTR390=m
-CONFIG_LTR501=m
-CONFIG_LTRF216A=m
-CONFIG_LV0104CS=m
-CONFIG_MAX44000=m
-CONFIG_MAX44009=m
-CONFIG_NOA1305=m
-CONFIG_OPT3001=m
-CONFIG_OPT4001=m
-CONFIG_OPT4060=m
-CONFIG_PA12203001=m
-CONFIG_SI1133=m
-CONFIG_SI1145=m
-CONFIG_STK3310=m
-CONFIG_ST_UVIS25=m
-CONFIG_ST_UVIS25_I2C=m
-CONFIG_ST_UVIS25_SPI=m
-CONFIG_TCS3414=m
-CONFIG_TCS3472=m
-CONFIG_SENSORS_TSL2563=m
-CONFIG_TSL2583=m
-CONFIG_TSL2591=m
-CONFIG_TSL2772=m
-CONFIG_TSL4531=m
-CONFIG_US5182D=m
-CONFIG_VCNL4000=m
-CONFIG_VCNL4035=m
-CONFIG_VEML3235=m
-CONFIG_VEML6030=m
-CONFIG_VEML6040=m
-CONFIG_VEML6046X00=m
-CONFIG_VEML6070=m
-CONFIG_VEML6075=m
-CONFIG_VL6180=m
-CONFIG_ZOPT2201=m
-# end of Light sensors
-
-#
-# Magnetometer sensors
-#
-CONFIG_AF8133J=m
-CONFIG_AK8974=m
-CONFIG_AK8975=m
-CONFIG_AK09911=m
-CONFIG_ALS31300=m
-CONFIG_BMC150_MAGN=m
-CONFIG_BMC150_MAGN_I2C=m
-CONFIG_BMC150_MAGN_SPI=m
-CONFIG_MAG3110=m
-CONFIG_HID_SENSOR_MAGNETOMETER_3D=m
-CONFIG_MMC35240=m
-CONFIG_IIO_ST_MAGN_3AXIS=m
-CONFIG_IIO_ST_MAGN_I2C_3AXIS=m
-CONFIG_IIO_ST_MAGN_SPI_3AXIS=m
-CONFIG_INFINEON_TLV493D=m
-CONFIG_SENSORS_HMC5843=m
-CONFIG_SENSORS_HMC5843_I2C=m
-CONFIG_SENSORS_HMC5843_SPI=m
-CONFIG_SENSORS_RM3100=m
-CONFIG_SENSORS_RM3100_I2C=m
-CONFIG_SENSORS_RM3100_SPI=m
-CONFIG_SI7210=m
-CONFIG_TI_TMAG5273=m
-CONFIG_YAMAHA_YAS530=m
-# end of Magnetometer sensors
-
-#
-# Multiplexers
-#
-CONFIG_IIO_MUX=m
-# end of Multiplexers
-
-#
-# Inclinometer sensors
-#
-CONFIG_HID_SENSOR_INCLINOMETER_3D=m
-CONFIG_HID_SENSOR_DEVICE_ROTATION=m
-# end of Inclinometer sensors
-
-#
-# Triggers - standalone
-#
-CONFIG_IIO_HRTIMER_TRIGGER=m
-CONFIG_IIO_INTERRUPT_TRIGGER=m
-CONFIG_IIO_TIGHTLOOP_TRIGGER=m
-CONFIG_IIO_SYSFS_TRIGGER=m
-# end of Triggers - standalone
-
-#
-# Linear and angular position sensors
-#
-CONFIG_IQS624_POS=m
-CONFIG_HID_SENSOR_CUSTOM_INTEL_HINGE=m
-# end of Linear and angular position sensors
-
-#
-# Digital potentiometers
-#
-CONFIG_AD5110=m
-CONFIG_AD5272=m
-CONFIG_DS1803=m
-CONFIG_MAX5432=m
-CONFIG_MAX5481=m
-CONFIG_MAX5487=m
-CONFIG_MCP4018=m
-CONFIG_MCP4131=m
-CONFIG_MCP4531=m
-CONFIG_MCP41010=m
-CONFIG_TPL0102=m
-CONFIG_X9250=m
-# end of Digital potentiometers
-
-#
-# Digital potentiostats
-#
-CONFIG_LMP91000=m
-# end of Digital potentiostats
-
-#
-# Pressure sensors
-#
-CONFIG_ABP060MG=m
-CONFIG_ROHM_BM1390=m
-CONFIG_BMP280=m
-CONFIG_BMP280_I2C=m
-CONFIG_BMP280_SPI=m
-CONFIG_DLHL60D=m
-CONFIG_DPS310=m
-CONFIG_HID_SENSOR_PRESS=m
-CONFIG_HP03=m
-CONFIG_HSC030PA=m
-CONFIG_HSC030PA_I2C=m
-CONFIG_HSC030PA_SPI=m
-CONFIG_ICP10100=m
-CONFIG_MPL115=m
-CONFIG_MPL115_I2C=m
-CONFIG_MPL115_SPI=m
-CONFIG_MPL3115=m
-CONFIG_MPRLS0025PA=m
-CONFIG_MPRLS0025PA_I2C=m
-CONFIG_MPRLS0025PA_SPI=m
-CONFIG_MS5611=m
-CONFIG_MS5611_I2C=m
-CONFIG_MS5611_SPI=m
-CONFIG_MS5637=m
-CONFIG_SDP500=m
-CONFIG_IIO_ST_PRESS=m
-CONFIG_IIO_ST_PRESS_I2C=m
-CONFIG_IIO_ST_PRESS_SPI=m
-CONFIG_T5403=m
-CONFIG_HP206C=m
-CONFIG_ZPA2326=m
-CONFIG_ZPA2326_I2C=m
-CONFIG_ZPA2326_SPI=m
-# end of Pressure sensors
-
-#
-# Lightning sensors
-#
-CONFIG_AS3935=m
-# end of Lightning sensors
-
-#
-# Proximity and distance sensors
-#
-CONFIG_D3323AA=m
-CONFIG_HX9023S=m
-CONFIG_IRSD200=m
-CONFIG_ISL29501=m
-CONFIG_LIDAR_LITE_V2=m
-CONFIG_MB1232=m
-CONFIG_PING=m
-CONFIG_RFD77402=m
-CONFIG_SRF04=m
-CONFIG_SX_COMMON=m
-CONFIG_SX9310=m
-CONFIG_SX9324=m
-CONFIG_SX9360=m
-CONFIG_SX9500=m
-CONFIG_SRF08=m
-CONFIG_VCNL3020=m
-CONFIG_VL53L0X_I2C=m
-CONFIG_AW96103=m
-# end of Proximity and distance sensors
-
-#
-# Resolver to digital converters
-#
-CONFIG_AD2S90=m
-CONFIG_AD2S1200=m
-CONFIG_AD2S1210=m
-# end of Resolver to digital converters
-
-#
-# Temperature sensors
-#
-CONFIG_IQS620AT_TEMP=m
-CONFIG_LTC2983=m
-CONFIG_MAXIM_THERMOCOUPLE=m
-CONFIG_HID_SENSOR_TEMP=m
-CONFIG_MLX90614=m
-CONFIG_MLX90632=m
-CONFIG_MLX90635=m
-CONFIG_TMP006=m
-CONFIG_TMP007=m
-CONFIG_TMP117=m
-CONFIG_TSYS01=m
-CONFIG_TSYS02D=m
-CONFIG_MAX30208=m
-CONFIG_MAX31856=m
-CONFIG_MAX31865=m
-CONFIG_MCP9600=m
-# end of Temperature sensors
-
-CONFIG_NTB=m
-# CONFIG_NTB_MSI is not set
-CONFIG_NTB_IDT=m
-CONFIG_NTB_EPF=m
-CONFIG_NTB_SWITCHTEC=m
-CONFIG_NTB_PINGPONG=m
-CONFIG_NTB_TOOL=m
-CONFIG_NTB_PERF=m
-CONFIG_NTB_TRANSPORT=m
-CONFIG_PWM=y
-# CONFIG_PWM_DEBUG is not set
-CONFIG_PWM_PROVIDE_GPIO=y
-CONFIG_PWM_ADP5585=m
-CONFIG_PWM_ARGON_FAN_HAT=m
-CONFIG_PWM_ATMEL_HLCDC_PWM=m
-CONFIG_PWM_ATMEL_TCB=m
-CONFIG_PWM_CLK=m
-CONFIG_PWM_DWC_CORE=m
-CONFIG_PWM_DWC=m
-CONFIG_PWM_FSL_FTM=m
-CONFIG_PWM_GPIO=m
-CONFIG_PWM_IQS620A=m
-CONFIG_PWM_LP3943=m
-CONFIG_PWM_MAX7360=m
-CONFIG_PWM_MC33XS2410=m
-CONFIG_PWM_MICROCHIP_CORE=m
-CONFIG_PWM_NTXEC=m
-CONFIG_PWM_PCA9685=m
-CONFIG_PWM_PXA=m
-CONFIG_PWM_RENESAS_RCAR=m
-CONFIG_PWM_RENESAS_TPU=m
-CONFIG_PWM_SIFIVE=m
-CONFIG_PWM_SOPHGO_SG2042=m
-CONFIG_PWM_SUN4I=m
-CONFIG_PWM_XILINX=m
-
-#
-# IRQ chip support
-#
-CONFIG_IRQCHIP=y
-CONFIG_IRQ_MSI_LIB=y
-# CONFIG_AL_FIC is not set
-CONFIG_LAN966X_OIC=m
-CONFIG_MADERA_IRQ=m
-# CONFIG_XILINX_INTC is not set
-CONFIG_RISCV_INTC=y
-CONFIG_RISCV_APLIC=y
-CONFIG_RISCV_APLIC_MSI=y
-CONFIG_RISCV_IMSIC=y
-CONFIG_RISCV_RPMI_SYSMSI=y
-CONFIG_SIFIVE_PLIC=y
-CONFIG_STARFIVE_JH8100_INTC=y
-CONFIG_ACLINT_SSWI=y
-CONFIG_SOPHGO_SG2042_MSI=y
-# end of IRQ chip support
-
-CONFIG_IPACK_BUS=m
-CONFIG_BOARD_TPCI200=m
-CONFIG_SERIAL_IPOCTAL=m
-CONFIG_RESET_CONTROLLER=y
-CONFIG_RESET_GPIO=m
-CONFIG_RESET_K230=m
-CONFIG_RESET_MCHP_SPARX5=m
-CONFIG_RESET_POLARFIRE_SOC=y
-CONFIG_RESET_RZV2H_USB2PHY=m
-CONFIG_RESET_SIMPLE=y
-CONFIG_RESET_SPACEMIT=m
-CONFIG_RESET_SUNXI=y
-CONFIG_RESET_TH1520=m
-CONFIG_RESET_TI_SYSCON=m
-CONFIG_RESET_TI_TPS380X=m
-CONFIG_RESET_STARFIVE_JH71X0=y
-CONFIG_RESET_STARFIVE_JH7100=y
-CONFIG_RESET_STARFIVE_JH7110=y
-
-#
-# PHY Subsystem
-#
-CONFIG_GENERIC_PHY=y
-CONFIG_GENERIC_PHY_MIPI_DPHY=y
-CONFIG_PHY_CAN_TRANSCEIVER=m
-CONFIG_PHY_NXP_PTN3222=m
-CONFIG_PHY_SUN4I_USB=m
-CONFIG_PHY_SUN6I_MIPI_DPHY=m
-CONFIG_PHY_SUN9I_USB=m
-CONFIG_PHY_SUN50I_USB3=m
-
-#
-# PHY drivers for Broadcom platforms
-#
-CONFIG_BCM_KONA_USB2_PHY=m
-# end of PHY drivers for Broadcom platforms
-
-CONFIG_PHY_CADENCE_TORRENT=m
-CONFIG_PHY_CADENCE_DPHY=m
-CONFIG_PHY_CADENCE_DPHY_RX=m
-CONFIG_PHY_CADENCE_SIERRA=m
-CONFIG_PHY_CADENCE_SALVO=m
-CONFIG_PHY_PXA_28NM_HSIC=m
-CONFIG_PHY_PXA_28NM_USB2=m
-CONFIG_PHY_LAN966X_SERDES=m
-CONFIG_PHY_CPCAP_USB=m
-CONFIG_PHY_MAPPHONE_MDM6600=m
-CONFIG_PHY_OCELOT_SERDES=m
-CONFIG_PHY_QCOM_USB_HS=m
-CONFIG_PHY_QCOM_USB_HSIC=m
-CONFIG_PHY_R8A779F0_ETHERNET_SERDES=m
-CONFIG_PHY_RCAR_GEN2=m
-CONFIG_PHY_RCAR_GEN3_PCIE=m
-CONFIG_PHY_RCAR_GEN3_USB2=m
-CONFIG_PHY_RCAR_GEN3_USB3=m
-CONFIG_PHY_SAMSUNG_USB2=m
-CONFIG_PHY_SOPHGO_CV1800_USB2=m
-CONFIG_PHY_STARFIVE_JH7110_DPHY_RX=m
-CONFIG_PHY_STARFIVE_JH7110_DPHY_TX=m
-CONFIG_PHY_STARFIVE_JH7110_PCIE=m
-CONFIG_PHY_STARFIVE_JH7110_USB=m
-CONFIG_PHY_TUSB1210=m
-# end of PHY Subsystem
-
-CONFIG_POWERCAP=y
-CONFIG_IDLE_INJECT=y
-# CONFIG_DTPM is not set
-CONFIG_MCB=m
-CONFIG_MCB_PCI=m
-CONFIG_MCB_LPC=m
-
-#
-# Performance monitor support
-#
-CONFIG_RISCV_PMU=y
-CONFIG_RISCV_PMU_LEGACY=y
-CONFIG_RISCV_PMU_SBI=y
-CONFIG_STARFIVE_STARLINK_PMU=y
-CONFIG_ANDES_CUSTOM_PMU=y
-CONFIG_DWC_PCIE_PMU=m
-CONFIG_CXL_PMU=m
-# end of Performance monitor support
-
-CONFIG_RAS=y
-CONFIG_USB4=m
-# CONFIG_USB4_DEBUGFS_WRITE is not set
-CONFIG_USB4_DMA_TEST=m
-
-#
-# Android
-#
-# CONFIG_ANDROID_BINDER_IPC is not set
-# end of Android
-
-CONFIG_LIBNVDIMM=m
-CONFIG_BLK_DEV_PMEM=m
-CONFIG_ND_CLAIM=y
-CONFIG_ND_BTT=m
-CONFIG_BTT=y
-CONFIG_ND_PFN=m
-CONFIG_NVDIMM_PFN=y
-CONFIG_NVDIMM_DAX=y
-CONFIG_OF_PMEM=m
-CONFIG_NVDIMM_KEYS=y
-# CONFIG_NVDIMM_SECURITY_TEST is not set
-CONFIG_DAX=y
-CONFIG_DEV_DAX=m
-CONFIG_DEV_DAX_PMEM=m
-CONFIG_DEV_DAX_HMEM=m
-CONFIG_DEV_DAX_CXL=m
-CONFIG_DEV_DAX_HMEM_DEVICES=y
-CONFIG_DEV_DAX_KMEM=m
-CONFIG_NVMEM=y
-CONFIG_NVMEM_SYSFS=y
-CONFIG_NVMEM_LAYOUTS=y
-
-#
-# Layout Types
-#
-CONFIG_NVMEM_LAYOUT_SL28_VPD=m
-CONFIG_NVMEM_LAYOUT_ONIE_TLV=m
-CONFIG_NVMEM_LAYOUT_U_BOOT_ENV=m
-# end of Layout Types
-
-CONFIG_NVMEM_MAX77759=m
-CONFIG_NVMEM_RAVE_SP_EEPROM=m
-CONFIG_NVMEM_RMEM=m
-CONFIG_NVMEM_SPMI_SDAM=m
-CONFIG_NVMEM_SUNXI_SID=m
-CONFIG_NVMEM_U_BOOT_ENV=m
-
-#
-# HW tracing support
-#
-CONFIG_STM=m
-CONFIG_STM_PROTO_BASIC=m
-CONFIG_STM_PROTO_SYS_T=m
-CONFIG_STM_DUMMY=m
-CONFIG_STM_SOURCE_CONSOLE=m
-CONFIG_STM_SOURCE_HEARTBEAT=m
-CONFIG_STM_SOURCE_FTRACE=m
-CONFIG_INTEL_TH=m
-CONFIG_INTEL_TH_PCI=m
-CONFIG_INTEL_TH_ACPI=m
-CONFIG_INTEL_TH_GTH=m
-CONFIG_INTEL_TH_STH=m
-CONFIG_INTEL_TH_MSU=m
-CONFIG_INTEL_TH_PTI=m
-# CONFIG_INTEL_TH_DEBUG is not set
-# end of HW tracing support
-
-CONFIG_FPGA=m
-CONFIG_ALTERA_PR_IP_CORE=m
-CONFIG_ALTERA_PR_IP_CORE_PLAT=m
-CONFIG_FPGA_MGR_ALTERA_PS_SPI=m
-CONFIG_FPGA_MGR_ALTERA_CVP=m
-CONFIG_FPGA_MGR_XILINX_CORE=m
-CONFIG_FPGA_MGR_XILINX_SELECTMAP=m
-CONFIG_FPGA_MGR_XILINX_SPI=m
-CONFIG_FPGA_MGR_ICE40_SPI=m
-CONFIG_FPGA_MGR_MACHXO2_SPI=m
-CONFIG_FPGA_BRIDGE=m
-CONFIG_ALTERA_FREEZE_BRIDGE=m
-CONFIG_XILINX_PR_DECOUPLER=m
-CONFIG_FPGA_REGION=m
-CONFIG_OF_FPGA_REGION=m
-CONFIG_FPGA_DFL=m
-CONFIG_FPGA_DFL_FME=m
-CONFIG_FPGA_DFL_FME_MGR=m
-CONFIG_FPGA_DFL_FME_BRIDGE=m
-CONFIG_FPGA_DFL_FME_REGION=m
-CONFIG_FPGA_DFL_AFU=m
-CONFIG_FPGA_DFL_NIOS_INTEL_PAC_N3000=m
-CONFIG_FPGA_DFL_PCI=m
-CONFIG_FPGA_M10_BMC_SEC_UPDATE=m
-CONFIG_FPGA_MGR_MICROCHIP_SPI=m
-CONFIG_FPGA_MGR_LATTICE_SYSCONFIG=m
-CONFIG_FPGA_MGR_LATTICE_SYSCONFIG_SPI=m
-CONFIG_FSI=m
-# CONFIG_FSI_NEW_DEV_NODE is not set
-CONFIG_FSI_MASTER_GPIO=m
-CONFIG_FSI_MASTER_HUB=m
-CONFIG_FSI_MASTER_ASPEED=m
-CONFIG_FSI_MASTER_I2CR=m
-CONFIG_FSI_SCOM=m
-CONFIG_FSI_SBEFIFO=m
-CONFIG_FSI_OCC=m
-CONFIG_I2CR_SCOM=m
-CONFIG_MULTIPLEXER=m
-
-#
-# Multiplexer drivers
-#
-CONFIG_MUX_ADG792A=m
-CONFIG_MUX_ADGS1408=m
-CONFIG_MUX_GPIO=m
-CONFIG_MUX_MMIO=m
-# end of Multiplexer drivers
-
-CONFIG_PM_OPP=y
-CONFIG_SIOX=m
-CONFIG_SIOX_BUS_GPIO=m
-CONFIG_SLIMBUS=m
-# CONFIG_INTERCONNECT is not set
-CONFIG_COUNTER=m
-CONFIG_INTERRUPT_CNT=m
-CONFIG_MOST=m
-CONFIG_MOST_USB_HDM=m
-CONFIG_MOST_CDEV=m
-CONFIG_MOST_SND=m
-CONFIG_PECI=m
-CONFIG_PECI_CPU=m
-# CONFIG_HTE is not set
-# end of Device Drivers
-
-#
-# File systems
-#
-# CONFIG_VALIDATE_FS_PARSER is not set
-CONFIG_FS_IOMAP=y
-CONFIG_FS_STACK=y
-CONFIG_BUFFER_HEAD=y
-CONFIG_LEGACY_DIRECT_IO=y
-# CONFIG_EXT2_FS is not set
-CONFIG_EXT4_FS=y
-CONFIG_EXT4_USE_FOR_EXT2=y
-CONFIG_EXT4_FS_POSIX_ACL=y
-CONFIG_EXT4_FS_SECURITY=y
-# CONFIG_EXT4_DEBUG is not set
-CONFIG_JBD2=y
-# CONFIG_JBD2_DEBUG is not set
-CONFIG_FS_MBCACHE=y
-# CONFIG_JFS_FS is not set
-# CONFIG_XFS_FS is not set
-# CONFIG_GFS2_FS is not set
-# CONFIG_OCFS2_FS is not set
-# CONFIG_BTRFS_FS is not set
-# CONFIG_NILFS2_FS is not set
-CONFIG_F2FS_FS=m
-CONFIG_F2FS_STAT_FS=y
-CONFIG_F2FS_FS_XATTR=y
-CONFIG_F2FS_FS_POSIX_ACL=y
-CONFIG_F2FS_FS_SECURITY=y
-# CONFIG_F2FS_CHECK_FS is not set
-# CONFIG_F2FS_FAULT_INJECTION is not set
-CONFIG_F2FS_FS_COMPRESSION=y
-# CONFIG_F2FS_FS_LZO is not set
-# CONFIG_F2FS_FS_LZ4 is not set
-CONFIG_F2FS_FS_ZSTD=y
-CONFIG_F2FS_IOSTAT=y
-# CONFIG_F2FS_UNFAIR_RWSEM is not set
-# CONFIG_ZONEFS_FS is not set
-CONFIG_FS_DAX=y
-CONFIG_FS_DAX_PMD=y
-CONFIG_FS_POSIX_ACL=y
-CONFIG_EXPORTFS=y
-# CONFIG_EXPORTFS_BLOCK_OPS is not set
-CONFIG_FILE_LOCKING=y
-CONFIG_FS_ENCRYPTION=y
-CONFIG_FS_ENCRYPTION_ALGS=y
-CONFIG_FS_ENCRYPTION_INLINE_CRYPT=y
-CONFIG_FS_VERITY=y
-# CONFIG_FS_VERITY_BUILTIN_SIGNATURES is not set
-CONFIG_FSNOTIFY=y
-CONFIG_DNOTIFY=y
-CONFIG_INOTIFY_USER=y
-CONFIG_FANOTIFY=y
-CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y
-CONFIG_QUOTA=y
-CONFIG_QUOTA_NETLINK_INTERFACE=y
-# CONFIG_QUOTA_DEBUG is not set
-CONFIG_QUOTA_TREE=m
-CONFIG_QFMT_V1=m
-CONFIG_QFMT_V2=m
-CONFIG_QUOTACTL=y
-CONFIG_AUTOFS_FS=m
-CONFIG_FUSE_FS=m
-CONFIG_CUSE=m
-CONFIG_VIRTIO_FS=m
-CONFIG_FUSE_DAX=y
-CONFIG_FUSE_PASSTHROUGH=y
-CONFIG_FUSE_IO_URING=y
-CONFIG_OVERLAY_FS=m
-# CONFIG_OVERLAY_FS_REDIRECT_DIR is not set
-CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y
-# CONFIG_OVERLAY_FS_INDEX is not set
-# CONFIG_OVERLAY_FS_XINO_AUTO is not set
-# CONFIG_OVERLAY_FS_METACOPY is not set
-# CONFIG_OVERLAY_FS_DEBUG is not set
-
-#
-# Caches
-#
-CONFIG_NETFS_SUPPORT=m
-CONFIG_NETFS_STATS=y
-# CONFIG_NETFS_DEBUG is not set
-CONFIG_FSCACHE=y
-CONFIG_FSCACHE_STATS=y
-CONFIG_CACHEFILES=m
-# CONFIG_CACHEFILES_DEBUG is not set
-# CONFIG_CACHEFILES_ERROR_INJECTION is not set
-# CONFIG_CACHEFILES_ONDEMAND is not set
-# end of Caches
-
-#
-# CD-ROM/DVD Filesystems
-#
-CONFIG_ISO9660_FS=m
-CONFIG_JOLIET=y
-CONFIG_ZISOFS=y
-CONFIG_UDF_FS=m
-# end of CD-ROM/DVD Filesystems
-
-#
-# DOS/FAT/EXFAT/NT Filesystems
-#
-CONFIG_FAT_FS=m
-CONFIG_MSDOS_FS=m
-CONFIG_VFAT_FS=m
-CONFIG_FAT_DEFAULT_CODEPAGE=437
-CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
-# CONFIG_FAT_DEFAULT_UTF8 is not set
-# CONFIG_EXFAT_FS is not set
-# CONFIG_NTFS3_FS is not set
-# CONFIG_NTFS_FS is not set
-# end of DOS/FAT/EXFAT/NT Filesystems
-
-#
-# Pseudo filesystems
-#
-CONFIG_PROC_FS=y
-CONFIG_PROC_KCORE=y
-CONFIG_PROC_VMCORE=y
-# CONFIG_PROC_VMCORE_DEVICE_DUMP is not set
-CONFIG_PROC_SYSCTL=y
-CONFIG_PROC_PAGE_MONITOR=y
-CONFIG_PROC_CHILDREN=y
-CONFIG_KERNFS=y
-CONFIG_SYSFS=y
-CONFIG_TMPFS=y
-CONFIG_TMPFS_POSIX_ACL=y
-CONFIG_TMPFS_XATTR=y
-CONFIG_TMPFS_INODE64=y
-# CONFIG_TMPFS_QUOTA is not set
-CONFIG_ARCH_SUPPORTS_HUGETLBFS=y
-CONFIG_HUGETLBFS=y
-# CONFIG_HUGETLB_PAGE_OPTIMIZE_VMEMMAP_DEFAULT_ON is not set
-CONFIG_HUGETLB_PAGE=y
-CONFIG_HUGETLB_PAGE_OPTIMIZE_VMEMMAP=y
-CONFIG_HUGETLB_PMD_PAGE_TABLE_SHARING=y
-CONFIG_ARCH_HAS_GIGANTIC_PAGE=y
-CONFIG_CONFIGFS_FS=y
-CONFIG_EFIVAR_FS=m
-# end of Pseudo filesystems
-
-CONFIG_MISC_FILESYSTEMS=y
-# CONFIG_ORANGEFS_FS is not set
-# CONFIG_ADFS_FS is not set
-# CONFIG_AFFS_FS is not set
-# CONFIG_ECRYPT_FS is not set
-# CONFIG_HFS_FS is not set
-# CONFIG_HFSPLUS_FS is not set
-# CONFIG_BEFS_FS is not set
-# CONFIG_BFS_FS is not set
-# CONFIG_EFS_FS is not set
-# CONFIG_JFFS2_FS is not set
-# CONFIG_UBIFS_FS is not set
-# CONFIG_CRAMFS is not set
-CONFIG_SQUASHFS=y
-# CONFIG_SQUASHFS_FILE_CACHE is not set
-CONFIG_SQUASHFS_FILE_DIRECT=y
-CONFIG_SQUASHFS_DECOMP_SINGLE=y
-CONFIG_SQUASHFS_DECOMP_MULTI=y
-CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU=y
-CONFIG_SQUASHFS_CHOICE_DECOMP_BY_MOUNT=y
-CONFIG_SQUASHFS_MOUNT_DECOMP_THREADS=y
-CONFIG_SQUASHFS_XATTR=y
-# CONFIG_SQUASHFS_COMP_CACHE_FULL is not set
-CONFIG_SQUASHFS_ZLIB=y
-# CONFIG_SQUASHFS_LZ4 is not set
-# CONFIG_SQUASHFS_LZO is not set
-# CONFIG_SQUASHFS_XZ is not set
-CONFIG_SQUASHFS_ZSTD=y
-# CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set
-# CONFIG_SQUASHFS_EMBEDDED is not set
-CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
-# CONFIG_VXFS_FS is not set
-# CONFIG_MINIX_FS is not set
-# CONFIG_OMFS_FS is not set
-# CONFIG_HPFS_FS is not set
-# CONFIG_QNX4FS_FS is not set
-# CONFIG_QNX6FS_FS is not set
-# CONFIG_ROMFS_FS is not set
-CONFIG_PSTORE=y
-CONFIG_PSTORE_DEFAULT_KMSG_BYTES=10240
-CONFIG_PSTORE_COMPRESS=y
-# CONFIG_PSTORE_CONSOLE is not set
-# CONFIG_PSTORE_PMSG is not set
-CONFIG_PSTORE_RAM=m
-CONFIG_PSTORE_ZONE=m
-CONFIG_PSTORE_BLK=m
-CONFIG_PSTORE_BLK_BLKDEV=""
-CONFIG_PSTORE_BLK_KMSG_SIZE=64
-CONFIG_PSTORE_BLK_MAX_REASON=2
-# CONFIG_UFS_FS is not set
-# CONFIG_EROFS_FS is not set
-# CONFIG_NETWORK_FILESYSTEMS is not set
-CONFIG_NLS=y
-CONFIG_NLS_DEFAULT="utf8"
-CONFIG_NLS_CODEPAGE_437=m
-CONFIG_NLS_CODEPAGE_737=m
-CONFIG_NLS_CODEPAGE_775=m
-CONFIG_NLS_CODEPAGE_850=m
-CONFIG_NLS_CODEPAGE_852=m
-CONFIG_NLS_CODEPAGE_855=m
-CONFIG_NLS_CODEPAGE_857=m
-CONFIG_NLS_CODEPAGE_860=m
-CONFIG_NLS_CODEPAGE_861=m
-CONFIG_NLS_CODEPAGE_862=m
-CONFIG_NLS_CODEPAGE_863=m
-CONFIG_NLS_CODEPAGE_864=m
-CONFIG_NLS_CODEPAGE_865=m
-CONFIG_NLS_CODEPAGE_866=m
-CONFIG_NLS_CODEPAGE_869=m
-CONFIG_NLS_CODEPAGE_936=m
-CONFIG_NLS_CODEPAGE_950=m
-CONFIG_NLS_CODEPAGE_932=m
-CONFIG_NLS_CODEPAGE_949=m
-CONFIG_NLS_CODEPAGE_874=m
-CONFIG_NLS_ISO8859_8=m
-CONFIG_NLS_CODEPAGE_1250=m
-CONFIG_NLS_CODEPAGE_1251=m
-CONFIG_NLS_ASCII=m
-CONFIG_NLS_ISO8859_1=m
-CONFIG_NLS_ISO8859_2=m
-CONFIG_NLS_ISO8859_3=m
-CONFIG_NLS_ISO8859_4=m
-CONFIG_NLS_ISO8859_5=m
-CONFIG_NLS_ISO8859_6=m
-CONFIG_NLS_ISO8859_7=m
-CONFIG_NLS_ISO8859_9=m
-CONFIG_NLS_ISO8859_13=m
-CONFIG_NLS_ISO8859_14=m
-CONFIG_NLS_ISO8859_15=m
-CONFIG_NLS_KOI8_R=m
-CONFIG_NLS_KOI8_U=m
-CONFIG_NLS_MAC_ROMAN=m
-CONFIG_NLS_MAC_CELTIC=m
-CONFIG_NLS_MAC_CENTEURO=m
-CONFIG_NLS_MAC_CROATIAN=m
-CONFIG_NLS_MAC_CYRILLIC=m
-CONFIG_NLS_MAC_GAELIC=m
-CONFIG_NLS_MAC_GREEK=m
-CONFIG_NLS_MAC_ICELAND=m
-CONFIG_NLS_MAC_INUIT=m
-CONFIG_NLS_MAC_ROMANIAN=m
-CONFIG_NLS_MAC_TURKISH=m
-CONFIG_NLS_UTF8=m
-CONFIG_DLM=m
-# CONFIG_DLM_DEBUG is not set
-CONFIG_UNICODE=m
-CONFIG_IO_WQ=y
-# end of File systems
-
-#
-# Security options
-#
-CONFIG_KEYS=y
-CONFIG_KEYS_REQUEST_CACHE=y
-CONFIG_PERSISTENT_KEYRINGS=y
-CONFIG_BIG_KEYS=y
-CONFIG_TRUSTED_KEYS=m
-CONFIG_HAVE_TRUSTED_KEYS=y
-CONFIG_TRUSTED_KEYS_TPM=y
-CONFIG_ENCRYPTED_KEYS=m
-# CONFIG_USER_DECRYPTED_DATA is not set
-CONFIG_KEY_DH_OPERATIONS=y
-# CONFIG_KEY_NOTIFICATIONS is not set
-CONFIG_SECURITY_DMESG_RESTRICT=y
-CONFIG_PROC_MEM_ALWAYS_FORCE=y
-# CONFIG_PROC_MEM_FORCE_PTRACE is not set
-# CONFIG_PROC_MEM_NO_FORCE is not set
-CONFIG_SECURITY=y
-CONFIG_HAS_SECURITY_AUDIT=y
-CONFIG_SECURITYFS=y
-CONFIG_SECURITY_NETWORK=y
-# CONFIG_SECURITY_INFINIBAND is not set
-# CONFIG_SECURITY_NETWORK_XFRM is not set
-CONFIG_SECURITY_PATH=y
-CONFIG_LSM_MMAP_MIN_ADDR=65536
-# CONFIG_STATIC_USERMODEHELPER is not set
-CONFIG_SECURITY_SELINUX=y
-CONFIG_SECURITY_SELINUX_BOOTPARAM=y
-CONFIG_SECURITY_SELINUX_DEVELOP=y
-CONFIG_SECURITY_SELINUX_AVC_STATS=y
-CONFIG_SECURITY_SELINUX_SIDTAB_HASH_BITS=9
-CONFIG_SECURITY_SELINUX_SID2STR_CACHE_SIZE=256
-# CONFIG_SECURITY_SELINUX_DEBUG is not set
-# CONFIG_SECURITY_SMACK is not set
-# CONFIG_SECURITY_TOMOYO is not set
-# CONFIG_SECURITY_APPARMOR is not set
-# CONFIG_SECURITY_LOADPIN is not set
-CONFIG_SECURITY_YAMA=y
-# CONFIG_SECURITY_SAFESETID is not set
-# CONFIG_SECURITY_LOCKDOWN_LSM is not set
-CONFIG_SECURITY_LANDLOCK=y
-# CONFIG_SECURITY_IPE is not set
-CONFIG_INTEGRITY=y
-# CONFIG_INTEGRITY_SIGNATURE is not set
-CONFIG_INTEGRITY_AUDIT=y
-# CONFIG_IMA is not set
-# CONFIG_EVM is not set
-CONFIG_DEFAULT_SECURITY_SELINUX=y
-# CONFIG_DEFAULT_SECURITY_DAC is not set
-CONFIG_LSM="landlock,lockdown,yama,loadpin,safesetid,selinux,smack,tomoyo,apparmor,ipe,bpf"
-
-#
-# Kernel hardening options
-#
-
-#
-# Memory initialization
-#
-CONFIG_CC_HAS_AUTO_VAR_INIT_PATTERN=y
-CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO_BARE=y
-CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO=y
-# CONFIG_INIT_STACK_NONE is not set
-# CONFIG_INIT_STACK_ALL_PATTERN is not set
-CONFIG_INIT_STACK_ALL_ZERO=y
-CONFIG_CC_HAS_SANCOV_STACK_DEPTH_CALLBACK=y
-# CONFIG_KSTACK_ERASE is not set
-CONFIG_INIT_ON_ALLOC_DEFAULT_ON=y
-# CONFIG_INIT_ON_FREE_DEFAULT_ON is not set
-# end of Memory initialization
-
-#
-# Bounds checking
-#
-CONFIG_FORTIFY_SOURCE=y
-CONFIG_HARDENED_USERCOPY=y
-CONFIG_HARDENED_USERCOPY_DEFAULT_ON=y
-# end of Bounds checking
-
-#
-# Hardening of kernel data structures
-#
-CONFIG_LIST_HARDENED=y
-CONFIG_BUG_ON_DATA_CORRUPTION=y
-# end of Hardening of kernel data structures
-
-CONFIG_CC_HAS_RANDSTRUCT=y
-CONFIG_RANDSTRUCT_NONE=y
-# CONFIG_RANDSTRUCT_FULL is not set
-# end of Kernel hardening options
-# end of Security options
-
-CONFIG_XOR_BLOCKS=m
-CONFIG_ASYNC_CORE=m
-CONFIG_ASYNC_XOR=m
-CONFIG_CRYPTO=y
-
-#
-# Crypto core or helper
-#
-CONFIG_CRYPTO_ALGAPI=y
-CONFIG_CRYPTO_ALGAPI2=y
-CONFIG_CRYPTO_AEAD=m
-CONFIG_CRYPTO_AEAD2=y
-CONFIG_CRYPTO_SIG=y
-CONFIG_CRYPTO_SIG2=y
-CONFIG_CRYPTO_SKCIPHER=y
-CONFIG_CRYPTO_SKCIPHER2=y
-CONFIG_CRYPTO_HASH=y
-CONFIG_CRYPTO_HASH2=y
-CONFIG_CRYPTO_RNG=y
-CONFIG_CRYPTO_RNG2=y
-CONFIG_CRYPTO_RNG_DEFAULT=y
-CONFIG_CRYPTO_AKCIPHER2=y
-CONFIG_CRYPTO_AKCIPHER=y
-CONFIG_CRYPTO_KPP2=y
-CONFIG_CRYPTO_KPP=y
-CONFIG_CRYPTO_ACOMP2=y
-CONFIG_CRYPTO_HKDF=y
-CONFIG_CRYPTO_MANAGER=y
-CONFIG_CRYPTO_MANAGER2=y
-CONFIG_CRYPTO_USER=m
-# CONFIG_CRYPTO_SELFTESTS is not set
-CONFIG_CRYPTO_NULL=m
-CONFIG_CRYPTO_PCRYPT=m
-CONFIG_CRYPTO_CRYPTD=m
-CONFIG_CRYPTO_AUTHENC=m
-CONFIG_CRYPTO_KRB5ENC=m
-CONFIG_CRYPTO_BENCHMARK=m
-CONFIG_CRYPTO_ENGINE=m
-# end of Crypto core or helper
-
-#
-# Public-key cryptography
-#
-CONFIG_CRYPTO_RSA=y
-CONFIG_CRYPTO_DH=y
-CONFIG_CRYPTO_DH_RFC7919_GROUPS=y
-CONFIG_CRYPTO_ECC=y
-CONFIG_CRYPTO_ECDH=m
-CONFIG_CRYPTO_ECDSA=y
-CONFIG_CRYPTO_ECRDSA=m
-# end of Public-key cryptography
-
-#
-# Block ciphers
-#
-CONFIG_CRYPTO_AES=y
-CONFIG_CRYPTO_AES_TI=m
-CONFIG_CRYPTO_ANUBIS=m
-CONFIG_CRYPTO_ARIA=m
-CONFIG_CRYPTO_BLOWFISH=m
-CONFIG_CRYPTO_BLOWFISH_COMMON=m
-CONFIG_CRYPTO_CAMELLIA=m
-CONFIG_CRYPTO_CAST_COMMON=m
-CONFIG_CRYPTO_CAST5=m
-CONFIG_CRYPTO_CAST6=m
-CONFIG_CRYPTO_DES=m
-CONFIG_CRYPTO_FCRYPT=m
-CONFIG_CRYPTO_KHAZAD=m
-CONFIG_CRYPTO_SEED=m
-CONFIG_CRYPTO_SERPENT=m
-CONFIG_CRYPTO_SM4=m
-CONFIG_CRYPTO_SM4_GENERIC=m
-CONFIG_CRYPTO_TEA=m
-CONFIG_CRYPTO_TWOFISH=m
-CONFIG_CRYPTO_TWOFISH_COMMON=m
-# end of Block ciphers
-
-#
-# Length-preserving ciphers and modes
-#
-CONFIG_CRYPTO_ADIANTUM=m
-CONFIG_CRYPTO_ARC4=m
-CONFIG_CRYPTO_CHACHA20=m
-CONFIG_CRYPTO_CBC=y
-CONFIG_CRYPTO_CTR=y
-CONFIG_CRYPTO_CTS=y
-CONFIG_CRYPTO_ECB=y
-CONFIG_CRYPTO_HCTR2=m
-CONFIG_CRYPTO_LRW=m
-CONFIG_CRYPTO_PCBC=m
-CONFIG_CRYPTO_XCTR=m
-CONFIG_CRYPTO_XTS=y
-CONFIG_CRYPTO_NHPOLY1305=m
-# end of Length-preserving ciphers and modes
-
-#
-# AEAD (authenticated encryption with associated data) ciphers
-#
-CONFIG_CRYPTO_AEGIS128=m
-CONFIG_CRYPTO_CHACHA20POLY1305=m
-CONFIG_CRYPTO_CCM=m
-CONFIG_CRYPTO_GCM=m
-CONFIG_CRYPTO_GENIV=m
-CONFIG_CRYPTO_SEQIV=m
-CONFIG_CRYPTO_ECHAINIV=m
-CONFIG_CRYPTO_ESSIV=m
-# end of AEAD (authenticated encryption with associated data) ciphers
-
-#
-# Hashes, digests, and MACs
-#
-CONFIG_CRYPTO_BLAKE2B=m
-CONFIG_CRYPTO_CMAC=m
-CONFIG_CRYPTO_GHASH=m
-CONFIG_CRYPTO_HMAC=y
-CONFIG_CRYPTO_MD4=m
-CONFIG_CRYPTO_MD5=y
-CONFIG_CRYPTO_MICHAEL_MIC=m
-CONFIG_CRYPTO_POLYVAL=m
-CONFIG_CRYPTO_RMD160=m
-CONFIG_CRYPTO_SHA1=m
-CONFIG_CRYPTO_SHA256=y
-CONFIG_CRYPTO_SHA512=y
-CONFIG_CRYPTO_SHA3=y
-CONFIG_CRYPTO_SM3_GENERIC=m
-CONFIG_CRYPTO_STREEBOG=m
-CONFIG_CRYPTO_WP512=m
-CONFIG_CRYPTO_XCBC=m
-CONFIG_CRYPTO_XXHASH=m
-# end of Hashes, digests, and MACs
-
-#
-# CRCs (cyclic redundancy checks)
-#
-CONFIG_CRYPTO_CRC32C=y
-CONFIG_CRYPTO_CRC32=m
-# end of CRCs (cyclic redundancy checks)
-
-#
-# Compression
-#
-CONFIG_CRYPTO_DEFLATE=m
-CONFIG_CRYPTO_LZO=y
-CONFIG_CRYPTO_842=m
-CONFIG_CRYPTO_LZ4=m
-CONFIG_CRYPTO_LZ4HC=m
-CONFIG_CRYPTO_ZSTD=y
-# end of Compression
-
-#
-# Random number generation
-#
-CONFIG_CRYPTO_ANSI_CPRNG=m
-CONFIG_CRYPTO_DRBG_MENU=y
-CONFIG_CRYPTO_DRBG_HMAC=y
-CONFIG_CRYPTO_DRBG_HASH=y
-CONFIG_CRYPTO_DRBG_CTR=y
-CONFIG_CRYPTO_DRBG=y
-CONFIG_CRYPTO_JITTERENTROPY=y
-CONFIG_CRYPTO_JITTERENTROPY_MEMORY_BLOCKS=64
-CONFIG_CRYPTO_JITTERENTROPY_MEMORY_BLOCKSIZE=32
-CONFIG_CRYPTO_JITTERENTROPY_OSR=1
-CONFIG_CRYPTO_KDF800108_CTR=y
-# end of Random number generation
-
-#
-# Userspace interface
-#
-CONFIG_CRYPTO_USER_API=m
-CONFIG_CRYPTO_USER_API_HASH=m
-CONFIG_CRYPTO_USER_API_SKCIPHER=m
-CONFIG_CRYPTO_USER_API_RNG=m
-# CONFIG_CRYPTO_USER_API_RNG_CAVP is not set
-CONFIG_CRYPTO_USER_API_AEAD=m
-CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE=y
-# end of Userspace interface
-
-#
-# Accelerated Cryptographic Algorithms for CPU (riscv)
-#
-# end of Accelerated Cryptographic Algorithms for CPU (riscv)
-
-CONFIG_CRYPTO_HW=y
-CONFIG_CRYPTO_DEV_ALLWINNER=y
-CONFIG_CRYPTO_DEV_SUN4I_SS=m
-# CONFIG_CRYPTO_DEV_SUN4I_SS_DEBUG is not set
-CONFIG_CRYPTO_DEV_SUN8I_CE=m
-# CONFIG_CRYPTO_DEV_SUN8I_CE_DEBUG is not set
-# CONFIG_CRYPTO_DEV_SUN8I_CE_HASH is not set
-# CONFIG_CRYPTO_DEV_SUN8I_CE_PRNG is not set
-# CONFIG_CRYPTO_DEV_SUN8I_CE_TRNG is not set
-CONFIG_CRYPTO_DEV_SUN8I_SS=m
-# CONFIG_CRYPTO_DEV_SUN8I_SS_DEBUG is not set
-# CONFIG_CRYPTO_DEV_SUN8I_SS_PRNG is not set
-# CONFIG_CRYPTO_DEV_SUN8I_SS_HASH is not set
-CONFIG_CRYPTO_DEV_ATMEL_AES=m
-CONFIG_CRYPTO_DEV_ATMEL_I2C=m
-CONFIG_CRYPTO_DEV_ATMEL_ECC=m
-CONFIG_CRYPTO_DEV_ATMEL_SHA204A=m
-CONFIG_CRYPTO_DEV_NITROX=m
-CONFIG_CRYPTO_DEV_NITROX_CNN55XX=m
-CONFIG_CRYPTO_DEV_QAT=m
-CONFIG_CRYPTO_DEV_QAT_DH895xCC=m
-CONFIG_CRYPTO_DEV_QAT_C3XXX=m
-CONFIG_CRYPTO_DEV_QAT_C62X=m
-CONFIG_CRYPTO_DEV_QAT_4XXX=m
-CONFIG_CRYPTO_DEV_QAT_420XX=m
-CONFIG_CRYPTO_DEV_QAT_DH895xCCVF=m
-CONFIG_CRYPTO_DEV_QAT_C3XXXVF=m
-CONFIG_CRYPTO_DEV_QAT_C62XVF=m
-# CONFIG_CRYPTO_DEV_QAT_ERROR_INJECTION is not set
-CONFIG_CRYPTO_DEV_CHELSIO=m
-CONFIG_CRYPTO_DEV_VIRTIO=m
-CONFIG_CRYPTO_DEV_SAFEXCEL=m
-CONFIG_CRYPTO_DEV_CCREE=m
-CONFIG_CRYPTO_DEV_AMLOGIC_GXL=m
-# CONFIG_CRYPTO_DEV_AMLOGIC_GXL_DEBUG is not set
-CONFIG_CRYPTO_DEV_JH7110=m
-CONFIG_ASYMMETRIC_KEY_TYPE=y
-CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y
-CONFIG_X509_CERTIFICATE_PARSER=y
-CONFIG_PKCS8_PRIVATE_KEY_PARSER=m
-CONFIG_PKCS7_MESSAGE_PARSER=y
-CONFIG_PKCS7_TEST_KEY=m
-# CONFIG_SIGNED_PE_FILE_VERIFICATION is not set
-CONFIG_FIPS_SIGNATURE_SELFTEST=m
-CONFIG_FIPS_SIGNATURE_SELFTEST_RSA=y
-CONFIG_FIPS_SIGNATURE_SELFTEST_ECDSA=y
-
-#
-# Certificates for signature checking
-#
-CONFIG_MODULE_SIG_KEY="certs/signing_key.pem"
-# CONFIG_MODULE_SIG_KEY_TYPE_RSA is not set
-CONFIG_MODULE_SIG_KEY_TYPE_ECDSA=y
-CONFIG_SYSTEM_TRUSTED_KEYRING=y
-CONFIG_SYSTEM_TRUSTED_KEYS=""
-# CONFIG_SYSTEM_EXTRA_CERTIFICATE is not set
-# CONFIG_SECONDARY_TRUSTED_KEYRING is not set
-# CONFIG_SYSTEM_BLACKLIST_KEYRING is not set
-# end of Certificates for signature checking
-
-CONFIG_CRYPTO_KRB5=m
-# CONFIG_CRYPTO_KRB5_SELFTESTS is not set
-CONFIG_BINARY_PRINTF=y
-
-#
-# Library routines
-#
-CONFIG_LINEAR_RANGES=y
-CONFIG_PACKING=y
-CONFIG_BITREVERSE=y
-CONFIG_GENERIC_STRNCPY_FROM_USER=y
-CONFIG_GENERIC_STRNLEN_USER=y
-CONFIG_GENERIC_NET_UTILS=y
-CONFIG_CORDIC=m
-CONFIG_PRIME_NUMBERS=m
-CONFIG_RATIONAL=y
-CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y
-CONFIG_ARCH_HAS_FAST_MULTIPLIER=y
-CONFIG_ARCH_USE_SYM_ANNOTATIONS=y
-CONFIG_CRC4=m
-CONFIG_CRC7=m
-CONFIG_CRC8=m
-CONFIG_CRC16=y
-CONFIG_CRC_CCITT=m
-CONFIG_CRC_ITU_T=m
-CONFIG_CRC_T10DIF=y
-CONFIG_CRC_T10DIF_ARCH=y
-CONFIG_CRC32=y
-CONFIG_CRC32_ARCH=y
-CONFIG_CRC64=y
-CONFIG_CRC64_ARCH=y
-CONFIG_CRC_OPTIMIZATIONS=y
-
-#
-# Crypto library routines
-#
-CONFIG_CRYPTO_HASH_INFO=y
-CONFIG_CRYPTO_LIB_UTILS=y
-CONFIG_CRYPTO_LIB_AES=y
-CONFIG_CRYPTO_LIB_ARC4=m
-CONFIG_CRYPTO_LIB_GF128MUL=m
-CONFIG_CRYPTO_LIB_CHACHA=y
-CONFIG_CRYPTO_LIB_CURVE25519=m
-CONFIG_CRYPTO_LIB_CURVE25519_GENERIC=y
-CONFIG_CRYPTO_LIB_DES=m
-CONFIG_CRYPTO_LIB_MD5=y
-CONFIG_CRYPTO_LIB_POLY1305=y
-CONFIG_CRYPTO_LIB_POLY1305_ARCH=y
-CONFIG_CRYPTO_LIB_POLY1305_GENERIC=y
-CONFIG_CRYPTO_LIB_POLY1305_RSIZE=2
-CONFIG_CRYPTO_LIB_CHACHA20POLY1305=y
-CONFIG_CRYPTO_LIB_SHA1=m
-CONFIG_CRYPTO_LIB_SHA256=y
-CONFIG_CRYPTO_LIB_SHA512=y
-CONFIG_CRYPTO_LIB_SM3=m
-# end of Crypto library routines
-
-CONFIG_XXHASH=y
-CONFIG_AUDIT_GENERIC=y
-# CONFIG_RANDOM32_SELFTEST is not set
-CONFIG_842_COMPRESS=m
-CONFIG_842_DECOMPRESS=m
-CONFIG_ZLIB_INFLATE=y
-CONFIG_ZLIB_DEFLATE=y
-CONFIG_LZO_COMPRESS=y
-CONFIG_LZO_DECOMPRESS=y
-CONFIG_LZ4_COMPRESS=m
-CONFIG_LZ4HC_COMPRESS=m
-CONFIG_LZ4_DECOMPRESS=m
-CONFIG_ZSTD_COMMON=y
-CONFIG_ZSTD_COMPRESS=y
-CONFIG_ZSTD_DECOMPRESS=y
-CONFIG_XZ_DEC=m
-CONFIG_XZ_DEC_X86=y
-CONFIG_XZ_DEC_POWERPC=y
-CONFIG_XZ_DEC_ARM=y
-CONFIG_XZ_DEC_ARMTHUMB=y
-CONFIG_XZ_DEC_ARM64=y
-CONFIG_XZ_DEC_SPARC=y
-CONFIG_XZ_DEC_RISCV=y
-# CONFIG_XZ_DEC_MICROLZMA is not set
-CONFIG_XZ_DEC_BCJ=y
-# CONFIG_XZ_DEC_TEST is not set
-CONFIG_DECOMPRESS_GZIP=y
-CONFIG_DECOMPRESS_BZIP2=y
-CONFIG_DECOMPRESS_ZSTD=y
-CONFIG_GENERIC_ALLOCATOR=y
-CONFIG_REED_SOLOMON=m
-CONFIG_REED_SOLOMON_ENC8=y
-CONFIG_REED_SOLOMON_DEC8=y
-CONFIG_REED_SOLOMON_DEC16=y
-CONFIG_BCH=m
-CONFIG_BCH_CONST_PARAMS=y
-CONFIG_TEXTSEARCH=y
-CONFIG_TEXTSEARCH_KMP=m
-CONFIG_TEXTSEARCH_BM=m
-CONFIG_TEXTSEARCH_FSM=m
-CONFIG_BTREE=y
-CONFIG_INTERVAL_TREE=y
-CONFIG_INTERVAL_TREE_SPAN_ITER=y
-CONFIG_XARRAY_MULTI=y
-CONFIG_ASSOCIATIVE_ARRAY=y
-CONFIG_CLOSURES=y
-CONFIG_HAS_IOMEM=y
-CONFIG_HAS_IOPORT=y
-CONFIG_HAS_IOPORT_MAP=y
-CONFIG_HAS_DMA=y
-CONFIG_NEED_SG_DMA_FLAGS=y
-CONFIG_NEED_DMA_MAP_STATE=y
-CONFIG_ARCH_DMA_ADDR_T_64BIT=y
-CONFIG_DMA_DECLARE_COHERENT=y
-CONFIG_ARCH_HAS_SETUP_DMA_OPS=y
-CONFIG_ARCH_HAS_SYNC_DMA_FOR_DEVICE=y
-CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU=y
-CONFIG_ARCH_HAS_DMA_PREP_COHERENT=y
-CONFIG_ARCH_DMA_DEFAULT_COHERENT=y
-CONFIG_SWIOTLB=y
-# CONFIG_SWIOTLB_DYNAMIC is not set
-CONFIG_DMA_BOUNCE_UNALIGNED_KMALLOC=y
-CONFIG_DMA_NEED_SYNC=y
-# CONFIG_DMA_RESTRICTED_POOL is not set
-CONFIG_DMA_NONCOHERENT_MMAP=y
-CONFIG_DMA_COHERENT_POOL=y
-CONFIG_DMA_DIRECT_REMAP=y
-CONFIG_DMA_CMA=y
-# CONFIG_DMA_NUMA_CMA is not set
-
-#
-# Default contiguous memory area size:
-#
-CONFIG_CMA_SIZE_MBYTES=0
-CONFIG_CMA_SIZE_SEL_MBYTES=y
-# CONFIG_CMA_SIZE_SEL_PERCENTAGE is not set
-# CONFIG_CMA_SIZE_SEL_MIN is not set
-# CONFIG_CMA_SIZE_SEL_MAX is not set
-CONFIG_CMA_ALIGNMENT=8
-# CONFIG_DMA_API_DEBUG is not set
-# CONFIG_DMA_MAP_BENCHMARK is not set
-CONFIG_SGL_ALLOC=y
-CONFIG_CHECK_SIGNATURE=y
-CONFIG_CPU_RMAP=y
-CONFIG_DQL=y
-CONFIG_GLOB=y
-CONFIG_GLOB_SELFTEST=m
-CONFIG_NLATTR=y
-CONFIG_LRU_CACHE=m
-CONFIG_CLZ_TAB=y
-CONFIG_IRQ_POLL=y
-CONFIG_MPILIB=y
-CONFIG_DIMLIB=y
-CONFIG_LIBFDT=y
-CONFIG_OID_REGISTRY=y
-CONFIG_UCS2_STRING=y
-CONFIG_HAVE_GENERIC_VDSO=y
-CONFIG_GENERIC_GETTIMEOFDAY=y
-CONFIG_VDSO_GETRANDOM=y
-CONFIG_FONT_SUPPORT=y
-CONFIG_FONTS=y
-CONFIG_FONT_8x8=y
-CONFIG_FONT_8x16=y
-# CONFIG_FONT_6x11 is not set
-# CONFIG_FONT_7x14 is not set
-# CONFIG_FONT_PEARL_8x8 is not set
-# CONFIG_FONT_ACORN_8x8 is not set
-# CONFIG_FONT_MINI_4x6 is not set
-# CONFIG_FONT_6x10 is not set
-# CONFIG_FONT_10x18 is not set
-# CONFIG_FONT_SUN8x16 is not set
-# CONFIG_FONT_SUN12x22 is not set
-# CONFIG_FONT_TER16x32 is not set
-# CONFIG_FONT_6x8 is not set
-CONFIG_SG_POOL=y
-CONFIG_ARCH_HAS_PMEM_API=y
-CONFIG_MEMREGION=y
-CONFIG_ARCH_STACKWALK=y
-CONFIG_STACKDEPOT=y
-CONFIG_STACKDEPOT_MAX_FRAMES=64
-CONFIG_SBITMAP=y
-CONFIG_PARMAN=m
-CONFIG_OBJAGG=m
-# CONFIG_LWQ_TEST is not set
-# end of Library routines
-
-CONFIG_GENERIC_IOREMAP=y
-CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED=y
-CONFIG_PLDMFW=y
-CONFIG_ASN1_ENCODER=m
-CONFIG_POLYNOMIAL=m
-CONFIG_FIRMWARE_TABLE=y
-CONFIG_UNION_FIND=y
-CONFIG_MIN_HEAP=y
-
-#
-# Kernel hacking
-#
-
-#
-# printk and dmesg options
-#
-CONFIG_PRINTK_TIME=y
-# CONFIG_PRINTK_CALLER is not set
-# CONFIG_STACKTRACE_BUILD_ID is not set
-CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7
-CONFIG_CONSOLE_LOGLEVEL_QUIET=4
-CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4
-# CONFIG_BOOT_PRINTK_DELAY is not set
-CONFIG_DYNAMIC_DEBUG=y
-CONFIG_DYNAMIC_DEBUG_CORE=y
-CONFIG_SYMBOLIC_ERRNAME=y
-CONFIG_DEBUG_BUGVERBOSE=y
-# end of printk and dmesg options
-
-CONFIG_DEBUG_KERNEL=y
-CONFIG_DEBUG_MISC=y
-
-#
-# Compile-time checks and compiler options
-#
-CONFIG_DEBUG_INFO=y
-CONFIG_AS_HAS_NON_CONST_ULEB128=y
-# CONFIG_DEBUG_INFO_NONE is not set
-CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT=y
-# CONFIG_DEBUG_INFO_DWARF4 is not set
-# CONFIG_DEBUG_INFO_DWARF5 is not set
-# CONFIG_DEBUG_INFO_REDUCED is not set
-# CONFIG_DEBUG_INFO_COMPRESSED_NONE is not set
-# CONFIG_DEBUG_INFO_COMPRESSED_ZLIB is not set
-CONFIG_DEBUG_INFO_COMPRESSED_ZSTD=y
-# CONFIG_GDB_SCRIPTS is not set
-CONFIG_FRAME_WARN=2048
-# CONFIG_STRIP_ASM_SYMS is not set
-# CONFIG_HEADERS_INSTALL is not set
-CONFIG_SECTION_MISMATCH_WARN_ONLY=y
-# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_64B is not set
-CONFIG_ARCH_WANT_FRAME_POINTERS=y
-CONFIG_FRAME_POINTER=y
-# CONFIG_VMLINUX_MAP is not set
-# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
-# end of Compile-time checks and compiler options
-
-#
-# Generic Kernel Debugging Instruments
-#
-CONFIG_MAGIC_SYSRQ=y
-CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1
-CONFIG_MAGIC_SYSRQ_SERIAL=y
-CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE=""
-CONFIG_DEBUG_FS=y
-CONFIG_DEBUG_FS_ALLOW_ALL=y
-# CONFIG_DEBUG_FS_DISALLOW_MOUNT is not set
-# CONFIG_DEBUG_FS_ALLOW_NONE is not set
-CONFIG_HAVE_ARCH_KGDB=y
-CONFIG_HAVE_ARCH_KGDB_QXFER_PKT=y
-# CONFIG_KGDB is not set
-CONFIG_ARCH_HAS_UBSAN=y
-# CONFIG_UBSAN is not set
-CONFIG_HAVE_KCSAN_COMPILER=y
-# end of Generic Kernel Debugging Instruments
-
-#
-# Networking Debugging
-#
-# CONFIG_NET_DEV_REFCNT_TRACKER is not set
-# CONFIG_NET_NS_REFCNT_TRACKER is not set
-# CONFIG_DEBUG_NET is not set
-# CONFIG_DEBUG_NET_SMALL_RTNL is not set
-# end of Networking Debugging
-
-#
-# Memory Debugging
-#
-CONFIG_PAGE_EXTENSION=y
-# CONFIG_DEBUG_PAGEALLOC is not set
-CONFIG_SLUB_DEBUG=y
-# CONFIG_SLUB_DEBUG_ON is not set
-# CONFIG_PAGE_OWNER is not set
-# CONFIG_PAGE_TABLE_CHECK is not set
-CONFIG_PAGE_POISONING=y
-# CONFIG_DEBUG_PAGE_REF is not set
-# CONFIG_DEBUG_RODATA_TEST is not set
-CONFIG_ARCH_HAS_DEBUG_WX=y
-CONFIG_DEBUG_WX=y
-CONFIG_ARCH_HAS_PTDUMP=y
-CONFIG_PTDUMP=y
-# CONFIG_PTDUMP_DEBUGFS is not set
-CONFIG_HAVE_DEBUG_KMEMLEAK=y
-# CONFIG_DEBUG_KMEMLEAK is not set
-# CONFIG_PER_VMA_LOCK_STATS is not set
-# CONFIG_DEBUG_OBJECTS is not set
-# CONFIG_SHRINKER_DEBUG is not set
-# CONFIG_DEBUG_STACK_USAGE is not set
-CONFIG_SCHED_STACK_END_CHECK=y
-CONFIG_ARCH_HAS_DEBUG_VM_PGTABLE=y
-# CONFIG_DEBUG_VFS is not set
-# CONFIG_DEBUG_VM is not set
-# CONFIG_DEBUG_VM_PGTABLE is not set
-CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y
-# CONFIG_DEBUG_VIRTUAL is not set
-CONFIG_DEBUG_MEMORY_INIT=y
-# CONFIG_DEBUG_PER_CPU_MAPS is not set
-CONFIG_CODE_TAGGING=y
-CONFIG_MEM_ALLOC_PROFILING=y
-CONFIG_MEM_ALLOC_PROFILING_ENABLED_BY_DEFAULT=y
-# CONFIG_MEM_ALLOC_PROFILING_DEBUG is not set
-CONFIG_HAVE_ARCH_KASAN=y
-CONFIG_HAVE_ARCH_KASAN_VMALLOC=y
-CONFIG_CC_HAS_KASAN_GENERIC=y
-CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y
-# CONFIG_KASAN is not set
-CONFIG_HAVE_ARCH_KFENCE=y
-CONFIG_KFENCE=y
-CONFIG_KFENCE_SAMPLE_INTERVAL=100
-CONFIG_KFENCE_NUM_OBJECTS=255
-# CONFIG_KFENCE_DEFERRABLE is not set
-# CONFIG_KFENCE_STATIC_KEYS is not set
-CONFIG_KFENCE_STRESS_TEST_FAULTS=0
-# end of Memory Debugging
-
-# CONFIG_DEBUG_SHIRQ is not set
-
-#
-# Debug Oops, Lockups and Hangs
-#
-# CONFIG_PANIC_ON_OOPS is not set
-CONFIG_PANIC_TIMEOUT=0
-CONFIG_LOCKUP_DETECTOR=y
-CONFIG_SOFTLOCKUP_DETECTOR=y
-# CONFIG_SOFTLOCKUP_DETECTOR_INTR_STORM is not set
-# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set
-CONFIG_HAVE_HARDLOCKUP_DETECTOR_BUDDY=y
-CONFIG_HARDLOCKUP_DETECTOR=y
-# CONFIG_HARDLOCKUP_DETECTOR_PERF is not set
-CONFIG_HARDLOCKUP_DETECTOR_BUDDY=y
-# CONFIG_HARDLOCKUP_DETECTOR_ARCH is not set
-CONFIG_HARDLOCKUP_DETECTOR_COUNTS_HRTIMER=y
-# CONFIG_BOOTPARAM_HARDLOCKUP_PANIC is not set
-CONFIG_DETECT_HUNG_TASK=y
-CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120
-# CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set
-CONFIG_DETECT_HUNG_TASK_BLOCKER=y
-# CONFIG_WQ_WATCHDOG is not set
-# CONFIG_WQ_CPU_INTENSIVE_REPORT is not set
-CONFIG_TEST_LOCKUP=m
-# end of Debug Oops, Lockups and Hangs
-
-#
-# Scheduler Debugging
-#
-CONFIG_SCHED_INFO=y
-CONFIG_SCHEDSTATS=y
-# end of Scheduler Debugging
-
-# CONFIG_DEBUG_PREEMPT is not set
-
-#
-# Lock Debugging (spinlocks, mutexes, etc...)
-#
-CONFIG_LOCK_DEBUGGING_SUPPORT=y
-# CONFIG_PROVE_LOCKING is not set
-# CONFIG_LOCK_STAT is not set
-# CONFIG_DEBUG_RT_MUTEXES is not set
-# CONFIG_DEBUG_SPINLOCK is not set
-# CONFIG_DEBUG_MUTEXES is not set
-# CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set
-# CONFIG_DEBUG_RWSEMS is not set
-# CONFIG_DEBUG_LOCK_ALLOC is not set
-# CONFIG_DEBUG_ATOMIC_SLEEP is not set
-# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-# CONFIG_LOCK_TORTURE_TEST is not set
-# CONFIG_WW_MUTEX_SELFTEST is not set
-# CONFIG_SCF_TORTURE_TEST is not set
-# CONFIG_CSD_LOCK_WAIT_DEBUG is not set
-# end of Lock Debugging (spinlocks, mutexes, etc...)
-
-# CONFIG_DEBUG_IRQFLAGS is not set
-CONFIG_STACKTRACE=y
-# CONFIG_DEBUG_KOBJECT is not set
-
-#
-# Debug kernel data structures
-#
-# CONFIG_DEBUG_LIST is not set
-# CONFIG_DEBUG_PLIST is not set
-# CONFIG_DEBUG_SG is not set
-# CONFIG_DEBUG_NOTIFIERS is not set
-# CONFIG_DEBUG_CLOSURES is not set
-# CONFIG_DEBUG_MAPLE_TREE is not set
-# end of Debug kernel data structures
-
-#
-# RCU Debugging
-#
-# CONFIG_RCU_SCALE_TEST is not set
-# CONFIG_RCU_TORTURE_TEST is not set
-# CONFIG_RCU_REF_SCALE_TEST is not set
-CONFIG_RCU_CPU_STALL_TIMEOUT=21
-CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=0
-# CONFIG_RCU_CPU_STALL_CPUTIME is not set
-CONFIG_RCU_TRACE=y
-# CONFIG_RCU_EQS_DEBUG is not set
-# end of RCU Debugging
-
-# CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set
-# CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set
-# CONFIG_LATENCYTOP is not set
-# CONFIG_DEBUG_CGROUP_REF is not set
-CONFIG_USER_STACKTRACE_SUPPORT=y
-CONFIG_NOP_TRACER=y
-CONFIG_HAVE_RETHOOK=y
-CONFIG_RETHOOK=y
-CONFIG_HAVE_FUNCTION_TRACER=y
-CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
-CONFIG_HAVE_FUNCTION_GRAPH_FREGS=y
-CONFIG_HAVE_FTRACE_GRAPH_FUNC=y
-CONFIG_HAVE_DYNAMIC_FTRACE=y
-CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS=y
-CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
-CONFIG_TRACER_MAX_TRACE=y
-CONFIG_TRACE_CLOCK=y
-CONFIG_RING_BUFFER=y
-CONFIG_EVENT_TRACING=y
-CONFIG_CONTEXT_SWITCH_TRACER=y
-CONFIG_TRACING=y
-CONFIG_GENERIC_TRACER=y
-CONFIG_TRACING_SUPPORT=y
-CONFIG_FTRACE=y
-CONFIG_TRACEFS_AUTOMOUNT_DEPRECATED=y
-# CONFIG_BOOTTIME_TRACING is not set
-# CONFIG_FUNCTION_TRACER is not set
-# CONFIG_STACK_TRACER is not set
-# CONFIG_IRQSOFF_TRACER is not set
-# CONFIG_PREEMPT_TRACER is not set
-# CONFIG_SCHED_TRACER is not set
-# CONFIG_HWLAT_TRACER is not set
-# CONFIG_OSNOISE_TRACER is not set
-# CONFIG_TIMERLAT_TRACER is not set
-CONFIG_FTRACE_SYSCALLS=y
-CONFIG_TRACER_SNAPSHOT=y
-# CONFIG_TRACER_SNAPSHOT_PER_CPU_SWAP is not set
-CONFIG_BRANCH_PROFILE_NONE=y
-# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set
-CONFIG_BLK_DEV_IO_TRACE=y
-CONFIG_KPROBE_EVENTS=y
-CONFIG_UPROBE_EVENTS=y
-CONFIG_EPROBE_EVENTS=y
-CONFIG_BPF_EVENTS=y
-CONFIG_DYNAMIC_EVENTS=y
-CONFIG_PROBE_EVENTS=y
-# CONFIG_SYNTH_EVENTS is not set
-# CONFIG_USER_EVENTS is not set
-# CONFIG_HIST_TRIGGERS is not set
-# CONFIG_TRACE_EVENT_INJECT is not set
-# CONFIG_TRACEPOINT_BENCHMARK is not set
-# CONFIG_RING_BUFFER_BENCHMARK is not set
-# CONFIG_TRACE_EVAL_MAP_FILE is not set
-# CONFIG_FTRACE_STARTUP_TEST is not set
-# CONFIG_RING_BUFFER_STARTUP_TEST is not set
-# CONFIG_RING_BUFFER_VALIDATE_TIME_DELTAS is not set
-CONFIG_PREEMPTIRQ_DELAY_TEST=m
-CONFIG_KPROBE_EVENT_GEN_TEST=m
-# CONFIG_RV is not set
-# CONFIG_SAMPLES is not set
-CONFIG_HAVE_SAMPLE_FTRACE_DIRECT=y
-CONFIG_HAVE_SAMPLE_FTRACE_DIRECT_MULTI=y
-CONFIG_STRICT_DEVMEM=y
-CONFIG_IO_STRICT_DEVMEM=y
-
-#
-# riscv Debugging
-#
-
-#
-# arch/riscv/kernel Testing and Coverage
-#
-CONFIG_AS_HAS_ULEB128=y
-CONFIG_RUNTIME_KERNEL_TESTING_MENU=y
-# end of arch/riscv/kernel Testing and Coverage
-# end of riscv Debugging
-
-#
-# Kernel Testing and Coverage
-#
-# CONFIG_KUNIT is not set
-# CONFIG_NOTIFIER_ERROR_INJECTION is not set
-# CONFIG_FUNCTION_ERROR_INJECTION is not set
-# CONFIG_FAULT_INJECTION is not set
-CONFIG_ARCH_HAS_KCOV=y
-# CONFIG_KCOV is not set
-CONFIG_RUNTIME_TESTING_MENU=y
-# CONFIG_TEST_DHRY is not set
-# CONFIG_LKDTM is not set
-# CONFIG_TEST_MIN_HEAP is not set
-# CONFIG_TEST_DIV64 is not set
-# CONFIG_TEST_MULDIV64 is not set
-# CONFIG_BACKTRACE_SELF_TEST is not set
-# CONFIG_TEST_REF_TRACKER is not set
-# CONFIG_RBTREE_TEST is not set
-# CONFIG_REED_SOLOMON_TEST is not set
-# CONFIG_INTERVAL_TREE_TEST is not set
-# CONFIG_PERCPU_TEST is not set
-# CONFIG_ATOMIC64_SELFTEST is not set
-# CONFIG_TEST_HEXDUMP is not set
-# CONFIG_TEST_KSTRTOX is not set
-# CONFIG_TEST_BITMAP is not set
-# CONFIG_TEST_UUID is not set
-# CONFIG_TEST_XARRAY is not set
-# CONFIG_TEST_MAPLE_TREE is not set
-# CONFIG_TEST_RHASHTABLE is not set
-# CONFIG_TEST_IDA is not set
-# CONFIG_TEST_PARMAN is not set
-# CONFIG_TEST_LKM is not set
-# CONFIG_TEST_BITOPS is not set
-# CONFIG_TEST_VMALLOC is not set
-# CONFIG_TEST_BPF is not set
-# CONFIG_FIND_BIT_BENCHMARK is not set
-# CONFIG_TEST_FIRMWARE is not set
-# CONFIG_TEST_SYSCTL is not set
-# CONFIG_TEST_UDELAY is not set
-# CONFIG_TEST_STATIC_KEYS is not set
-# CONFIG_TEST_DYNAMIC_DEBUG is not set
-# CONFIG_TEST_KMOD is not set
-CONFIG_TEST_RUNTIME=y
-CONFIG_TEST_RUNTIME_MODULE=y
-CONFIG_TEST_KALLSYMS=m
-CONFIG_TEST_KALLSYMS_A=m
-CONFIG_TEST_KALLSYMS_B=m
-CONFIG_TEST_KALLSYMS_C=m
-CONFIG_TEST_KALLSYMS_D=m
-# CONFIG_TEST_KALLSYMS_FAST is not set
-CONFIG_TEST_KALLSYMS_LARGE=y
-# CONFIG_TEST_KALLSYMS_MAX is not set
-CONFIG_TEST_KALLSYMS_NUMSYMS=100
-CONFIG_TEST_KALLSYMS_SCALE_FACTOR=8
-# CONFIG_TEST_MEMCAT_P is not set
-# CONFIG_TEST_OBJAGG is not set
-# CONFIG_TEST_MEMINIT is not set
-# CONFIG_TEST_HMM is not set
-# CONFIG_TEST_FREE_PAGES is not set
-# CONFIG_TEST_FPU is not set
-# CONFIG_TEST_OBJPOOL is not set
-CONFIG_ARCH_USE_MEMTEST=y
-CONFIG_MEMTEST=y
-# end of Kernel Testing and Coverage
-
-#
-# Rust hacking
-#
-# end of Rust hacking
-# end of Kernel hacking
-
-CONFIG_IO_URING_ZCRX=y
diff --git a/internal/rosa/report.go b/internal/rosa/report.go
index 7792d9e9..7a1f4521 100644
--- a/internal/rosa/report.go
+++ b/internal/rosa/report.go
@@ -14,8 +14,8 @@ import (
"unique"
"unsafe"
- "hakurei.app/internal/pkg"
"hakurei.app/message"
+ "hakurei.app/pkg"
)
// wordSize is the boundary which binary segments are always aligned to.
diff --git a/internal/rosa/report_test.go b/internal/rosa/report_test.go
index 2ca8ac57..8154bc5a 100644
--- a/internal/rosa/report_test.go
+++ b/internal/rosa/report_test.go
@@ -8,8 +8,8 @@ import (
"testing"
"unique"
- "hakurei.app/internal/pkg"
"hakurei.app/internal/rosa"
+ "hakurei.app/pkg"
)
func TestReportZeroLength(t *testing.T) {
diff --git a/internal/rosa/rosa.go b/internal/rosa/rosa.go
index 7b06700c..1ad15100 100644
--- a/internal/rosa/rosa.go
+++ b/internal/rosa/rosa.go
@@ -10,7 +10,7 @@ import (
"unsafe"
"hakurei.app/fhs"
- "hakurei.app/internal/pkg"
+ "hakurei.app/pkg"
)
// Extension is the variant identification string of custom artifact
diff --git a/internal/rosa/rosa_test.go b/internal/rosa/rosa_test.go
index 76e8a53e..ce3dad42 100644
--- a/internal/rosa/rosa_test.go
+++ b/internal/rosa/rosa_test.go
@@ -10,9 +10,9 @@ import (
"testing"
"hakurei.app/check"
- "hakurei.app/internal/pkg"
"hakurei.app/internal/rosa"
"hakurei.app/message"
+ "hakurei.app/pkg"
)
var (
diff --git a/internal/rosa/state.go b/internal/rosa/state.go
index ba17ea23..fca1aa48 100644
--- a/internal/rosa/state.go
+++ b/internal/rosa/state.go
@@ -25,8 +25,8 @@ import (
"hakurei.app/check"
"hakurei.app/container"
- "hakurei.app/internal/pkg"
"hakurei.app/internal/rosa/azalea"
+ "hakurei.app/pkg"
)
// ArtifactH is a handle of the unique name of a prepared [pkg.Artifact].
diff --git a/internal/store/data.go b/internal/store/data.go
index 34a0f261..380481a0 100644
--- a/internal/store/data.go
+++ b/internal/store/data.go
@@ -23,7 +23,8 @@ func entryEncode(w io.Writer, s *hst.State) error {
}
}
-// entryDecodeHeader calls entryReadHeader, returning [hst.AppError] for a non-nil error.
+// entryDecodeHeader calls entryReadHeader, returning [hst.AppError] for a
+// non-nil error.
func entryDecodeHeader(r io.Reader) (hst.Enablements, error) {
if et, err := entryReadHeader(r); err != nil {
return 0, &hst.AppError{Step: "decode state header", Err: err}
@@ -44,11 +45,14 @@ func entryDecode(r io.Reader, p *hst.State) (hst.Enablements, error) {
} else if err = p.Config.Validate(hst.VAllowInsecure); err != nil {
return et, err
} else if p.Enablements.Unwrap() != et {
- return et, &hst.AppError{Step: "validate state enablement", Err: os.ErrInvalid,
+ return et, &hst.AppError{
+ Step: "validate state enablement",
+ Err: os.ErrInvalid,
Msg: fmt.Sprintf(
"state entry %s has unexpected enablement byte %#x, %#x",
p.ID.String(), byte(p.Enablements.Unwrap()), byte(et),
- )}
+ ),
+ }
} else {
return et, nil
}
diff --git a/internal/store/header.go b/internal/store/header.go
index 5b5d73be..0e5a92a2 100644
--- a/internal/store/header.go
+++ b/internal/store/header.go
@@ -60,7 +60,8 @@ func (e *EntrySizeError) Error() string {
return "state entry file " + strconv.Quote(e.Name) + " is too short"
}
-// entryCheckFile checks whether [os.FileInfo] refers to a file that might hold [hst.State].
+// entryCheckFile checks whether [os.FileInfo] refers to a file that might hold
+// [hst.State].
func entryCheckFile(fi os.FileInfo) error {
if fi.IsDir() {
return syscall.EISDIR
diff --git a/internal/store/segment.go b/internal/store/segment.go
index 06849749..8b7dd0d6 100644
--- a/internal/store/segment.go
+++ b/internal/store/segment.go
@@ -7,6 +7,7 @@ import (
"os"
"strconv"
"sync"
+ "syscall"
"hakurei.app/check"
"hakurei.app/hst"
@@ -76,13 +77,20 @@ func (eh *EntryHandle) save(state *hst.State) error {
return err
}
+// KillFunc is the function signature of syscall.Kill.
+type KillFunc func(pid int, sig syscall.Signal) (err error)
+
// Load loads and validates the state entry header, and returns the
// [hst.Enablements] byte. For a non-nil v, the full state payload is decoded
-// and stored in the value pointed to by v.
+// and stored in the value pointed to by v, and if kill is non-nil, the presence
+// of the monitoring process is checked, and a stale entry is destroyed.
//
// Load validates the embedded [hst.Config] value. A non-nil error returned by
// Load is of type [hst.AppError].
-func (eh *EntryHandle) Load(v *hst.State) (hst.Enablements, error) {
+func (eh *EntryHandle) Load(
+ v *hst.State,
+ kill KillFunc,
+) (hst.Enablements, error) {
f, err := eh.open(os.O_RDONLY, 0)
if err != nil {
return 0, err
@@ -92,8 +100,41 @@ func (eh *EntryHandle) Load(v *hst.State) (hst.Enablements, error) {
if v != nil {
et, err = entryDecode(f, v)
if err == nil && v.ID != eh.ID {
- err = &hst.AppError{Step: "validate state identifier", Err: os.ErrInvalid,
- Msg: fmt.Sprintf("state entry %s has unexpected id %s", eh.ID.String(), v.ID.String())}
+ err = &hst.AppError{
+ Step: "validate state identifier",
+ Err: os.ErrInvalid,
+ Msg: fmt.Sprintf(
+ "state entry %s has unexpected id %s",
+ eh.ID.String(), v.ID.String(),
+ ),
+ }
+ }
+ if kill != nil {
+ errno := kill(v.PID, 0)
+ if errno != nil {
+ if !errors.Is(errno, syscall.ESRCH) {
+ err = &hst.AppError{
+ Step: "check monitor process",
+ Err: errno,
+ }
+ } else {
+ if err = eh.Destroy(); err != nil {
+ err = &hst.AppError{
+ Step: "destroy stale entry",
+ Err: err,
+ }
+ } else {
+ err = &hst.AppError{
+ Step: "load stale entry",
+ Err: errno,
+ Msg: fmt.Sprintf(
+ "stale entry %s",
+ eh.ID.String(),
+ ),
+ }
+ }
+ }
+ }
}
} else {
et, err = entryDecodeHeader(f)
@@ -127,7 +168,10 @@ type Handle struct {
// A non-nil error returned by Lock is of type [hst.AppError].
func (h *Handle) Lock() (unlock func(), err error) {
if unlock, err = h.fileMu.Lock(); err != nil {
- return nil, &hst.AppError{Step: "acquire lock on store segment " + strconv.Itoa(h.Identity), Err: err}
+ return nil, &hst.AppError{
+ Step: "acquire lock on store segment " + strconv.Itoa(h.Identity),
+ Err: err,
+ }
}
return
}
@@ -174,8 +218,11 @@ func (h *Handle) Entries() (iter.Seq[*EntryHandle], int, error) {
// this should never happen
if ent.IsDir() {
- eh.DecodeErr = &hst.AppError{Step: step,
- Err: errors.New("unexpected directory " + strconv.Quote(ent.Name()) + " in store")}
+ eh.DecodeErr = &hst.AppError{
+ Step: step,
+ Err: errors.New("unexpected directory " +
+ strconv.Quote(ent.Name()) + " in store"),
+ }
goto out
}
@@ -186,7 +233,10 @@ func (h *Handle) Entries() (iter.Seq[*EntryHandle], int, error) {
// this either indicates a serious bug or external interference
if err := eh.ID.UnmarshalText([]byte(ent.Name())); err != nil {
- eh.DecodeErr = &hst.AppError{Step: "decode store segment entry", Err: err}
+ eh.DecodeErr = &hst.AppError{
+ Step: "decode store segment entry",
+ Err: err,
+ }
goto out
}
diff --git a/internal/store/segment_test.go b/internal/store/segment_test.go
index a244fcdc..6316a278 100644
--- a/internal/store/segment_test.go
+++ b/internal/store/segment_test.go
@@ -2,6 +2,7 @@ package store_test
import (
"errors"
+ "fmt"
"io"
"iter"
"os"
@@ -55,7 +56,7 @@ func TestStateEntryHandle(t *testing.T) {
if err := save(&eh, nil); !reflect.DeepEqual(err, wantErr()) {
t.Errorf("save: error = %v, want %v", err, wantErr())
}
- if _, err := eh.Load(nil); !reflect.DeepEqual(err, wantErr()) {
+ if _, err := eh.Load(nil, nil); !reflect.DeepEqual(err, wantErr()) {
t.Errorf("load: error = %v, want %v", err, wantErr())
}
})
@@ -95,8 +96,10 @@ func TestStateEntryHandle(t *testing.T) {
t.Run("saveload", func(t *testing.T) {
t.Parallel()
- eh := store.EntryHandle{Pathname: check.MustAbs(t.TempDir()).Append("entry"),
- ID: store.NewTemplateState().ID}
+ eh := store.EntryHandle{
+ Pathname: check.MustAbs(t.TempDir()).Append("entry"),
+ ID: store.NewTemplateState().ID,
+ }
if err := save(&eh, store.NewTemplateState()); err != nil {
t.Fatalf("save: error = %v", err)
@@ -125,7 +128,7 @@ func TestStateEntryHandle(t *testing.T) {
t.Run("load header only", func(t *testing.T) {
t.Parallel()
- if et, err := eh.Load(nil); err != nil {
+ if et, err := eh.Load(nil, nil); err != nil {
t.Fatalf("load: error = %v", err)
} else if want := store.NewTemplateState().Enablements.Unwrap(); et != want {
t.Errorf("load: et = %x, want %x", et, want)
@@ -136,7 +139,7 @@ func TestStateEntryHandle(t *testing.T) {
t.Parallel()
var got hst.State
- if _, err := eh.Load(&got); err != nil {
+ if _, err := eh.Load(&got, nil); err != nil {
t.Fatalf("load: error = %v", err)
} else if want := store.NewTemplateState(); !reflect.DeepEqual(&got, want) {
t.Errorf("load: %#v, want %#v", &got, want)
@@ -145,11 +148,64 @@ func TestStateEntryHandle(t *testing.T) {
t.Run("load inconsistent", func(t *testing.T) {
t.Parallel()
- wantErr := &hst.AppError{Step: "validate state identifier", Err: os.ErrInvalid,
- Msg: "state entry 00000000000000000000000000000000 has unexpected id aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}
+ wantErr := &hst.AppError{
+ Step: "validate state identifier",
+ Err: os.ErrInvalid,
+ Msg: "state entry 00000000000000000000000000000000 has unexpected id aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
+ }
ehi := store.EntryHandle{Pathname: eh.Pathname}
- if _, err := ehi.Load(new(hst.State)); !reflect.DeepEqual(err, wantErr) {
+ if _, err := ehi.Load(new(hst.State), nil); !reflect.DeepEqual(err, wantErr) {
+ t.Errorf("load: error = %#v, want %#v", err, wantErr)
+ }
+ })
+
+ t.Run("stale fault", func(t *testing.T) {
+ t.Parallel()
+ wantErr := &hst.AppError{
+ Step: "check monitor process",
+ Err: syscall.EFAULT,
+ }
+
+ if _, err := eh.Load(new(hst.State), func(pid int, sig syscall.Signal) (err error) {
+ if pid != store.NewTemplateState().PID {
+ return fmt.Errorf("bad pid %d", pid)
+ }
+ if sig != 0 {
+ return fmt.Errorf("bad signal %d", sig)
+ }
+ return syscall.EFAULT
+ }); !reflect.DeepEqual(err, wantErr) {
+ t.Errorf("load: error = %#v, want %#v", err, wantErr)
+ }
+ })
+
+ t.Run("stale", func(t *testing.T) {
+ t.Parallel()
+ wantErr := &hst.AppError{
+ Step: "load stale entry",
+ Err: syscall.ESRCH,
+ Msg: "stale entry aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
+ }
+
+ ehi := store.EntryHandle{
+ Pathname: check.MustAbs(t.TempDir()).Append("entry"),
+ ID: eh.ID,
+ }
+
+ if err := save(&ehi, store.NewTemplateState()); err != nil {
+ t.Fatalf("save: error = %v", err)
+ }
+
+ if _, err := ehi.Load(new(hst.State), func(pid int, sig syscall.Signal) (err error) {
+ if pid != store.NewTemplateState().PID {
+ return fmt.Errorf("bad pid %d", pid)
+ }
+ if sig != 0 {
+ return fmt.Errorf("bad signal %d", sig)
+ }
+ return syscall.ESRCH
+ }); !reflect.DeepEqual(err, wantErr) {
t.Errorf("load: error = %#v, want %#v", err, wantErr)
}
})
@@ -229,7 +285,9 @@ func TestSegmentHandle(t *testing.T) {
}
}
- slices.SortFunc(got, func(a, b *store.EntryHandle) int { return strings.Compare(a.Pathname.String(), b.Pathname.String()) })
+ slices.SortFunc(got, func(a, b *store.EntryHandle) int {
+ return strings.Compare(a.Pathname.String(), b.Pathname.String())
+ })
want := tc.want(func(err error, name string) *store.EntryHandle {
eh := store.EntryHandle{DecodeErr: err, Pathname: segment.Append(name)}
if err == nil {
@@ -247,6 +305,8 @@ func TestSegmentHandle(t *testing.T) {
}
t.Run("nonexistent", func(t *testing.T) {
+ t.Parallel()
+
var wantErr = &hst.AppError{Step: "read store segment entries", Err: &os.PathError{
Op: "open",
Path: "/proc/nonexistent",
diff --git a/internal/store/store.go b/internal/store/store.go
index 3604521c..eb9cec41 100644
--- a/internal/store/store.go
+++ b/internal/store/store.go
@@ -1,4 +1,5 @@
-// Package store implements cross-process state tracking for hakurei container instances.
+// Package store provides storage for hakurei instance states, safe for
+// concurrent and cross-process use.
package store
import (
@@ -15,11 +16,15 @@ import (
"hakurei.app/internal/lockedfile"
)
-// MutexName is the pathname of the file backing [lockedfile.Mutex] of a [Store] and [Handle].
+// MutexName is the pathname of the file backing [lockedfile.Mutex] of a [Store]
+// and [Handle].
const MutexName = "lock"
-// A Store keeps track of [hst.State] via a well-known filesystem accessible to all hakurei priv-side processes.
-// Access to store data and related resources are synchronised on a per-segment basis via [Handle].
+// A Store keeps track of [hst.State] via a well-known filesystem accessible to
+// all hakurei priv-side processes.
+//
+// Access to store data and related resources are synchronised on a per-segment
+// basis via [Handle].
type Store struct {
// Pathname of directory that the store is rooted in.
base *check.Absolute
@@ -28,8 +33,10 @@ type Store struct {
handles sync.Map
// Inter-process mutex to synchronise operations against the entire store.
- // Held during List and when initialising previously unknown identities during Do.
- // Must not be accessed directly. Callers should use the bigLock method instead.
+ //
+ // Held during List and when initialising previously unknown identities
+ // during Do. Must not be accessed directly. Callers should use the bigLock
+ // method instead.
fileMu *lockedfile.Mutex
// For creating the base directory.
@@ -43,11 +50,17 @@ type Store struct {
func (s *Store) bigLock() (unlock func(), err error) {
s.mkdirOnce.Do(func() { s.mkdirErr = os.MkdirAll(s.base.String(), 0700) })
if s.mkdirErr != nil {
- return nil, &hst.AppError{Step: "create state store directory", Err: s.mkdirErr}
+ return nil, &hst.AppError{
+ Step: "create state store directory",
+ Err: s.mkdirErr,
+ }
}
if unlock, err = s.fileMu.Lock(); err != nil {
- return nil, &hst.AppError{Step: "acquire lock on the state store", Err: err}
+ return nil, &hst.AppError{
+ Step: "acquire lock on the state store",
+ Err: err,
+ }
}
return
}
@@ -73,7 +86,10 @@ func (s *Store) Handle(identity int) (*Handle, error) {
if err != nil && !errors.Is(err, fs.ErrExist) {
// handle methods will likely return ENOENT
s.handles.CompareAndDelete(identity, h)
- return nil, &hst.AppError{Step: "create store segment directory", Err: err}
+ return nil, &hst.AppError{
+ Step: "create store segment directory",
+ Err: err,
+ }
}
}
return h, nil
@@ -88,8 +104,9 @@ type SegmentIdentity struct {
}
// Segments returns an iterator over all [SegmentIdentity] known to the [Store].
-// To obtain a [Handle] on a segment, caller must then call [Store.Handle].
-// A non-nil error returned by segments is of type [hst.AppError].
+//
+// To obtain a [Handle] on a segment, caller must then call [Store.Handle]. A
+// non-nil error returned by segments is of type [hst.AppError].
func (s *Store) Segments() (iter.Seq[SegmentIdentity], int, error) {
// read directory contents, should only contain storeMutexName and identity
var entries []os.DirEntry
@@ -102,7 +119,10 @@ func (s *Store) Segments() (iter.Seq[SegmentIdentity], int, error) {
unlock()
if err != nil && !errors.Is(err, os.ErrNotExist) {
- return nil, -1, &hst.AppError{Step: "read store segments", Err: err}
+ return nil, -1, &hst.AppError{
+ Step: "read store segments",
+ Err: err,
+ }
}
}
@@ -126,19 +146,25 @@ func (s *Store) Segments() (iter.Seq[SegmentIdentity], int, error) {
}
// this should never happen
- si.Err = &hst.AppError{Step: step, Err: syscall.ENOTDIR,
- Msg: "skipped non-directory entry " + strconv.Quote(ent.Name())}
+ si.Err = &hst.AppError{
+ Step: step, Err: syscall.ENOTDIR,
+ Msg: "skipped non-directory entry " + strconv.Quote(ent.Name()),
+ }
goto out
}
// failure paths either indicates a serious bug or external interference
if v, err := strconv.Atoi(ent.Name()); err != nil {
- si.Err = &hst.AppError{Step: step, Err: err,
- Msg: "skipped non-identity entry " + strconv.Quote(ent.Name())}
+ si.Err = &hst.AppError{
+ Step: step, Err: err,
+ Msg: "skipped non-identity entry " + strconv.Quote(ent.Name()),
+ }
goto out
} else if v < hst.IdentityStart || v > hst.IdentityEnd {
- si.Err = &hst.AppError{Step: step, Err: syscall.ERANGE,
- Msg: "skipped out of bounds entry " + strconv.Itoa(v)}
+ si.Err = &hst.AppError{
+ Step: step, Err: syscall.ERANGE,
+ Msg: "skipped out of bounds entry " + strconv.Itoa(v),
+ }
goto out
} else {
si.Identity = v
@@ -152,9 +178,12 @@ func (s *Store) Segments() (iter.Seq[SegmentIdentity], int, error) {
}, l, nil
}
-// All returns a non-reusable iterator over all [EntryHandle] known to this [Store].
-// Callers must call copyError after completing iteration and handle the error accordingly.
-// A non-nil error returned by copyError is of type [hst.AppError].
+// All returns a non-reusable iterator over all [EntryHandle] known to this
+// [Store]. The resulting handles may be retained, but are only safe to use
+// during the iteration producing them.
+//
+// Callers must call copyError after completing iteration and handle the error
+// accordingly. A non-nil error returned by copyError is of type [hst.AppError].
func (s *Store) All() (entries iter.Seq[*EntryHandle], copyError func() error) {
var savedErr error
return func(yield func(*EntryHandle) bool) {
@@ -197,7 +226,12 @@ func (s *Store) All() (entries iter.Seq[*EntryHandle], copyError func() error) {
}
// New returns the address of a new instance of [Store].
-// Multiple instances of [Store] rooted in the same directory is possible, but unsupported.
+//
+// Multiple instances of [Store] rooted in the same directory is possible, but
+// unsupported.
func New(base *check.Absolute) *Store {
- return &Store{base: base, fileMu: lockedfile.MutexAt(base.Append(MutexName).String())}
+ return &Store{
+ base: base,
+ fileMu: lockedfile.MutexAt(base.Append(MutexName).String()),
+ }
}
diff --git a/internal/uevent/coldboot_test.go b/internal/uevent/coldboot_test.go
index 0a50ead4..aa6428a1 100644
--- a/internal/uevent/coldboot_test.go
+++ b/internal/uevent/coldboot_test.go
@@ -11,8 +11,8 @@ import (
"testing"
"hakurei.app/check"
- "hakurei.app/internal/pkg"
"hakurei.app/internal/uevent"
+ "hakurei.app/pkg"
)
func TestColdboot(t *testing.T) {