Po dwóch miesiącach prac Linus Torvalds zaprezentował wydanie jądra Linux 5.18. Wśród najbardziej zauważalnych zmian: przeprowadzono dużą modernizację przestarzałych funkcji, ogłoszono przestarzałym system plików Reiserfs, wdrożono zdarzenia śledzenia procesów użytkownika, dodano wsparcie dla mechanizmu blokowania działania exploitów Intel IBT, włączono tryb wykrywania przepełnień bufora podczas używania funkcji memcpy(), dodano mechanizm śledzenia wywołań funkcji fprobe, poprawiono wydajność harmonogramu zadań na CPU AMD Zen, w skład włączono sterownik do zarządzania funkcjonalnością CPU Intel (SDS), zintegrowano część poprawek do restrukturyzacji plików nagłówkowych, zatwierdzono zastosowanie standardu C11.
Do nowej wersji wprowadzono 16206 poprawek od 2127 programistów (w poprzedniej wersji było 14203 poprawek od 1995 programistów), rozmiar łatki wynosi 108 MB (zmiany objęły 14235 plików, dodano 1340982 linie kodu, usunięto 593836 linii). Około 44% wszystkich zmian w 5.18 dotyczy sterowników urządzeń, około 16% odnosi się do aktualizacji kodu specyficznego dla architektur sprzętowych, 11% związane jest z stosami sieciowymi, 3% z systemami plików i 3% z wewnętrznymi subsystemami jądra.
Główne nowości w jądrze 5.18:
- Podsystem dyskowy, wejście/wyjście i systemy plików
- W systemie plików Btrfs dodano wsparcie dla przesyłania skompresowanych danych podczas wykonywania operacji send i receive. Wcześniej przy użyciu send/receive strona wysyłająca dekompresowała dane przechowywane w skompresowanej formie, a strona odbierająca ponownie kompresowała je przed zapisaniem. W jądrze 5.18 aplikacjom w przestrzeni użytkownika, korzystającym z wywołań send/receive, dano możliwość przesyłania skompresowanych danych bez ponownego pakowania. Funkcjonalność ta została zrealizowana dzięki nowym operacjom ioctl BTRFS_IOC_ENCODED_READ i BTRFS_IOC_ENCODED_WRITE, umożliwiającym bezpośrednie czytanie i zapisywanie informacji w ekstencjach.
Dodatkowo w Btrfs zwiększono wydajność fsync. Dodano możliwość deduplikacji oraz realizacji reflink (klonowanie metadanych pliku z utworzeniem linku do już istniejących danych bez ich faktycznego kopiowania) dla całego magazynu, nie ograniczając się do punktów montowania.
- W trybie bezpośredniego dostępu (Direct I/O) możliwe jest uzyskanie dostępu do zaszyfrowanych plików przy użyciu inline-szyfrowania w fscrypt, gdzie operacje szyfrowania i deszyfrowania są realizowane przez kontroler dysku, a nie przez jądro. Przy standardowym szyfrowaniu realizowanym przez jądro dostęp do zaszyfrowanych plików za pomocą Direct I/O wciąż jest niemożliwy, ponieważ dostęp do plików odbywa się z pominięciem mechanizmu buforowania w jądrze.
- Na serwerze NFS domyślnie włączona jest obsługa protokołu NFSv3, która nie wymaga osobnego włączania i jest dostępna przy ogólnym włączeniu NFS. NFSv3 uznawane jest za podstawową i zawsze wspieraną wersję NFS, a wsparcie dla NFSv2 może w przyszłości zostać zakończone. Efektywność odczytu zawartości katalogów została znacząco zwiększona.
- System plików ReiserFS został uznany za przestarzały i oczekuje na usunięcie w 2025 roku. Klasyfikacja ReiserFS jako przestarzałego pozwoli na zmniejszenie nakładów pracy związanych z utrzymywaniem wspólnych dla systemów plików zmian, związanych z wsparciem nowego API do montowania, iomap i dokumentów.
- Dla systemu plików F2FS zrealizowano możliwość mapowania identyfikatorów użytkowników zamontowanych systemów plików, stosowaną do powiązania plików określonego użytkownika na zamontowanej obcej partycji z innym użytkownikiem w bieżącym systemie.
- Przerobiono kod do liczenia statystyk w handlerach Device-mapper, co pozwoliło znacząco zwiększyć dokładność rozliczania w takich handlerach, jak dm-crypt.
- Dla urządzeń NVMe wprowadzono wsparcie 64-bitowych sum kontrolnych do weryfikacji integralności.
- Dla systemu plików exfat zaproponowano nową opcję montowania „keep_last_dots”, zabraniającą czyszczenia kropek na końcu nazwy pliku (w systemie Windows kropki na końcu nazwy domyślnie są usuwane).
- W EXT4 zwiększono wydajność trybu fast_commit oraz zwiększono skalowalność. Opcja montowania „mb_optimize_scan”, pozwalająca na zwiększenie wydajności w warunkach dużej fragmentacji FS, została dostosowana do pracy z plikami z rozszerzeniami.
- Wsparcie dla strumieni zapisu (write stream) w podsystemie obsługującym urządzenia blokowe zostało zakończone. Ta funkcjonalność była zaproponowana dla SSD, ale nie zyskała popularności, a obecnie w obiegu brakuje urządzeń obsługujących ten tryb, co czyni mało prawdopodobnym, że pojawią się w przyszłości.
- W systemie plików Btrfs dodano wsparcie dla przesyłania skompresowanych danych podczas wykonywania operacji send i receive. Wcześniej przy użyciu send/receive strona wysyłająca dekompresowała dane przechowywane w skompresowanej formie, a strona odbierająca ponownie kompresowała je przed zapisaniem. W jądrze 5.18 aplikacjom w przestrzeni użytkownika, korzystającym z wywołań send/receive, dano możliwość przesyłania skompresowanych danych bez ponownego pakowania. Funkcjonalność ta została zrealizowana dzięki nowym operacjom ioctl BTRFS_IOC_ENCODED_READ i BTRFS_IOC_ENCODED_WRITE, umożliwiającym bezpośrednie czytanie i zapisywanie informacji w ekstencjach.
- Pamięć i usługi systemowe
- Została rozpoczęta integracja zestawu poprawek, które znacząco skracają czas kompilacji jądra poprzez restrukturyzację hierarchii plików nagłówkowych i redukcję liczby zależności krzyżowych. W skład jądra 5.18 włączono poprawki optymalizujące strukturę plików nagłówkowych planisty zadań (kernel/sched). W porównaniu do poprzedniej wersji, zużycie czasu procesora podczas kompilacji kodu kernel/sched zmniejszyło się o 61%, a rzeczywisty czas spadł o 3,9% (z 2,95 do 2,84 sekundy).
- W kodzie jądra zezwolono na użycie standardu C11, opublikowanego w 2011 roku. Wcześniej dodawany do jądra kod musiał odpowiadać specyfikacji ANSI C (C89), ustalonej jeszcze w 1989 roku. W skryptach kompilacyjnych jądra 5.18 opcja ‘—std=gnu89’ została zamieniona na ‘—std=gnu11 -Wno-shift-negative-value’. Rozważano możliwość użycia standardu C17, ale w tym przypadku konieczne byłoby podniesienie minimalnej obsługiwanej wersji GCC, natomiast włączenie obsługi C11 mieści się w obecnych wymaganiach wersji GCC (5.1).
- Poprawiono wydajność planowania zadań na procesorach AMD z mikroarchitekturą Zen, w których dla każdego węzła z lokalnymi kanałami pamięci dostępnych jest kilka pamięci podręcznych ostatniego poziomu (LLC, Last Level Cache). W nowej wersji wyeliminowano nierównowagę LLC między węzłami NUMA, co w przypadku niektórych rodzajów obciążenia doprowadziło do znacznego wzrostu wydajności.
- Rozszerzono narzędzia do śledzenia aplikacji w przestrzeni użytkownika. W nowej wersji jądra dodano możliwość tworzenia przez procesy użytkownika zdarzeń śledzenia (User events) oraz zapisywania danych w buforze śledzenia, które można przeglądać za pomocą typowych narzędzi do śledzenia jądra, takich jak ftrace i perf. Zdarzenia śledzenia z przestrzeni użytkownika są izolowane od zdarzeń śledzenia jądra. Stan zdarzeń można przeglądać za pomocą pliku /sys/kernel/debug/tracing/user_events_status, a rejestracja zdarzenia i zapisywanie danych odbywa się za pomocą pliku /sys/kernel/debug/tracing/user_events_data.
- Dodano mechanizm śledzenia (probe) wywołań funkcji — fprobe. API fprobe opiera się na ftrace, ale jest ograniczone tylko do możliwości podłączania callbacków do punktów wejścia i zakończenia funkcji. W przeciwieństwie do kprobes i kretprobes, nowy mechanizm pozwala na użycie jednego handlera dla kilku funkcji jednocześnie.
- Wsparcie dla starych procesorów ARM (ARMv4 i ARMv5) bez jednostki zarządzania pamięcią (MMU) zostało zakończone. Wsparcie dla systemów ARMv7-M bez MMU zostało zachowane.
- Wsparcie dla architektury przypominającej RISC NDS32, wykorzystywanej w procesorach firmy Andes Technologies, zostało zakończone. Kod został usunięty z powodu braku wsparcia oraz niskiego zapotrzebowania na obsługę NDS32 w głównym jądrze Linux (pozostali użytkownicy korzystają ze specjalistycznych wersji jądra od producentów sprzętu).
- Domyślnie wyłączono kompilację jądra z obsługą formatu plików wykonywalnych a.out dla architektur alpha i m68k, w których format ten jest nadal używany. Prawdopodobnie wsparcie dla przestarzałego formatu a.out wkrótce zostanie całkowicie usunięte z jądra. Plany usunięcia formatu a.out są dyskutowane od 2019 roku.
- Dla architektury PA-RISC zrealizowano minimalne wsparcie dla mechanizmu vDSO (virtual dynamic shared objects), który zapewnia ograniczony zestaw wywołań systemowych, dostępnych w przestrzeni użytkownika bez przełączania kontekstu. Wsparcie vDSO umożliwiło uruchamianie z niewykonywalnym stosem.
- Dodano wsparcie dla mechanizmu Intel HFI (Hardware Feedback Interface), który pozwala sprzętowi przekazywać jądru informacje o aktualnej wydajności i efektywności energetycznej każdego CPU.
- Dodano sterownik dla mechanizmu Intel SDSi (Software-Defined Silicon), który pozwala na zarządzanie aktywacją dodatkowych funkcji w procesorze (na przykład specjalistycznych instrukcji i dodatkowej pamięci podręcznej). Idea polega na tym, że tańsze układy mogą być dostarczane z zablokowanymi rozszerzonymi funkcjami, które następnie można 'dokupić' i aktywować dodatkowe możliwości bez wymiany sprzętu.
- Dodano sterownik amd_hsmp do wsparcia interfejsu AMD HSMP (Host System Management Port), który umożliwia dostęp do funkcji zarządzania procesorem za pomocą zestawu specjalnych rejestrów dostępnych w procesorach serwerowych AMD EPYC od pokolenia Fam19h. Przykładowo, przez HSMP można uzyskać dane o zużyciu energii i temperaturze, ustawić ograniczenia na częstotliwość, aktywować różne tryby zwiększania wydajności oraz zarządzać parametrami pracy pamięci.
- W interfejsie asynchronicznego wejścia/wyjścia io_uring wprowadzono opcję IORING_SETUP_SUBMIT_ALL do rejestrowania zestawu deskryptorów plików w buforze cyklicznym, a także operację IORING_OP_MSG_RING, umożliwiającą wysyłanie sygnałów z jednego bufora cyklicznego do drugiego.
- W mechanizmie DAMOS (Schematy Operacyjne Oparte na Monitorowaniu Dostępu do Danych), który umożliwia zwalnianie pamięci z uwzględnieniem częstotliwości dostępu do pamięci, rozszerzono możliwości kontroli operacji związanych z pamięcią w przestrzeni użytkownika.
- Zintegrowano trzecią serię poprawek z realizacją koncepcji zwojów pamięci (page folios), które przypominają połączone strony pamięci (compound pages), ale różnią się lepszą semantyką i bardziej przejrzystą organizacją pracy. Użycie zwojów przyspiesza zarządzanie pamięcią w niektórych podsystemach jądra. W zaproponowanych poprawkach dokonano przekształcenia wewnętrznych funkcji zarządzania pamięcią na zwoje, w tym rodzajów funkcji get_user_pages(). Zapewniono wsparcie dla tworzenia dużych zwojów w kodzie wstępnego wczytywania danych.
- W systemie kompilacji wprowadzono wsparcie dla zmiennych środowiskowych USERCFLAGS i USERLDFLAGS, za pomocą których można przekazać dodatkowe flagi do kompilatora i linkera.
- W podsystemie eBPF w mechanizmie BTF (BPF Type Format), który dostarcza informacji do sprawdzania typów w pseudokodzie BPF, wprowadzono możliwość dodawania adnotacji do zmiennych odwołujących się do obszarów pamięci w przestrzeni użytkownika. Adnotacje pomagają systemowi weryfikacji kodu BPF lepiej identyfikować i weryfikować odniesienia do pamięci.
- Zaproponowano nowy procesor alokacji pamięci do przechowywania załadowanych programów BPF, który pozwala na bardziej efektywne wykorzystanie pamięci w sytuacjach ładowania dużej liczby programów BPF.
- W systemowym wywołaniu madvise() dodano flagę MADV_DONTNEED_LOCKED, która uzupełnia już istniejącą flagę MADV_DONTNEED, przez którą jądro może wcześniej poinformować o planowanym zwolnieniu bloku pamięci, tj. o tym, że ten blok nie jest już potrzebny i może być używany przez jądro. W przeciwieństwie do MADV_DONTNEED, użycie flagi MADV_DONTNEED_LOCKED jest dozwolone dla stron pamięci przypisanych w RAM, które przy wywołaniu madvise są usuwane bez zmiany ich statusu przypisania, a w przypadku późniejszego dostępu do bloku i generacji „page fault” są zwracane z zachowaniem powiązania. Dodatkowo dodano modyfikację umożliwiającą użycie flagi MADV_DONTNEED z dużymi stronami pamięci w HugeTLB.
- Wirtualizacja i bezpieczeństwo
- Dla architektury x86 dodano wsparcie dla mechanizmu ochrony strumienia wykonywania instrukcji Intel IBT (Indirect Branch Tracking), który utrudnia stosowanie technik budowy exploitów z wykorzystaniem metod programowania opartego na powrocie (ROP, Return-Oriented Programming), w których exploit jest tworzony w formie łańcucha wywołań już istniejących w pamięci fragmentów instrukcji maszynowych, kończących się instrukcją zwrotu kontroli (zazwyczaj są to zakończenia funkcji). Istota realizowanej metody ochrony polega na blokowaniu przejść pośrednich do ciała funkcji poprzez dodanie na początku funkcji specjalnej instrukcji ENDBR oraz zezwolenie na wykonanie przez przejście pośrednie tylko w przypadku przejścia do tej instrukcji (przejście pośrednie przez JMP i CALL powinno zawsze trafiać na instrukcję ENDBR, która umieszczona jest na samym początku funkcji).
- Włączono surowszą kontrolę granic buforów w funkcjach memcpy(), memmove() i memset(), wykonywaną na etapie kompilacji przy włączeniu trybu CONFIG_FORTIFY_SOURCE. Dodana zmiana polega na sprawdzaniu przekroczenia granic elementów struktur, których rozmiar jest znany. Zauważono, że zrealizowana możliwość umożliwiłaby blokowanie wszystkich związanych z memcpy() przepełnień bufora w jądrze, które zostały wykryte przynajmniej w ciągu ostatnich trzech lat.
- Dodano drugie wydanie kodu zaktualizowanej implementacji generatora liczb pseudolosowych RDRAND, który jest odpowiedzialny za działanie urządzeń /dev/random i /dev/urandom. Nowa implementacja charakteryzuje się unifikacją działania /dev/random i /dev/urandom, dodaniem ochrony przed pojawianiem się duplikatów w strumieniu liczb losowych podczas uruchamiania. maszyn wirtualnych oraz przejściem na użycie funkcji skrótu BLAKE2s zamiast SHA1 do operacji mieszania entropii. Zmiana ta poprawiła bezpieczeństwo generatora liczb pseudolosowych dzięki eliminacji problematycznego algorytmu SHA1 oraz wykluczeniu nadpisywania wektora inicjalizacji RNG. Ponieważ algorytm BLAKE2s przewyższa SHA1 pod względem wydajności, jego zastosowanie pozytywnie wpłynęło również na wydajność.
- Dla architektury ARM64 dodano wsparcie dla nowego algorytmu uwierzytelniania wskaźników — "QARMA3", który jest szybszy niż algorytm QARMA, zachowując odpowiedni poziom ochrony. Technologia ta pozwala na wykorzystanie specjalistycznych instrukcji ARM64 do weryfikacji adresów powrotu przy wykorzystaniu podpisów cyfrowych, które są przechowywane w nieużywanych górnych bitach samego wskaźnika.
- Dla architektury ARM64 wdrożono wsparcie dla kompilacji z włączeniem w GCC 12 trybu ochrony przed nadpisywaniem adresu powrotu z funkcji w przypadku przepełnienia bufora na stosie. Istota ochrony polega na zachowaniu adresu powrotu po przekazaniu kontroli funkcji w oddzielnym "cienkim" stosie i wyciągnięciu tego adresu przed wyjściem z funkcji.
- Dodano nowe repozytorium kluczy (keyring) — "machine", zawierające klucze właściciela systemu (MOK, Machine Owner Keys), które są obsługiwane w loaderze shim. Wskazane klucze mogą być używane do podpisywania cyfrowego komponentów jądra ładowanych na etapie po uruchomieniu (np. modułów jądra).
- Usunięto wsparcie dla asymetrycznych kluczy prywatnych dla TPM, które były proponowane w przestarzałej wersji TPM, mają znane problemy z bezpieczeństwem i nie zyskały rozpowszechnienia w praktyce.
- Dodano ochronę danych typu size_t przed przepełnieniami liczbowymi. W kodzie wykorzystano funkcje size_mul(), size_add() i size_sub(), które pozwalają bezpiecznie wykonywać mnożenie, dodawanie i odejmowanie rozmiarów typu size_t.
- Podczas kompilacji jądra włączone są flagi „-Warray-bounds” i „-Wzero-length-bounds”, które wyświetlają ostrzeżenia o wyjściu indeksu poza zakres tablicy oraz o używaniu tablic o zerowej długości.
- W urządzeniu virtio-crypto dodano wsparcie dla szyfrowania z wykorzystaniem algorytmu RSA.
- Subsystem sieciowy
- W realizacji mostów sieciowych dodano wsparcie trybu blokowania portów (locked mode), w którym użytkownik może przesyłać ruch przez port tylko z dozwolonego adresu MAC. Dodano również możliwość wykorzystania kilku struktur do oceny stanu protokołu STP (Spanning Tree Protocol). Wcześniej dla VLAN możliwa była tylko bezpośrednia związanie z STP (1:1), w którym każdy VLAN był zarządzany niezależnie. W nowej wersji dodano parametr mst_enable, który po włączeniu pozwala na kontrolę stanu VLAN przez moduł MST (Multiple Spanning Trees), a związanie VLAN-ów może odpowiadać modelowi M:N.
- Kontynuowana jest praca nad integracją w stosie sieciowym narzędzi do śledzenia przyczyn odrzucenia pakietów (kody reason). Kod przyczyny jest przesyłany podczas zwalniania pamięci związanej z pakietem i pozwala na uwzględnienie takich sytuacji, jak odrzucenie pakietu z powodu błędów wypełnienia pól nagłówka, wykrycie spoofingu przez filtr rp_filter, błędna suma kontrolna, niedobór pamięci, wywołanie reguł IPSec XFRM, błędny numer sekwencji TCP itp.
- Umożliwiono przesyłanie pakietów sieciowych z programów BPF uruchamianych z przestrzeni użytkownika w trybie BPF_PROG_RUN, w którym programy BPF są wykonywane w jądrze, ale zwracają wyniki do przestrzeni użytkownika. Pakiety są przesyłane z wykorzystaniem podsystemu XDP (eXpress Data Path). Wsparcie posiada tryb na żywo, w którym obsługa XDP może na bieżąco przekierowywać pakiety sieciowe do stosu sieciowego lub do innych urządzeń. Możliwe jest również tworzenie programów generujących zewnętrzny ruch lub wstawianie ramki sieciowe do stosu sieciowego.
- Dla programów BPF, przymocowanych do cgroups sieciowych, zaproponowano funkcje pomocnicze do jawnego ustawienia wartości zwracanej przez wywołania systemowe, co pozwala na przekazanie bardziej szczegółowych informacji o przyczynach blokady wywołania systemowego.
- Dodano wsparcie dla fragmentowanych pakietów w systemie XDP (eXpress Data Path), które są przechowywane w wielu buforach, co pozwala na przetwarzanie Jumbo-ramkach w XDP oraz stosowanie TSO/GRO (TCP Segmentation Offload/Generic Receive Offload) dla XDP_REDIRECT.
- Znacząco przyspieszono proces usuwania przestrzeni nazw sieciowych, co było pożądane w niektórych dużych systemach z dużą ilością ruchu.
- Sprzęt
- W sterowniku amdgpu domyślnie włączono technologię adaptacyjnej synchronizacji FreeSync, która pozwala na dostosowywanie częstotliwości odświeżania na ekranie, zapewniając płynność i brak rozrywania obrazu podczas gier i oglądania filmów. Ogłoszono stabilne wsparcie dla GPU Aldebaran.
- W sterowniku i915 dodano wsparcie dla układów Intel Alder Lake N oraz dyskretnych kart graficznych Intel DG2-G12 (Arc Alchemist).
- W sterowniku nouveau zapewniono wsparcie dla wyższych bitrate'ów w interfejsach DP/eDP oraz dla extenderów kablowych lttprs (Link-Training Tunable PHY Repeaters).
- W subsystemie drm (Direct Rendering Manager) w sterownikach armada, exynos, gma500, hyperv, imx, ingenic, mcde, mediatek, msm, omap, rcar-du, rockchip, sprd, sti, tegra, tilcdc, xen i vc4 dodano wsparcie dla parametru nomodeset, który pozwala na wyłączenie przełączania trybów wideo na poziomie jądra oraz korzystania z narzędzi do sprzętowego przyspieszania renderowania, pozostawiając tylko funkcjonalność związaną z systemowym ramką bufora.
- Dodano wsparcie dla SoC ARM Qualcomm Snapdragon 625/632 (używanego w smartfonach LG Nexus 5X i Fairphone FP3), Samsung Exynos 850, Samsung Exynos 7885 (używanego w Samsung Galaxy A8), Airoha (Mediatek/EcoNet) EN7523, Mediatek mt6582 (tablet Prestigio PMT5008 3G), Microchip Lan966, Renesas RZ/G2LC, RZ/V2L, Tesla FSD, TI K3/AM62 oraz i.MXRTxxxx.
- Dodano wsparcie dla urządzeń ARM i płyt Broadcom (Raspberry Pi Zero 2 W), Qualcomm (Google Herobrine R1 Chromebook, SHIFT6mq, Samsung Galaxy Book2), Rockchip (Pine64 PineNote, Bananapi-R2-Pro, STM32 Emtrion emSBS, Samsung Galaxy Tab S, tablet Prestigio PMT5008 3G), Allwinner (A20-Marsboard), Amlogic (Amediatek X96-AIR, CYX A95XF3-AIR, Haochuangy H96-Max, Amlogic AQ222 i OSMC Vero 4K+), Aspeed (Quanta S6Q, ASRock ROMED8HM3), Marvell MVEBU/Armada (Ctera C200 V1 i V2 NAS), Mstar (DongShanPiOne, Miyoo Mini), NXP i.MX (Protonic PRT8MM, emCON-MX8M Mini, Toradex Verdin, Gateworks GW7903).
- Dodano wsparcie dla systemów dźwiękowych i kodeków AMD PDM, Atmel PDMC, Awinic AW8738, i.MX TLV320AIC31xx, Intel CS35L41, ESSX8336, Mediatek MT8181, nVidia Tegra234, Qualcomm SC7280, Renesas RZ/V2L, Texas Instruments TAS585M. Dodano wstępną implementację sterownika dźwięku dla chipu DSP Intel AVS. Zaktualizowano wsparcie dla sterowników Intel ADL i Tegra234 oraz wprowadzono zmiany mające na celu poprawę jakości dźwięku na urządzeniach Dell, HP, Lenovo, ASUS, Samsung i Clevo.
Równocześnie latynoamerykański Fundusz Wolnego Oprogramowania stworzył wersję w pełni wolnego jądra 5.18 — Linux-libre 5.18-gnu, oczyszczoną z elementów firmware i sterowników, które zawierają nieliczne komponenty lub fragmenty kodu, których użycie jest ograniczone przez producenta. W nowym wydaniu przeprowadzono czyszczenie sterowników dla paneli MIPI DBI, VPU Amphion, WiFi MediaTek MT7986 WMAC, Mediatek MT7921U (USB) i Realtek 8852a/8852c, chipów dźwiękowych Intel AVS oraz Texas Instruments TAS5805M. Również przeprowadzono czyszczenie plików DTS dla różnych SoC Qualcomm z procesorami opartymi na architekturze AArch64. Zaktualizowano kod czyszczenia blobów w sterownikach i podsystemach AMD GPU, MediaTek MT7915, Silicon Labs WF200+ WiFi, Mellanox Spectrum Ethernet, Realtek rtw8852c, Qualcomm Q6V5, Wolfson ADSP, MediaTek HCI UART.
Źródło: opennet.ru
