Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
96 commits
Select commit Hold shift + click to select a range
1f50072
extfs: Optimize inode reads
oberrow Nov 5, 2025
10a1ea4
vfs: Fix bugs with dirent lookups over different mount points
oberrow Nov 5, 2025
fc39271
vfs: Fix TTY bug
oberrow Nov 5, 2025
1d40319
ahci: Prefault pages before adding them to a PRDT
oberrow Nov 15, 2025
518d28f
mm: Change signature of Mm_VirtualMemoryLock
oberrow Nov 15, 2025
280d7d6
docs: Update README
oberrow Nov 5, 2025
766a855
misc: Update uACPI
oberrow Nov 6, 2025
b0e58dc
sys: Add Sys_ThreadGetStack
oberrow Nov 9, 2025
c91ae68
misc: Remove unnecessary text from README
oberrow Nov 14, 2025
d142976
net/tcp: Fix bug
oberrow Nov 22, 2025
28e54a4
core: Fix compiler error with -Werror in release mode
oberrow Nov 22, 2025
e23b631
e1000: Fix bugs
oberrow Nov 22, 2025
dc231ee
sys: Fix bug with Sys_ProcessStart
oberrow Nov 22, 2025
b6f94f9
core: Count processes in a PGRP as a reference
oberrow Nov 22, 2025
16efa04
x86_64: Fix a bug with the syscall trap handler
oberrow Nov 22, 2025
51d50ca
boot: Allow use of either Hyper or Limine to boot the kernel
oberrow Nov 22, 2025
7bd385d
misc: Fix compilation error
oberrow Nov 22, 2025
932946d
misc: Fix bug in build system
oberrow Nov 22, 2025
32217f4
extfs: Check if inode is not null before blindly using it
oberrow Nov 22, 2025
43484f6
x86_64: Fix bug in early boot code
oberrow Nov 22, 2025
bed8b65
Revert 6b0be519151480050b19d9eef2c213bbc1becf96
oberrow Nov 22, 2025
3cfedd5
e1000: Changes
oberrow Nov 23, 2025
d9b1b93
x86_64: Print bootloader on boot in release configurations
oberrow Nov 23, 2025
8c0a299
init: Only waitpid() on the handoff process
oberrow Nov 24, 2025
6a77783
misc: Handle Core_WaitOnObject(s) errors
oberrow Nov 24, 2025
2ef3cfe
init: Fix a bug in NM
oberrow Nov 24, 2025
d2a8dee
core: Add CoreS_ForceYieldOnSyscallReturn
oberrow Nov 24, 2025
42e99e7
misc: Changes
oberrow Nov 25, 2025
b48554d
initrd: Fix bug with LNKTYPE files in the archive
oberrow Nov 26, 2025
5e9dcbe
misc: fix bug in limine.cmake dependency file
oberrow Nov 26, 2025
3cee706
misc: Make signal handlers global in a process
oberrow Nov 26, 2025
35839b7
misc: Make initial bump allocator size configurable at boot-time
oberrow Nov 26, 2025
21e1576
mm: Add MmS_TLBShootdown
oberrow Nov 26, 2025
6785dda
drv: add Drv_TLBShootdown for drivers to use in place of MmS_TLBShoot…
oberrow Nov 26, 2025
7221a2e
x86_64: Optimize TLB shootdowns
oberrow Nov 26, 2025
e955433
x86_64: Fix bug with TLB shootdown
oberrow Nov 26, 2025
f97a029
net/tcp: Reset connection when socket is closed before a proper shutdown
oberrow Nov 26, 2025
d5f60fb
drv: Fix bug in Drv_LoadDriver
oberrow Nov 26, 2025
d4f9390
net: Fix bug
oberrow Nov 27, 2025
4d88c4e
net/lo: Fix bug
oberrow Nov 27, 2025
bdc0ffa
sys: Return ENOSYS from pselect if except_set is non-zero
oberrow Nov 27, 2025
eedb2a8
libps2: Fix bug
oberrow Nov 27, 2025
b4f5561
net: Fix bug in tcp
oberrow Nov 27, 2025
e7dd98f
mm: Stop indirect use of Mm_Allocator
oberrow Nov 28, 2025
754918b
misc: Cleanup limine.conf
oberrow Nov 28, 2025
d3a144d
core: Optimize spinlocks
oberrow Nov 28, 2025
4b39052
x86_64: Fix possible bug with SMP
oberrow Nov 28, 2025
7f63904
drv: Fix bug with PCI
oberrow Nov 28, 2025
aed45fc
e1000: Fix bugs
oberrow Nov 28, 2025
30efc2f
vfs: Fix bug with pipes
oberrow Nov 29, 2025
a135b7c
net: Fix TCP bug
oberrow Nov 29, 2025
ebea625
misc: Change qemu launch script behavior
oberrow Nov 29, 2025
b4ea494
misc: Fix bug in ELF loader
oberrow Nov 29, 2025
21e45c9
core: Add CoreH_MakeTimerEvent
oberrow Nov 29, 2025
c814a98
net: Implement retransmission of ARP packets on timeout
oberrow Nov 29, 2025
5f43e05
init/nm: Handle ioctl() errors in nm_initialize_interface
oberrow Nov 29, 2025
49a5ba6
core: Do not count the idle thread as a ready thread in cpu_local
oberrow Nov 30, 2025
ccb736f
arch/x86_64: Free page tables in MmS_FreePageTable
oberrow Nov 30, 2025
267d17a
net: Fix bug with ARP
oberrow Nov 30, 2025
9dae8a7
sys: Fix memory leak
oberrow Nov 30, 2025
6aa1686
x86_64: Fix memory leak
oberrow Nov 30, 2025
ad6ae6d
misc: Fix erroneous code
oberrow Nov 30, 2025
fcedc01
user-utils: Install the module commands into sbin instead of bin
oberrow Nov 30, 2025
75cc846
misc: Add new UID/GID fields in process, rename owner_uid and group_u…
oberrow Nov 30, 2025
f4f8c30
sys: Rewrite uid/gid syscalls
oberrow Nov 30, 2025
d0a5452
misc: Fix compile error
oberrow Nov 30, 2025
a808dd5
misc: Add new syscalls to syscall name table
oberrow Nov 30, 2025
d26ad93
user-utils: fix compilation error
oberrow Nov 30, 2025
f3e2845
sys: fix bug in Sys_ExecVE
oberrow Nov 30, 2025
4627885
sys: Implement permission checking for power control syscalls
oberrow Dec 1, 2025
f204f4d
misc: Fix bugs with UID/GID code
oberrow Dec 1, 2025
d85efc9
user-utils: Add a login program
oberrow Dec 1, 2025
ef4b856
user-utils: Do not reset terminal in login on start
oberrow Dec 1, 2025
38b424e
sys: Fix bug with converting from a unix mode to a `struct file_perm`
oberrow Dec 1, 2025
3fbbda4
sys: Fix bug with Sys_Stat
oberrow Dec 1, 2025
c43cc83
sys: Bug fix
oberrow Dec 1, 2025
0959f12
sys: Fix security bug with chown
oberrow Dec 2, 2025
edf7605
vfs: Fix bug in socket implementation
oberrow Dec 2, 2025
10bfab0
vfs: fix bug in Vfs_UnlinkNode
oberrow Dec 2, 2025
7ff6261
user-utils: Set ICRNL
oberrow Dec 2, 2025
bc4e1cb
misc: add login prompt option to limine.conf
oberrow Dec 2, 2025
8cba7aa
user-utils: ignore SIGTSTP in login
oberrow Dec 2, 2025
f33fb26
vfs/tty: fix bug with line editing
oberrow Dec 2, 2025
0aa2378
user-utils: do not accept empty usernames in login utility
oberrow Dec 2, 2025
abf07e6
vfs/tty: fix bug
oberrow Dec 2, 2025
96a4eef
sys: fix page fault in Sys_LoadDriver
oberrow Dec 2, 2025
0a3e411
init: print motd after initializing NM
oberrow Dec 2, 2025
23d7af4
misc: do permission check in signal code
oberrow Dec 2, 2025
2b48447
misc: add new screenshot
oberrow Dec 2, 2025
d8f44da
vfs: change signature of Vfs_Access, and add Vfs_AccessAs
oberrow Dec 2, 2025
cc49c51
user-utils: clear group list before setting new groups
oberrow Dec 2, 2025
7186bba
sys: add Sys_SigPending to the syscall list
oberrow Dec 2, 2025
4770ba7
core: implement suplementary group IDs
oberrow Dec 2, 2025
da8e7c3
vfs: fix bug with Vfs_FdOpenVnode
oberrow Dec 2, 2025
8df7f04
vfs/tty: make all tty devices be owned by gid 5
oberrow Dec 3, 2025
21d01e0
ahci: fix bug in populate_physical_regions
oberrow Dec 3, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@
/dependencies/uACPI
/dependencies/uHDA
/dependencies/flanterm/
/dependencies/freebsd-e1000/
/dependencies/include/
/dependencies/freebsd-e1000
/dependencies/limine
/dependencies/include/
/dependencies/needs_download.cmake
/qemu_log.txt
/tar
Expand Down
15 changes: 15 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ option (OBOS_LAZY_IRQL "Enables lazy IRQL. Recommended if the main target of the
option (OBOS_USE_OBOS_GCC "Uses arch-obos-gcc instead of obos-elf-gcc. Ignored if OBOS_USE_CLANG is true.")
option (OBOS_COMPILE_USER_UTILS "Compiles user examples" ${OBOS_USE_OBOS_GCC})
option (OBOS_ONLY_COMPILE_USER_UTILS "Only compile user utilities" OFF)
option (OBOS_USE_LIMINE "Use Limine instead of Hyper on supported architectures" OFF)
option (OBOS_ENABLE_UHDA "Whether to include uHDA" ON)

set (OBOS_LAZY_IRQL OFF)
Expand Down Expand Up @@ -87,6 +88,10 @@ if (OBOS_REFRESH_DEPENDENCIES)
message("Fetching Hyper.")
include("dependencies/hyper.cmake")
endif()
if (OBOS_USE_LIMINE)
message("Fetching Limine.")
include("dependencies/limine.cmake")
endif()
message("Fetching uACPI.")
include ("dependencies/uacpi.cmake")
message("Fetching flanterm.")
Expand All @@ -105,6 +110,9 @@ else()
if (NOT EXISTS hyper_install AND OBOS_ARCHITECTURE STREQUAL "x86_64")
include("dependencies/hyper.cmake")
endif()
if (OBOS_USE_LIMINE AND NOT EXISTS limine_exe)
include("dependencies/limine.cmake")
endif()
if (NOT EXISTS uacpi_cmake_file)
include("dependencies/uacpi.cmake")
endif()
Expand All @@ -129,7 +137,14 @@ if (OBOS_LAZY_IRQL)
else()
set (OBOS_LAZY_IRQL "0")
endif()

add_compile_definitions(OBOS_LAZY_IRQL=${OBOS_LAZY_IRQL})
if (OBOS_USE_LIMINE)
set (OBOS_USE_LIMINE "1")
else()
set (OBOS_USE_LIMINE "0")
endif()
add_compile_definitions(OBOS_USE_LIMINE=${OBOS_USE_LIMINE})

if (OBOS_ENABLE_LOCK_PROFILING)
set (OBOS_ENABLE_LOCK_PROFILING "1")
Expand Down
6 changes: 1 addition & 5 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
# OBOS
OBOS uses ***✨ state of the art technology ✨*** to do ***✨ almost nothing ✨***
## Downloads
- ISO Downloads can currently be found at http://obos-dev.ddns.net/images/
- An XBPS binary package repository exists at http://obos-dev.ddns.net/current for x86_64-obos **only**.
- The obos file server can be found at http://obos-dev.ddns.net/
## Building
### Prerequisites
- (For an x86-64 build) NASM
Expand Down Expand Up @@ -63,9 +62,6 @@ call launch_qemu.bat
- x86_64-obos: Working, not all ported programs work
- m68k-obos: Userspace is unstable, but the port works otherwise
- For information on ported programs, go to the obos-pkgs repository
## Credits
- My friend [@LemurLord16](https://github.com/LemurLord16) (@sigsbeedrive on discord) for listening to me yap about new features.
- My cousin Ali because why not.
## License Notice
Most code in this repository is licensed under the MIT license.<br>
Any code from other projects that require a license notice will be put below.
Expand Down
4 changes: 4 additions & 0 deletions config/hyper.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -28,3 +28,7 @@ module:
type="memory"
name="FLANTERM_BUFF"
size=16777216
module:
type="memory"
name="BUMP_REGION"
size=16777216
32 changes: 32 additions & 0 deletions config/limine.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
timeout: 5

/OBOS
protocol: limine
comment: OBOS

paging_mode: 4level
module_path: boot():/obos/initrd.tar
module_string: initrd
module_path: boot():/obos/initrd
module_string: initrd_driver
module_path: boot():/obos/flanterm_buff
module_string: FLANTERM_BUFF
module_path: boot():/obos/flanterm_buff
module_string: BUMP_REGION
path: boot():/obos/oboskrnl
cmdline: initrd-module=initrd initrd-driver-module=initrd_driver root-fs-partid initrd load-modules=/libps2,/extfs initial-swap-size=67108864 log-level=1 init-args /usr/bin/bash --login
/OBOS (Login)
protocol: limine
comment: OBOS (Login Prompt)

paging_mode: 4level
module_path: boot():/obos/initrd.tar
module_string: initrd
module_path: boot():/obos/initrd
module_string: initrd_driver
module_path: boot():/obos/flanterm_buff
module_string: FLANTERM_BUFF
module_path: boot():/obos/flanterm_buff
module_string: BUMP_REGION
path: boot():/obos/oboskrnl
cmdline: initrd-module=initrd initrd-driver-module=initrd_driver root-fs-partid initrd load-modules=/libps2,/extfs initial-swap-size=67108864 log-level=1 init-args /usr/bin/bash --login -c login
26 changes: 26 additions & 0 deletions dependencies/limine.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# dependencies/limine.cmake

# Copyright (c) 2025 Omar Berrow

include(FetchContent)

if (OBOS_REFRESH_DEPENDENCIES)
FetchContent_Declare(Limine
GIT_REPOSITORY https://github.com/limine-bootloader/limine.git
GIT_TAG v10.3.0-binary
SOURCE_DIR ${CMAKE_SOURCE_DIR}/dependencies/limine
)
FetchContent_MakeAvailable(Limine)
file (COPY_FILE "${CMAKE_SOURCE_DIR}/dependencies/limine/limine.h" "${CMAKE_SOURCE_DIR}/dependencies/include/limine.h")
endif()
if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux")
execute_process(
COMMAND "make"
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/dependencies/limine
)
set (limine_exe ${CMAKE_SOURCE_DIR}/dependencies/limine/limine CACHE INTERNAL "x")
# elseif (CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows" OR CMAKE_HOST_SYSTEM_NAME STREQUAL "MSYS")
# set (limine_exe ${CMAKE_SOURCE_DIR}/dependencies/limine/limine.exe CACHE INTERNAL "x")
else()
message(FATAL_ERROR "You must be on to compile OBOS with Limine.")
endif()
2 changes: 1 addition & 1 deletion dependencies/uacpi.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ if (OBOS_REFRESH_DEPENDENCIES)
# In honor of the old uACPI link
#GIT_REPOSITORY https://github.com/UltraOS/uACPI.git
GIT_REPOSITORY https://github.com/uACPI/uACPI.git
GIT_TAG 3.0.0
GIT_TAG 3.2.0
SOURCE_DIR ${CMAKE_SOURCE_DIR}/dependencies/uACPI
)
FetchContent_MakeAvailable(uACPI)
Expand Down
Binary file added screenshots/20251202_0930.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 0 additions & 1 deletion scripts/launch_qemu.sh
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ qemu-system-x86_64 \
-debugcon file:/dev/stdout \
-monitor stdio \
-serial tcp:0.0.0.0:1534,server,nowait \
-smp cores=1,threads=1,sockets=1 \
-d int \
-D qemu_log.txt "$@"

Expand Down
26 changes: 26 additions & 0 deletions scripts/launch_qemu.tcg.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
cd ../

rm qemu_log.txt

echo $@
qemu-system-x86_64 \
-drive format=raw,file=out/obos.iso,media=disk,index=0 \
-m 2G \
-gdb tcp:0.0.0.0:1234 -S \
-M q35 \
-cpu Haswell \
-accel tcg \
-debugcon file:/dev/stdout \
-monitor stdio \
-serial tcp:0.0.0.0:1534,server,nowait \
-d int \
-D qemu_log.txt "$@"

# -nographic
# -enable-kvm \
# -M smm=off \
# -no-reboot
# -enable-kvm \
# -no-shutdown

cd scripts
8 changes: 6 additions & 2 deletions src/drivers/generic/ahci/command.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@

#include <irq/timer.h>

#include "locks/wait.h"
#include <locks/wait.h>

#include "structs.h"
#include "command.h"

Expand Down Expand Up @@ -159,6 +160,9 @@ void WaitForTranscations()
Port* port = Ports + i;
for (size_t j = 0; j < 32; j++)
if (port->CommandBitmask & BIT(j) && port->PendingCommands[j])
Core_WaitOnObject(WAITABLE_OBJECT(port->PendingCommands[j]->completionEvent));
{
obos_status status = Core_WaitOnObject(WAITABLE_OBJECT(port->PendingCommands[j]->completionEvent));
OBOS_UNUSED(status);
}
}
}
31 changes: 25 additions & 6 deletions src/drivers/generic/ahci/interface.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
#include <mm/alloc.h>
#include <mm/page.h>
#include <mm/context.h>
#include <mm/handler.h>
#include <mm/bare_map.h>

#include <locks/event.h>
Expand Down Expand Up @@ -63,7 +64,7 @@ static obos_status populate_physical_regions(uintptr_t base, size_t size, struct
base &= ~1;
const size_t MAX_PRDT_COUNT = sizeof(((HBA_CMD_TBL*)nullptr))->prdt_entry/sizeof(HBA_PRDT_ENTRY);
/*
data->phys_regions = Mm_Allocator->Reallocate(Mm_Allocator, data->phys_regions, ++data->physRegionCount*sizeof(struct ahci_phys_region), nullptr);
data->phys_regions = Reallocate(Mm_Allocator, data->phys_regions, ++data->physRegionCount*sizeof(struct ahci_phys_region), nullptr);
struct ahci_phys_region* reg = &data->phys_regions[data->physRegionCount - 1];
*/
long bytesLeft = size;
Expand All @@ -83,17 +84,25 @@ static obos_status populate_physical_regions(uintptr_t base, size_t size, struct
{
if (data->physRegionCount >= MAX_PRDT_COUNT)
return OBOS_STATUS_INTERNAL_ERROR;

Mm_HandlePageFault(ctx, addr, (data->direction == COMMAND_DIRECTION_WRITE ? 0 : PF_EC_RW) | (ctx == &Mm_KernelContext ? 0 : PF_EC_UM));

page_info info = {};
MmS_QueryPageInfo(ctx->pt, addr, &info, nullptr);

page key = {.phys=info.phys};
page* pg = RB_FIND(phys_page_tree, &Mm_PhysicalPages, &key);
OBOS_ENSURE(pg != Mm_AnonPage);
OBOS_ENSURE(pg != Mm_UserAnonPage);

MmH_RefPage(pg);

if ((lastPhys + pgSize) != info.phys)
{
if (addr != base)
{
size_t old_sz = data->physRegionCount*sizeof(struct ahci_phys_region);
data->phys_regions = Mm_Allocator->Reallocate(Mm_Allocator, data->phys_regions, ++data->physRegionCount*sizeof(struct ahci_phys_region), old_sz, nullptr);
data->phys_regions = Reallocate(Mm_Allocator, data->phys_regions, ++data->physRegionCount*sizeof(struct ahci_phys_region), old_sz, nullptr);
struct ahci_phys_region* reg = &data->phys_regions[data->physRegionCount - 1];
*reg = curr;
wroteback = true;
Expand All @@ -116,7 +125,7 @@ static obos_status populate_physical_regions(uintptr_t base, size_t size, struct
if (!wroteback && curr.phys)
{
size_t old_sz = data->physRegionCount*sizeof(struct ahci_phys_region);
data->phys_regions = Mm_Allocator->Reallocate(Mm_Allocator, data->phys_regions, ++data->physRegionCount*sizeof(struct ahci_phys_region), old_sz, nullptr);
data->phys_regions = Reallocate(Mm_Allocator, data->phys_regions, ++data->physRegionCount*sizeof(struct ahci_phys_region), old_sz, nullptr);
struct ahci_phys_region* reg = &data->phys_regions[data->physRegionCount - 1];
*reg = curr;
}
Expand Down Expand Up @@ -145,7 +154,7 @@ static obos_status unpopulate_physical_regions(uintptr_t base, size_t size, stru
MmH_DerefPage(pg);
pgSize = info.prot.huge_page ? OBOS_HUGE_PAGE_SIZE : OBOS_PAGE_SIZE;
}
Mm_Allocator->Free(Mm_Allocator, data->phys_regions, data->physRegionCount*sizeof(struct ahci_phys_region));
Free(Mm_Allocator, data->phys_regions, data->physRegionCount*sizeof(struct ahci_phys_region));
return OBOS_STATUS_SUCCESS;
}
// #pragma GCC pop_options
Expand Down Expand Up @@ -215,7 +224,12 @@ obos_status read_sync(dev_desc desc, void* buf, size_t blkCount, size_t blkOffse
// irql oldIrql = Core_RaiseIrql(IRQL_AHCI);
SendCommand(port, &data, blkOffset, 0x40, blkCount == 0x10000 ? 0 : blkCount);
// Core_LowerIrql(oldIrql);
Core_WaitOnObject(WAITABLE_OBJECT(data.completionEvent));
if (obos_is_error(status = Core_WaitOnObject(WAITABLE_OBJECT(data.completionEvent))))
{
Core_SemaphoreRelease(&port->lock);
unpopulate_physical_regions((uintptr_t)buf, blkCount*port->sectorSize, &data);
break;
}
Core_EventClear(&data.completionEvent);
if (!port->works)
{
Expand Down Expand Up @@ -275,7 +289,12 @@ obos_status write_sync(dev_desc desc, const void* buf, size_t blkCount, size_t b
{
SendCommand(port, &data, blkOffset, 0x40, blkCount == 0x10000 ? 0 : blkCount);
HBA->ghc |= BIT(1) /* GhcIE */;
Core_WaitOnObject(WAITABLE_OBJECT(data.completionEvent));
if (obos_is_error(status = Core_WaitOnObject(WAITABLE_OBJECT(data.completionEvent))))
{
Core_SemaphoreRelease(&port->lock);
unpopulate_physical_regions((uintptr_t)buf, blkCount*port->sectorSize, &data);
break;
}
Core_EventClear(&data.completionEvent);
if (!port->works)
{
Expand Down
1 change: 1 addition & 0 deletions src/drivers/generic/ahci/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,7 @@ static void* map_registers(uintptr_t phys, size_t size, bool uc)
page.phys = phys+offset;
MmS_SetPageMapping(Mm_KernelContext.pt, &page, phys + offset, false);
}
Drv_TLBShootdown(Mm_KernelContext.pt, (uintptr_t)virt, size);
return virt+phys_page_offset;
}

Expand Down
Loading