Git Product home page Git Product logo

redleaf's Introduction

RedLeaf

RedLeaf is a research operating system developed from scratch in Rust to explore the impact of language safety on operating system organization.

Setup

Downloading the code

git clone --recursive https://github.com/mars-research/redleaf.git

Nix

The easiest way to set up a reproducible environment with all dependencies is with Nix. With Nix installed, simply enter the provided nix-shell environment with:

nix-shell

Bash Script

There is also a bash script meant for Debian-based distributions and does not ensure reproducible builds:

./setup.sh

Building

You need a very recent nightly Rust toolchain with the rust-src component, and also the nasm assembler. If you wish to generate a bootable .iso image (required for the qemu targets), you also need to have grub-mkrescue in your PATH.

make check      # Verify that the tree is buildable
make kernel     # Build kernel proper
make domains    # Build domains
make mb2        # Build Multiboot v2 kernel image (redleaf.mb2)
make iso        # Build bootable ISO (redleaf.iso)
make qemu       # Build and launch QEMU
make qemu-nox   # Build and launch QEMU in headless mode
make qemu-kvm   # Build and launch QEMU with KVM

For the qemu targets, specify GDB=true to start a GDB server and pause execution on boot. By default, the build system will build everything in the release mode with optimizations enabled, and you can override this behavior by passing DEBUG=true.

Foliage

Foliage is a multi-purpose tool that helps you inspect domain dependencies, validate their safeness, and discover potential pitfalls. You can invoke the tool at the project root with ./fo.

For example, to view information about the ixgbe domain, run:

./fo crate ixgbe

Publication

RedLeaf: Isolation and Communication in a Safe Operating System(OSDI 20)

redleaf's People

Contributors

tjhu avatar zhaofengli avatar arkivm avatar danappelxx avatar czoop avatar 1aguna avatar vwheezy avatar daviddetweiler avatar gz avatar

Stargazers

Makani Flanders avatar AndreXu avatar Bo-Wei Chen avatar Serapheim Dimitropoulos avatar Zhemin Huang avatar Andy avatar haruki7049 avatar anbo avatar markcty avatar Junming Zhao avatar Xiang.Lin avatar Linsy avatar Ash avatar PORUBU (a.k.a. hobymour) avatar yotio avatar  avatar Duowen avatar Leonard avatar Yu TIAN avatar Alex Larsen avatar  avatar  avatar Sarath3192 avatar Elena Frank avatar Benshan Mei avatar Yeonan Ha avatar Qingzhao Zhang avatar Hiroki Chen avatar RISHIKESH DONADKAR avatar Eugene Chou avatar Quinn Burke avatar Eason Wang avatar thatway avatar axionbuster avatar pw0rld avatar Yuqin Yan avatar linfeng avatar TKF avatar Campbell He avatar Kevin Tran avatar Mahiru Kagura avatar Chawye Hsu avatar Nikhil Marathe avatar Wan Fang avatar Ysnr Kdm avatar Preston avatar Sena SUZUKI avatar Jianyu avatar Masanori Tani avatar Takahiro Ishikawa avatar Jing avatar KishoreGanesh avatar Wang Yong avatar  avatar SARDONYX avatar Haotian Liu avatar Kyle Hale avatar  avatar Panda avatar EnanaShinonome avatar  avatar Alex Lyn avatar Chen Chenglong avatar Alex avatar Insu Jang avatar Rainiery Valerio avatar Richard Chien avatar  avatar Yori Fang avatar lizebin avatar Nikita avatar Iqbal Rifai avatar Aki avatar Guozhen (Lance) She avatar LoanCold avatar hello mars avatar ppw avatar Karan Joisher avatar PanQL avatar  avatar Bob avatar Justin Restivo avatar dusk avatar Forest Anderson avatar Joshua Yanovski avatar Evgeny avatar IGUCHI Takumi avatar  avatar  avatar Jeremy Schroeder avatar Jingrong Chen avatar Mr.Z avatar Youngsuk Kim avatar Yukiteru Li avatar ChengXiang Qi avatar MaxXing avatar Mathew Horner avatar Ashish Bijlani avatar Darkitten avatar Gao feng avatar

Watchers

Jon Rafkind avatar James Cloos avatar  avatar  avatar Mark S. Baranowski avatar Leonid Ryzhyk avatar Maryam Dabaghchian avatar  avatar Yoshimichi Nakatsuka avatar Xiafa Wu avatar  avatar Anton Burtsev avatar  avatar Alex Lyn avatar

redleaf's Issues

QEMU does not run certain machines

System info

$ qemu-system-x86_64 --version
QEMU emulator version 4.0.0 (Debian 1:4.0+dfsg-0ubuntu9.4)
Copyright (c) 2003-2019 Fabrice Bellard and the QEMU Project developers
$ 
$ lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 19.10
Release:	19.10
Codename:	eoan

What happened

Invalid opcode exception is thrown when executing instruction wrfsbase.

What we found

We found that QEMU thinks that the CPU does not have the feature CPUID_7_0_EBX_FSGSBASE enabled

We log the env->name in x86_cpu_load_model() in QEMU and we found that it is mapped to qemu64, which does not have this feature enabled. In that list, we found that the Whiskey Lake, the code name of the CPU that this issue is found, is not mapped. We think that QEMU defaults it to qemu64 when it cannot find it from the list.

Temporary Solution

Force QEMU to think our system is IvyBridge, which has that feature CPUID_7_0_EBX_FSGSBASE, by setting adding qemu_common += -cpu IvyBridge in the Makefile.

rv6: Support threads

Threads are not supported because we cannot pass function pointers across domain boundaries to spawn a new thread.

iguard.write slows down linearly

The cycles per iguard.write() increases linearly. In the case of hitting the bcache, It starts at 1,800 cycles and slowly increments 2,900 cycles after 1,600 repeated calls.

Finish up rv6 filesystem

  • Support mapping devices as files.
  • Support pipes.
  • sleep() in begin_op(). Blocked by #7.
  • 3 layer inode indirection so we can have 1GB large files(currently 2 layers).
  • Rewrite BufferCache so that's it's safer, faster, and easier to use.
  • Speed up I/O by utilizing the AIO and large block size interfaces exposed by the BDev. (quite complicated; maybe create a new issue to track this; see how biscuit does it).
  • Investigate the usage of begin/end_op(). Maybe we could refactor it in a cleaner and safer way using RAII or session-based methods.

Implement input device driver

We need some sort of input device driver so that we could build a shell. We can implement either a keyboard or a serial input driver. There's no keyboard attached to the CloudLab machines so it's preferred to implement the serial one first.

  • Implement a keyboard driver. See kbd.c in xv6 for reference.
  • Implement a serial input driver. See uart.c in xv6 for reference.

usr_net

Takes in all required arguments and net drive,
returns a net domain

Rewrite inode layer

The ICache/INode layer is very ugly, C-like, and error-prone.

  • Fix weird reference counting and undocumented/unnamed constants
  • RAII to put inode back to icache automatically.

Document features

can you write a short note on our mystical features that we created for network benchmarks and how to enable them into some readme?

Invalid/ Missing register writes in ixgbe driver

The following bugs are present in the ixgbe driver:

  1. Write to reserved bit 31 of EIMC register in the clear_interrupts function
  2. Write to reserved bits [15:12] of the DTXMXSZRQ register
  3. Bits of RDRXCTL are not set by software. According to the datasheet:
    RDRXCTL.RSCFRSTSIZE is by default 0x8 and should be set to 0 by software.
    RDRXCTL.RSCACKC is by default 0 and should be set to 1 by software.
    RDRXCTL.FCOE_WRFIX is by default 0 and should be set to 1 by software.
  4. The FCTRL register should only be modified/ updated when the RXCTRL.RXEN bit is set to 0, but the set_promisc function updates the filters after RXCTRL.RXEN is set.

TPM Thread Safety

Need to be discussed. Currently, we just assume that it's thread-safe.

Fast AHCI driver

Implement an AHCI driver that's not significantly slower than Linux's. Especially when the block size is smaller than 4MB. The AHCI driver that we borrow from Redox is slow, hard to debug, and doesn't support AIO so we need to reimplement it.

  • Design a safe AIO interface.
  • Implement a basic AHCI driver that supports synchronized R/W
  • Implement AIO
  • Implement Native Command Queueing(NCQ).
  • Benchmark both sequential and random R/W

Build breaks while recompiling rv6 domains

Temporary fix is to invoke this command

make -C usr/mkfs/ build/libfs.a DEBUG=false && echo " " | tee -a sys/lib/libmembdev/src/lib.rs && make qemu-kvm DEBUG=false LARGE_MEM=true

Implement `sleep()`

Implement a Rust equivalent of sleep() in xv6. This is tricky because one cannot lock/unlock a lock in arbitrary places in Rust. A condition variable is probably the closet thing to it, but it requires us to implement our own mutex, our own condition variable, and get them right.

Plan 1

Implement our own std::sync::{Mutex, CondVar}. Maybe we can fork the Mutex from the spin crate, implement CondVar on top of it, and call it for the day. It would be nice to implement it without any unsafe. Here's how it's implemented in Rust stdlib.

  • Implement Mutex.
  • Implement CondVar

IXGBE Driver

  • Make it safe
  • Patch RX
  • Fix Tx (fails to work after pushing out a few packets)

Document RRef Behavior

Document how

  • We prevent users from using types unknown to the IDL(unsafe RRefable)
  • The DropMap works

Consolidate RRefVec and RRefArray

The size in a RRefArray is a compile-time constant while the one in RRefVec is a runtime constant. Since we can express RRefArray in RRefVec, we should merge them together.

ELF load rv6 user programs

  • Phase 1: ELF load any arbitrary blob from rv6 filesystem
  • Phase 2: Verify that the blob is compiled and signed by a trusted compiler before ELF-loading it.
  • Phase 3: propagate the error to call site(currently the error is being ignored if the binary is not signed)

Implement All xv6 Syscalls

Implement all of the of xv6 syscalls and their proxies in rv6.

  1. SYS_fork(merge with exec as sys_spawn_domain)
    • syscall
    • proxy
  2. SYS_exit(need discussion)
    • syscall
    • proxy
  3. SYS_wait(implemented as Thread::join)
    • syscall
    • proxy
  4. SYS_pipe
    • syscall
    • proxy
  5. SYS_read
    • syscall
    • proxy
  6. SYS_kill
    • syscall
    • proxy
  7. SYS_exec
    • syscall
    • proxy
  8. SYS_fstat
    • syscall
    • proxy
  9. SYS_chdir
    • syscall
    • proxy
  10. SYS_dup
    • syscall
    • proxy
  11. SYS_getpid
    • syscall
    • proxy
  12. SYS_sbrk(no need; we use memory allocator)
    • syscall
    • proxy
  13. SYS_sleep(for ns instead for ticks)
    • syscall
    • proxy
  14. SYS_uptime
    • syscall
    • proxy
  15. SYS_open
    • syscall
    • proxy
  16. SYS_write
    • syscall
    • proxy
  17. SYS_mknod
    • syscall
    • proxy
  18. SYS_unlink
    • syscall
    • proxy
  19. SYS_link
    • syscall
    • proxy
  20. SYS_mkdir
    • syscall
    • proxy
  21. SYS_close
    • syscall
    • proxy

Need gdb script for debugging

Refer this: https://fuchsia.googlesource.com/fuchsia/+/refs/heads/main/zircon/kernel/scripts/zircon.elf-gdb.py
We need something as sophisticated as this for debugging the domains.
Any volunteers?

e.g., here is a backtrace of a PF in ixgbe driver domain

cpu(0):Disable irqs
cpu(0):EXCEPTION: PAGE FAULT
cpu(0):Accessed Address: 4261415040
cpu(0):Error Code: 2
cpu(0):PtRegs {
    r15: 0xfe000000,
    r14: 0x105fc5c08,
    r13: 0x105fb7278,
    r12: 0x105faf078,
    rbp: 0x105fb7540,
    rbx: 0x101e1c000,
    r11: 0x1,
    r10: 0xe,
    r9: 0x2f8,
    r8: 0x102631c03,
    rax: 0x0,
    rcx: 0x2fd,
    rdx: 0x2f8,
    rsi: 0x1,
    rdi: 0x9fd348c,
    orig_ax: 0xffffffffffffffff,
    rip: 0x10262a048,
    rcs: 0x8,
    rflags: 0x10246,
    rsp: 0x105f9ac70,
    ss: 0x10,
}
cpu(0):Backtrace:
cpu(0):frame #1  - 0x00000000010262a047
cpu(0):
cpu(0):frame #2  - 0x000000000102624ab2
cpu(0):
cpu(0):frame #3  - 0x0000000001022402e1
cpu(0):
cpu(0):frame #4  - 0x000000000102625517
cpu(0):
cpu(0):frame #5  - 0x00000000000010ead3
 - <empty>cpu(0):

Would be nice to have the symbols resolved in backtrace

Disable interrupt when cleanup

We call user code when dropping RRef. Malicious users can create long cleanup to DoS the system. We need to disable interrupts when calling them.

Code Generation

Proxy generation

  • Trampoline generation
  • Basic proxy generation
  • Proper RRef ownership transfer
  • Refactor out super-trait usages since they are not supported
  • Proxy interface generation
  • Replace sturct definitions with use statements.

Create generation

  • TBD

Usr Interface Library generation

  • TBD

Rv6 benchnet performance bug

running benchnet in rv6 is very slow.
it's supposed to be somewhere around 40 cycles per packets but we are seeing ~900 cycles on master.
the breaking commit is between f48dc44 and 8a29b6c

Ghost inode

When calling dump_inode , inode 14 is not found. But when calling mkdir foo, inode 14 is fetched somewhere and later causes a DirectoryExhausted error. Need to investigate why is inode 14 not generated in mkfs and how and why is it loaded in mkdir

INodeDataGuard { node: INode { meta: INodeMeta { device: 1, inum: 14, valid: true }, data: Mutex { } }, data: MutexGuard { lock: true, data: INodeData { file_type: Directory, major: 0, minor: 0, nlink: 1, size: 0, addresses: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] } } }`

Design rv6 user domain entry point interface

Design a clean and unified way for the rv6 userspace domains to define their entry points. For example, we can have something like fn main(s: RRef<Xv6SysCalls>, args: RRef<Vec<String>>).
Question: how are we going to enforce this interface so that the domains are not able to use any arbitrary function as the entry point?

  • Define an interface
  • Enforce the interface

I downloaded the code using qemu in ubuntu, but it start half and stoped

  1. Download the latest code use: git clone --recursive https://github.com/mars-research/redleaf.git
  2. use nix-shell or ./setup.sh, setup my linux environment
  3. run: make run-nox, Compile successfully, and the system can run ,but it stoped in here:
    cpu(0):domain/virtio_net: Entry point at 102d80000
    cpu(0):domain/virtio_net: .text starts at 102d80000
    cpu(0):domain/virtio_net: returned from entry point
    cpu(0):domain/bdev_shadow: Binary start: 42cfd74, end: 806b9d4
    cpu(0):domain/bdev_shadow: Binary is unsigned
    cpu(0):NYI free
    cpu(0):NYI free
    cpu(0):num_pages: 15035

It seems not run successful, and the rv6 dosn't run. In Makefile it use large mem in default, the full log is :
`/usr/local/bin/qemu-system-x86_64 -vga std -cdrom build/redleaf.iso -boot d -drive id=satadisk,file=tools/rv6-mkfs/build/fs.img,format=raw,if=none -device ahci,id=ahci -device ide-hd,drive=satadisk,bus=ahci.0 -cpu 'Haswell,pdpe1gb' -machine q35 -m 8G -nographic -chardev stdio,id=char0,mux=on,logfile=serial.log,signal=off -serial file:/dev/null -serial chardev:char0 -mon chardev=char0
qemu-system-x86_64: warning: TCG doesn't support requested feature: CPUID.01H:ECX.fma [bit 12]
qemu-system-x86_64: warning: TCG doesn't support requested feature: CPUID.01H:ECX.pcid [bit 17]
qemu-system-x86_64: warning: TCG doesn't support requested feature: CPUID.01H:ECX.x2apic [bit 21]
qemu-system-x86_64: warning: TCG doesn't support requested feature: CPUID.01H:ECX.tsc-deadline [bit 24]
qemu-system-x86_64: warning: TCG doesn't support requested feature: CPUID.01H:ECX.avx [bit 28]
qemu-system-x86_64: warning: TCG doesn't support requested feature: CPUID.01H:ECX.f16c [bit 29]
qemu-system-x86_64: warning: TCG doesn't support requested feature: CPUID.07H:EBX.hle [bit 4]
qemu-system-x86_64: warning: TCG doesn't support requested feature: CPUID.07H:EBX.avx2 [bit 5]
qemu-system-x86_64: warning: TCG doesn't support requested feature: CPUID.07H:EBX.invpcid [bit 10]
qemu-system-x86_64: warning: TCG doesn't support requested feature: CPUID.07H:EBX.rtm [bit 11]
cpu(0):RedLeaf booting (CPU model: GenuineIntel)
cpu(0):Version: "Tue Oct 25 11:37:46 CST 2022 (book@100ask)"
cpu(0):UTC Time: 03:39:35 AM Date: 10/25/2022
cpu(0):irq_entries_start:0x9000000a79e9206a, irq_handlers:0x14c000
cpu(0):multibootv2 tag found at 22d51520
cpu(0):Command Line:
cpu(0):Tags: multiboot information
S: 0x112F7000, E: 0x112F7838, L: 0x00000838
boot loader name: GRUB 2.02-2ubuntu8.23
memory areas:
S: 0x00000000, E: 0x0009FC00, L: 0x0009FC00
S: 0x00100000, E: 0x7FFDF000, L: 0x7FEDF000
S: 0x100000000, E: 0x280000000, L: 0x180000000
module tags:
name: redleaf_kernel , s: 0x11f1b000, e: 0x22d51518

cpu(0):Finding RAM regions
cpu(0):MemoryArea { base_addr: 0, length: 9fc00, typ: 1, _reserved: 0 }
cpu(0):Ignore memory region at MemoryArea { base_addr: 0, length: 654336, typ: 1, _reserved: 0 }
cpu(0):MemoryArea { base_addr: 100000, length: 7fedf000, typ: 1, _reserved: 0 }
cpu(0):Ignore memory region at MemoryArea { base_addr: 1048576, length: 2146299904, typ: 1, _reserved: 0 }
cpu(0):MemoryArea { base_addr: 100000000, length: 180000000, typ: 1, _reserved: 0 }
cpu(0):region.base = 0x100000000 region.size = 0x180000000
cpu(0):order = 20 size = 6442450944
cpu(0):Added base=0x100000000 size=0x180000000
cpu(0):added memory regions
cpu(0):Found kernel image at: 11f1b000 end : 22d51518
cpu(0):Copying image bytes from 0x11f1b000 to 0x112f8000 (283338008 bytes)
cpu(0):New PDPDT for 0x0 @ PML4[0]
cpu(0):Mapping 0x0 -- 0x100000 is smaller than 1 GiB, going deeper.
cpu(0):map_generic recurse from 4 KiB map to finish 0x200000 -- 0x2e4000 -> 0x200000 -- 0x2e4000
cpu(0):map_generic recurse from 4 KiB map to finish 0x400000 -- 0xd2b2000 -> 0x400000 -- 0xd2b2000
cpu(0):Mapped 2 MiB region 0x400000 -- 0x600000 -> 0x400000 -- 0x600000
cpu(0):Mapped 2 MiB region 0x600000 -- 0x800000 -> 0x600000 -- 0x800000
cpu(0):Mapped 2 MiB region 0x800000 -- 0xa00000 -> 0x800000 -- 0xa00000
cpu(0):Mapped 2 MiB region 0xa00000 -- 0xc00000 -> 0xa00000 -- 0xc00000
cpu(0):Mapped 2 MiB region 0xc00000 -- 0xe00000 -> 0xc00000 -- 0xe00000
cpu(0):Mapped 2 MiB region 0xe00000 -- 0x1000000 -> 0xe00000 -- 0x1000000
cpu(0):Mapped 2 MiB region 0x1000000 -- 0x1200000 -> 0x1000000 -- 0x1200000
cpu(0):Mapped 2 MiB region 0x1200000 -- 0x1400000 -> 0x1200000 -- 0x1400000
cpu(0):Mapped 2 MiB region 0x1400000 -- 0x1600000 -> 0x1400000 -- 0x1600000
cpu(0):Mapped 2 MiB region 0x1600000 -- 0x1800000 -> 0x1600000 -- 0x1800000
cpu(0):Mapped 2 MiB region 0x1800000 -- 0x1a00000 -> 0x1800000 -- 0x1a00000
cpu(0):Mapped 2 MiB region 0x1a00000 -- 0x1c00000 -> 0x1a00000 -- 0x1c00000
cpu(0):Mapped 2 MiB region 0x1c00000 -- 0x1e00000 -> 0x1c00000 -- 0x1e00000
cpu(0):Mapped 2 MiB region 0x1e00000 -- 0x2000000 -> 0x1e00000 -- 0x2000000
cpu(0):Mapped 2 MiB region 0x2000000 -- 0x2200000 -> 0x2000000 -- 0x2200000
cpu(0):Mapped 2 MiB region 0x2200000 -- 0x2400000 -> 0x2200000 -- 0x2400000
cpu(0):Mapped 2 MiB region 0x2400000 -- 0x2600000 -> 0x2400000 -- 0x2600000
cpu(0):Mapped 2 MiB region 0x2600000 -- 0x2800000 -> 0x2600000 -- 0x2800000
cpu(0):Mapped 2 MiB region 0x2800000 -- 0x2a00000 -> 0x2800000 -- 0x2a00000
cpu(0):Mapped 2 MiB region 0x2a00000 -- 0x2c00000 -> 0x2a00000 -- 0x2c00000
cpu(0):Mapped 2 MiB region 0x2c00000 -- 0x2e00000 -> 0x2c00000 -- 0x2e00000
cpu(0):Mapped 2 MiB region 0x2e00000 -- 0x3000000 -> 0x2e00000 -- 0x3000000
cpu(0):Mapped 2 MiB region 0x3000000 -- 0x3200000 -> 0x3000000 -- 0x3200000
cpu(0):Mapped 2 MiB region 0x3200000 -- 0x3400000 -> 0x3200000 -- 0x3400000
cpu(0):Mapped 2 MiB region 0x3400000 -- 0x3600000 -> 0x3400000 -- 0x3600000
cpu(0):Mapped 2 MiB region 0x3600000 -- 0x3800000 -> 0x3600000 -- 0x3800000
cpu(0):Mapped 2 MiB region 0x3800000 -- 0x3a00000 -> 0x3800000 -- 0x3a00000
cpu(0):Mapped 2 MiB region 0x3a00000 -- 0x3c00000 -> 0x3a00000 -- 0x3c00000
cpu(0):Mapped 2 MiB region 0x3c00000 -- 0x3e00000 -> 0x3c00000 -- 0x3e00000
cpu(0):Mapped 2 MiB region 0x3e00000 -- 0x4000000 -> 0x3e00000 -- 0x4000000
cpu(0):Mapped 2 MiB region 0x4000000 -- 0x4200000 -> 0x4000000 -- 0x4200000
cpu(0):Mapped 2 MiB region 0x4200000 -- 0x4400000 -> 0x4200000 -- 0x4400000
cpu(0):Mapped 2 MiB region 0x4400000 -- 0x4600000 -> 0x4400000 -- 0x4600000
cpu(0):Mapped 2 MiB region 0x4600000 -- 0x4800000 -> 0x4600000 -- 0x4800000
cpu(0):Mapped 2 MiB region 0x4800000 -- 0x4a00000 -> 0x4800000 -- 0x4a00000
cpu(0):Mapped 2 MiB region 0x4a00000 -- 0x4c00000 -> 0x4a00000 -- 0x4c00000
cpu(0):Mapped 2 MiB region 0x4c00000 -- 0x4e00000 -> 0x4c00000 -- 0x4e00000
cpu(0):Mapped 2 MiB region 0x4e00000 -- 0x5000000 -> 0x4e00000 -- 0x5000000
cpu(0):Mapped 2 MiB region 0x5000000 -- 0x5200000 -> 0x5000000 -- 0x5200000
cpu(0):Mapped 2 MiB region 0x5200000 -- 0x5400000 -> 0x5200000 -- 0x5400000
cpu(0):Mapped 2 MiB region 0x5400000 -- 0x5600000 -> 0x5400000 -- 0x5600000
cpu(0):Mapped 2 MiB region 0x5600000 -- 0x5800000 -> 0x5600000 -- 0x5800000
cpu(0):Mapped 2 MiB region 0x5800000 -- 0x5a00000 -> 0x5800000 -- 0x5a00000
cpu(0):Mapped 2 MiB region 0x5a00000 -- 0x5c00000 -> 0x5a00000 -- 0x5c00000
cpu(0):Mapped 2 MiB region 0x5c00000 -- 0x5e00000 -> 0x5c00000 -- 0x5e00000
cpu(0):Mapped 2 MiB region 0x5e00000 -- 0x6000000 -> 0x5e00000 -- 0x6000000
cpu(0):Mapped 2 MiB region 0x6000000 -- 0x6200000 -> 0x6000000 -- 0x6200000
cpu(0):Mapped 2 MiB region 0x6200000 -- 0x6400000 -> 0x6200000 -- 0x6400000
cpu(0):Mapped 2 MiB region 0x6400000 -- 0x6600000 -> 0x6400000 -- 0x6600000
cpu(0):Mapped 2 MiB region 0x6600000 -- 0x6800000 -> 0x6600000 -- 0x6800000
cpu(0):Mapped 2 MiB region 0x6800000 -- 0x6a00000 -> 0x6800000 -- 0x6a00000
cpu(0):Mapped 2 MiB region 0x6a00000 -- 0x6c00000 -> 0x6a00000 -- 0x6c00000
cpu(0):Mapped 2 MiB region 0x6c00000 -- 0x6e00000 -> 0x6c00000 -- 0x6e00000
cpu(0):Mapped 2 MiB region 0x6e00000 -- 0x7000000 -> 0x6e00000 -- 0x7000000
cpu(0):Mapped 2 MiB region 0x7000000 -- 0x7200000 -> 0x7000000 -- 0x7200000
cpu(0):Mapped 2 MiB region 0x7200000 -- 0x7400000 -> 0x7200000 -- 0x7400000
cpu(0):Mapped 2 MiB region 0x7400000 -- 0x7600000 -> 0x7400000 -- 0x7600000
cpu(0):Mapped 2 MiB region 0x7600000 -- 0x7800000 -> 0x7600000 -- 0x7800000
cpu(0):Mapped 2 MiB region 0x7800000 -- 0x7a00000 -> 0x7800000 -- 0x7a00000
cpu(0):Mapped 2 MiB region 0x7a00000 -- 0x7c00000 -> 0x7a00000 -- 0x7c00000
cpu(0):Mapped 2 MiB region 0x7c00000 -- 0x7e00000 -> 0x7c00000 -- 0x7e00000
cpu(0):Mapped 2 MiB region 0x7e00000 -- 0x8000000 -> 0x7e00000 -- 0x8000000
cpu(0):Mapped 2 MiB region 0x8000000 -- 0x8200000 -> 0x8000000 -- 0x8200000
cpu(0):Mapped 2 MiB region 0x8200000 -- 0x8400000 -> 0x8200000 -- 0x8400000
cpu(0):Mapped 2 MiB region 0x8400000 -- 0x8600000 -> 0x8400000 -- 0x8600000
cpu(0):Mapped 2 MiB region 0x8600000 -- 0x8800000 -> 0x8600000 -- 0x8800000
cpu(0):Mapped 2 MiB region 0x8800000 -- 0x8a00000 -> 0x8800000 -- 0x8a00000
cpu(0):Mapped 2 MiB region 0x8a00000 -- 0x8c00000 -> 0x8a00000 -- 0x8c00000
cpu(0):Mapped 2 MiB region 0x8c00000 -- 0x8e00000 -> 0x8c00000 -- 0x8e00000
cpu(0):Mapped 2 MiB region 0x8e00000 -- 0x9000000 -> 0x8e00000 -- 0x9000000
cpu(0):Mapped 2 MiB region 0x9000000 -- 0x9200000 -> 0x9000000 -- 0x9200000
cpu(0):Mapped 2 MiB region 0x9200000 -- 0x9400000 -> 0x9200000 -- 0x9400000
cpu(0):Mapped 2 MiB region 0x9400000 -- 0x9600000 -> 0x9400000 -- 0x9600000
cpu(0):Mapped 2 MiB region 0x9600000 -- 0x9800000 -> 0x9600000 -- 0x9800000
cpu(0):Mapped 2 MiB region 0x9800000 -- 0x9a00000 -> 0x9800000 -- 0x9a00000
cpu(0):Mapped 2 MiB region 0x9a00000 -- 0x9c00000 -> 0x9a00000 -- 0x9c00000
cpu(0):Mapped 2 MiB region 0x9c00000 -- 0x9e00000 -> 0x9c00000 -- 0x9e00000
cpu(0):Mapped 2 MiB region 0x9e00000 -- 0xa000000 -> 0x9e00000 -- 0xa000000
cpu(0):Mapped 2 MiB region 0xa000000 -- 0xa200000 -> 0xa000000 -- 0xa200000
cpu(0):Mapped 2 MiB region 0xa200000 -- 0xa400000 -> 0xa200000 -- 0xa400000
cpu(0):Mapped 2 MiB region 0xa400000 -- 0xa600000 -> 0xa400000 -- 0xa600000
cpu(0):Mapped 2 MiB region 0xa600000 -- 0xa800000 -> 0xa600000 -- 0xa800000
cpu(0):Mapped 2 MiB region 0xa800000 -- 0xaa00000 -> 0xa800000 -- 0xaa00000
cpu(0):Mapped 2 MiB region 0xaa00000 -- 0xac00000 -> 0xaa00000 -- 0xac00000
cpu(0):Mapped 2 MiB region 0xac00000 -- 0xae00000 -> 0xac00000 -- 0xae00000
cpu(0):Mapped 2 MiB region 0xae00000 -- 0xb000000 -> 0xae00000 -- 0xb000000
cpu(0):Mapped 2 MiB region 0xb000000 -- 0xb200000 -> 0xb000000 -- 0xb200000
cpu(0):Mapped 2 MiB region 0xb200000 -- 0xb400000 -> 0xb200000 -- 0xb400000
cpu(0):Mapped 2 MiB region 0xb400000 -- 0xb600000 -> 0xb400000 -- 0xb600000
cpu(0):Mapped 2 MiB region 0xb600000 -- 0xb800000 -> 0xb600000 -- 0xb800000
cpu(0):Mapped 2 MiB region 0xb800000 -- 0xba00000 -> 0xb800000 -- 0xba00000
cpu(0):Mapped 2 MiB region 0xba00000 -- 0xbc00000 -> 0xba00000 -- 0xbc00000
cpu(0):Mapped 2 MiB region 0xbc00000 -- 0xbe00000 -> 0xbc00000 -- 0xbe00000
cpu(0):Mapped 2 MiB region 0xbe00000 -- 0xc000000 -> 0xbe00000 -- 0xc000000
cpu(0):Mapped 2 MiB region 0xc000000 -- 0xc200000 -> 0xc000000 -- 0xc200000
cpu(0):Mapped 2 MiB region 0xc200000 -- 0xc400000 -> 0xc200000 -- 0xc400000
cpu(0):Mapped 2 MiB region 0xc400000 -- 0xc600000 -> 0xc400000 -- 0xc600000
cpu(0):Mapped 2 MiB region 0xc600000 -- 0xc800000 -> 0xc600000 -- 0xc800000
cpu(0):Mapped 2 MiB region 0xc800000 -- 0xca00000 -> 0xc800000 -- 0xca00000
cpu(0):Mapped 2 MiB region 0xca00000 -- 0xcc00000 -> 0xca00000 -- 0xcc00000
cpu(0):Mapped 2 MiB region 0xcc00000 -- 0xce00000 -> 0xcc00000 -- 0xce00000
cpu(0):Mapped 2 MiB region 0xce00000 -- 0xd000000 -> 0xce00000 -- 0xd000000
cpu(0):Mapped 2 MiB region 0xd000000 -- 0xd200000 -> 0xd000000 -- 0xd200000
cpu(0):map_generic recurse from 2 MiB map to finish 0xd200000 -- 0x4ce000 -> 0xd200000 -- 0x4ce000
cpu(0):map_generic recurse from 4 KiB map to finish 0xd400000 -- 0xe1a2000 -> 0xd400000 -- 0xe1a2000
cpu(0):Mapped 2 MiB region 0xd400000 -- 0xd600000 -> 0xd400000 -- 0xd600000
cpu(0):Mapped 2 MiB region 0xd600000 -- 0xd800000 -> 0xd600000 -- 0xd800000
cpu(0):Mapped 2 MiB region 0xd800000 -- 0xda00000 -> 0xd800000 -- 0xda00000
cpu(0):Mapped 2 MiB region 0xda00000 -- 0xdc00000 -> 0xda00000 -- 0xdc00000
cpu(0):Mapped 2 MiB region 0xdc00000 -- 0xde00000 -> 0xdc00000 -- 0xde00000
cpu(0):Mapped 2 MiB region 0xde00000 -- 0xe000000 -> 0xde00000 -- 0xe000000
cpu(0):Mapped 2 MiB region 0xe000000 -- 0xe200000 -> 0xe000000 -- 0xe200000
cpu(0):map_generic recurse from 2 MiB map to finish 0xe200000 -- 0xd4d4000 -> 0xe200000 -- 0xd4d4000
cpu(0):map_generic recurse from 4 KiB map to finish 0xe400000 -- 0x22003000 -> 0xe400000 -- 0x22003000
cpu(0):Mapped 2 MiB region 0xe400000 -- 0xe600000 -> 0xe400000 -- 0xe600000
cpu(0):Mapped 2 MiB region 0xe600000 -- 0xe800000 -> 0xe600000 -- 0xe800000
cpu(0):Mapped 2 MiB region 0xe800000 -- 0xea00000 -> 0xe800000 -- 0xea00000
cpu(0):Mapped 2 MiB region 0xea00000 -- 0xec00000 -> 0xea00000 -- 0xec00000
cpu(0):Mapped 2 MiB region 0xec00000 -- 0xee00000 -> 0xec00000 -- 0xee00000
cpu(0):Mapped 2 MiB region 0xee00000 -- 0xf000000 -> 0xee00000 -- 0xf000000
cpu(0):Mapped 2 MiB region 0xf000000 -- 0xf200000 -> 0xf000000 -- 0xf200000
cpu(0):Mapped 2 MiB region 0xf200000 -- 0xf400000 -> 0xf200000 -- 0xf400000
cpu(0):Mapped 2 MiB region 0xf400000 -- 0xf600000 -> 0xf400000 -- 0xf600000
cpu(0):Mapped 2 MiB region 0xf600000 -- 0xf800000 -> 0xf600000 -- 0xf800000
cpu(0):Mapped 2 MiB region 0xf800000 -- 0xfa00000 -> 0xf800000 -- 0xfa00000
cpu(0):Mapped 2 MiB region 0xfa00000 -- 0xfc00000 -> 0xfa00000 -- 0xfc00000
cpu(0):Mapped 2 MiB region 0xfc00000 -- 0xfe00000 -> 0xfc00000 -- 0xfe00000
cpu(0):Mapped 2 MiB region 0xfe00000 -- 0x10000000 -> 0xfe00000 -- 0x10000000
cpu(0):Mapped 2 MiB region 0x10000000 -- 0x10200000 -> 0x10000000 -- 0x10200000
cpu(0):Mapped 2 MiB region 0x10200000 -- 0x10400000 -> 0x10200000 -- 0x10400000
cpu(0):Mapped 2 MiB region 0x10400000 -- 0x10600000 -> 0x10400000 -- 0x10600000
cpu(0):Mapped 2 MiB region 0x10600000 -- 0x10800000 -> 0x10600000 -- 0x10800000
cpu(0):Mapped 2 MiB region 0x10800000 -- 0x10a00000 -> 0x10800000 -- 0x10a00000
cpu(0):Mapped 2 MiB region 0x10a00000 -- 0x10c00000 -> 0x10a00000 -- 0x10c00000
cpu(0):Mapped 2 MiB region 0x10c00000 -- 0x10e00000 -> 0x10c00000 -- 0x10e00000
cpu(0):Mapped 2 MiB region 0x10e00000 -- 0x11000000 -> 0x10e00000 -- 0x11000000
cpu(0):Mapped 2 MiB region 0x11000000 -- 0x11200000 -> 0x11000000 -- 0x11200000
cpu(0):Mapped 2 MiB region 0x11200000 -- 0x11400000 -> 0x11200000 -- 0x11400000
cpu(0):Mapped 2 MiB region 0x11400000 -- 0x11600000 -> 0x11400000 -- 0x11600000
cpu(0):Mapped 2 MiB region 0x11600000 -- 0x11800000 -> 0x11600000 -- 0x11800000
cpu(0):Mapped 2 MiB region 0x11800000 -- 0x11a00000 -> 0x11800000 -- 0x11a00000
cpu(0):Mapped 2 MiB region 0x11a00000 -- 0x11c00000 -> 0x11a00000 -- 0x11c00000
cpu(0):Mapped 2 MiB region 0x11c00000 -- 0x11e00000 -> 0x11c00000 -- 0x11e00000
cpu(0):Mapped 2 MiB region 0x11e00000 -- 0x12000000 -> 0x11e00000 -- 0x12000000
cpu(0):Mapped 2 MiB region 0x12000000 -- 0x12200000 -> 0x12000000 -- 0x12200000
cpu(0):Mapped 2 MiB region 0x12200000 -- 0x12400000 -> 0x12200000 -- 0x12400000
cpu(0):Mapped 2 MiB region 0x12400000 -- 0x12600000 -> 0x12400000 -- 0x12600000
cpu(0):Mapped 2 MiB region 0x12600000 -- 0x12800000 -> 0x12600000 -- 0x12800000
cpu(0):Mapped 2 MiB region 0x12800000 -- 0x12a00000 -> 0x12800000 -- 0x12a00000
cpu(0):Mapped 2 MiB region 0x12a00000 -- 0x12c00000 -> 0x12a00000 -- 0x12c00000
cpu(0):Mapped 2 MiB region 0x12c00000 -- 0x12e00000 -> 0x12c00000 -- 0x12e00000
cpu(0):Mapped 2 MiB region 0x12e00000 -- 0x13000000 -> 0x12e00000 -- 0x13000000
cpu(0):Mapped 2 MiB region 0x13000000 -- 0x13200000 -> 0x13000000 -- 0x13200000
cpu(0):Mapped 2 MiB region 0x13200000 -- 0x13400000 -> 0x13200000 -- 0x13400000
cpu(0):Mapped 2 MiB region 0x13400000 -- 0x13600000 -> 0x13400000 -- 0x13600000
cpu(0):Mapped 2 MiB region 0x13600000 -- 0x13800000 -> 0x13600000 -- 0x13800000
cpu(0):Mapped 2 MiB region 0x13800000 -- 0x13a00000 -> 0x13800000 -- 0x13a00000
cpu(0):Mapped 2 MiB region 0x13a00000 -- 0x13c00000 -> 0x13a00000 -- 0x13c00000
cpu(0):Mapped 2 MiB region 0x13c00000 -- 0x13e00000 -> 0x13c00000 -- 0x13e00000
cpu(0):Mapped 2 MiB region 0x13e00000 -- 0x14000000 -> 0x13e00000 -- 0x14000000
cpu(0):Mapped 2 MiB region 0x14000000 -- 0x14200000 -> 0x14000000 -- 0x14200000
cpu(0):Mapped 2 MiB region 0x14200000 -- 0x14400000 -> 0x14200000 -- 0x14400000
cpu(0):Mapped 2 MiB region 0x14400000 -- 0x14600000 -> 0x14400000 -- 0x14600000
cpu(0):Mapped 2 MiB region 0x14600000 -- 0x14800000 -> 0x14600000 -- 0x14800000
cpu(0):Mapped 2 MiB region 0x14800000 -- 0x14a00000 -> 0x14800000 -- 0x14a00000
cpu(0):Mapped 2 MiB region 0x14a00000 -- 0x14c00000 -> 0x14a00000 -- 0x14c00000
cpu(0):Mapped 2 MiB region 0x14c00000 -- 0x14e00000 -> 0x14c00000 -- 0x14e00000
cpu(0):Mapped 2 MiB region 0x14e00000 -- 0x15000000 -> 0x14e00000 -- 0x15000000
cpu(0):Mapped 2 MiB region 0x15000000 -- 0x15200000 -> 0x15000000 -- 0x15200000
cpu(0):Mapped 2 MiB region 0x15200000 -- 0x15400000 -> 0x15200000 -- 0x15400000
cpu(0):Mapped 2 MiB region 0x15400000 -- 0x15600000 -> 0x15400000 -- 0x15600000
cpu(0):Mapped 2 MiB region 0x15600000 -- 0x15800000 -> 0x15600000 -- 0x15800000
cpu(0):Mapped 2 MiB region 0x15800000 -- 0x15a00000 -> 0x15800000 -- 0x15a00000
cpu(0):Mapped 2 MiB region 0x15a00000 -- 0x15c00000 -> 0x15a00000 -- 0x15c00000
cpu(0):Mapped 2 MiB region 0x15c00000 -- 0x15e00000 -> 0x15c00000 -- 0x15e00000
cpu(0):Mapped 2 MiB region 0x15e00000 -- 0x16000000 -> 0x15e00000 -- 0x16000000
cpu(0):Mapped 2 MiB region 0x16000000 -- 0x16200000 -> 0x16000000 -- 0x16200000
cpu(0):Mapped 2 MiB region 0x16200000 -- 0x16400000 -> 0x16200000 -- 0x16400000
cpu(0):Mapped 2 MiB region 0x16400000 -- 0x16600000 -> 0x16400000 -- 0x16600000
cpu(0):Mapped 2 MiB region 0x16600000 -- 0x16800000 -> 0x16600000 -- 0x16800000
cpu(0):Mapped 2 MiB region 0x16800000 -- 0x16a00000 -> 0x16800000 -- 0x16a00000
cpu(0):Mapped 2 MiB region 0x16a00000 -- 0x16c00000 -> 0x16a00000 -- 0x16c00000
cpu(0):Mapped 2 MiB region 0x16c00000 -- 0x16e00000 -> 0x16c00000 -- 0x16e00000
cpu(0):Mapped 2 MiB region 0x16e00000 -- 0x17000000 -> 0x16e00000 -- 0x17000000
cpu(0):Mapped 2 MiB region 0x17000000 -- 0x17200000 -> 0x17000000 -- 0x17200000
cpu(0):Mapped 2 MiB region 0x17200000 -- 0x17400000 -> 0x17200000 -- 0x17400000
cpu(0):Mapped 2 MiB region 0x17400000 -- 0x17600000 -> 0x17400000 -- 0x17600000
cpu(0):Mapped 2 MiB region 0x17600000 -- 0x17800000 -> 0x17600000 -- 0x17800000
cpu(0):Mapped 2 MiB region 0x17800000 -- 0x17a00000 -> 0x17800000 -- 0x17a00000
cpu(0):Mapped 2 MiB region 0x17a00000 -- 0x17c00000 -> 0x17a00000 -- 0x17c00000
cpu(0):Mapped 2 MiB region 0x17c00000 -- 0x17e00000 -> 0x17c00000 -- 0x17e00000
cpu(0):Mapped 2 MiB region 0x17e00000 -- 0x18000000 -> 0x17e00000 -- 0x18000000
cpu(0):Mapped 2 MiB region 0x18000000 -- 0x18200000 -> 0x18000000 -- 0x18200000
cpu(0):Mapped 2 MiB region 0x18200000 -- 0x18400000 -> 0x18200000 -- 0x18400000
cpu(0):Mapped 2 MiB region 0x18400000 -- 0x18600000 -> 0x18400000 -- 0x18600000
cpu(0):Mapped 2 MiB region 0x18600000 -- 0x18800000 -> 0x18600000 -- 0x18800000
cpu(0):Mapped 2 MiB region 0x18800000 -- 0x18a00000 -> 0x18800000 -- 0x18a00000
cpu(0):Mapped 2 MiB region 0x18a00000 -- 0x18c00000 -> 0x18a00000 -- 0x18c00000
cpu(0):Mapped 2 MiB region 0x18c00000 -- 0x18e00000 -> 0x18c00000 -- 0x18e00000
cpu(0):Mapped 2 MiB region 0x18e00000 -- 0x19000000 -> 0x18e00000 -- 0x19000000
cpu(0):Mapped 2 MiB region 0x19000000 -- 0x19200000 -> 0x19000000 -- 0x19200000
cpu(0):Mapped 2 MiB region 0x19200000 -- 0x19400000 -> 0x19200000 -- 0x19400000
cpu(0):Mapped 2 MiB region 0x19400000 -- 0x19600000 -> 0x19400000 -- 0x19600000
cpu(0):Mapped 2 MiB region 0x19600000 -- 0x19800000 -> 0x19600000 -- 0x19800000
cpu(0):Mapped 2 MiB region 0x19800000 -- 0x19a00000 -> 0x19800000 -- 0x19a00000
cpu(0):Mapped 2 MiB region 0x19a00000 -- 0x19c00000 -> 0x19a00000 -- 0x19c00000
cpu(0):Mapped 2 MiB region 0x19c00000 -- 0x19e00000 -> 0x19c00000 -- 0x19e00000
cpu(0):Mapped 2 MiB region 0x19e00000 -- 0x1a000000 -> 0x19e00000 -- 0x1a000000
cpu(0):Mapped 2 MiB region 0x1a000000 -- 0x1a200000 -> 0x1a000000 -- 0x1a200000
cpu(0):Mapped 2 MiB region 0x1a200000 -- 0x1a400000 -> 0x1a200000 -- 0x1a400000
cpu(0):Mapped 2 MiB region 0x1a400000 -- 0x1a600000 -> 0x1a400000 -- 0x1a600000
cpu(0):Mapped 2 MiB region 0x1a600000 -- 0x1a800000 -> 0x1a600000 -- 0x1a800000
cpu(0):Mapped 2 MiB region 0x1a800000 -- 0x1aa00000 -> 0x1a800000 -- 0x1aa00000
cpu(0):Mapped 2 MiB region 0x1aa00000 -- 0x1ac00000 -> 0x1aa00000 -- 0x1ac00000
cpu(0):Mapped 2 MiB region 0x1ac00000 -- 0x1ae00000 -> 0x1ac00000 -- 0x1ae00000
cpu(0):Mapped 2 MiB region 0x1ae00000 -- 0x1b000000 -> 0x1ae00000 -- 0x1b000000
cpu(0):Mapped 2 MiB region 0x1b000000 -- 0x1b200000 -> 0x1b000000 -- 0x1b200000
cpu(0):Mapped 2 MiB region 0x1b200000 -- 0x1b400000 -> 0x1b200000 -- 0x1b400000
cpu(0):Mapped 2 MiB region 0x1b400000 -- 0x1b600000 -> 0x1b400000 -- 0x1b600000
cpu(0):Mapped 2 MiB region 0x1b600000 -- 0x1b800000 -> 0x1b600000 -- 0x1b800000
cpu(0):Mapped 2 MiB region 0x1b800000 -- 0x1ba00000 -> 0x1b800000 -- 0x1ba00000
cpu(0):Mapped 2 MiB region 0x1ba00000 -- 0x1bc00000 -> 0x1ba00000 -- 0x1bc00000
cpu(0):Mapped 2 MiB region 0x1bc00000 -- 0x1be00000 -> 0x1bc00000 -- 0x1be00000
cpu(0):Mapped 2 MiB region 0x1be00000 -- 0x1c000000 -> 0x1be00000 -- 0x1c000000
cpu(0):Mapped 2 MiB region 0x1c000000 -- 0x1c200000 -> 0x1c000000 -- 0x1c200000
cpu(0):Mapped 2 MiB region 0x1c200000 -- 0x1c400000 -> 0x1c200000 -- 0x1c400000
cpu(0):Mapped 2 MiB region 0x1c400000 -- 0x1c600000 -> 0x1c400000 -- 0x1c600000
cpu(0):Mapped 2 MiB region 0x1c600000 -- 0x1c800000 -> 0x1c600000 -- 0x1c800000
cpu(0):Mapped 2 MiB region 0x1c800000 -- 0x1ca00000 -> 0x1c800000 -- 0x1ca00000
cpu(0):Mapped 2 MiB region 0x1ca00000 -- 0x1cc00000 -> 0x1ca00000 -- 0x1cc00000
cpu(0):Mapped 2 MiB region 0x1cc00000 -- 0x1ce00000 -> 0x1cc00000 -- 0x1ce00000
cpu(0):Mapped 2 MiB region 0x1ce00000 -- 0x1d000000 -> 0x1ce00000 -- 0x1d000000
cpu(0):Mapped 2 MiB region 0x1d000000 -- 0x1d200000 -> 0x1d000000 -- 0x1d200000
cpu(0):Mapped 2 MiB region 0x1d200000 -- 0x1d400000 -> 0x1d200000 -- 0x1d400000
cpu(0):Mapped 2 MiB region 0x1d400000 -- 0x1d600000 -> 0x1d400000 -- 0x1d600000
cpu(0):Mapped 2 MiB region 0x1d600000 -- 0x1d800000 -> 0x1d600000 -- 0x1d800000
cpu(0):Mapped 2 MiB region 0x1d800000 -- 0x1da00000 -> 0x1d800000 -- 0x1da00000
cpu(0):Mapped 2 MiB region 0x1da00000 -- 0x1dc00000 -> 0x1da00000 -- 0x1dc00000
cpu(0):Mapped 2 MiB region 0x1dc00000 -- 0x1de00000 -> 0x1dc00000 -- 0x1de00000
cpu(0):Mapped 2 MiB region 0x1de00000 -- 0x1e000000 -> 0x1de00000 -- 0x1e000000
cpu(0):Mapped 2 MiB region 0x1e000000 -- 0x1e200000 -> 0x1e000000 -- 0x1e200000
cpu(0):Mapped 2 MiB region 0x1e200000 -- 0x1e400000 -> 0x1e200000 -- 0x1e400000
cpu(0):Mapped 2 MiB region 0x1e400000 -- 0x1e600000 -> 0x1e400000 -- 0x1e600000
cpu(0):Mapped 2 MiB region 0x1e600000 -- 0x1e800000 -> 0x1e600000 -- 0x1e800000
cpu(0):Mapped 2 MiB region 0x1e800000 -- 0x1ea00000 -> 0x1e800000 -- 0x1ea00000
cpu(0):Mapped 2 MiB region 0x1ea00000 -- 0x1ec00000 -> 0x1ea00000 -- 0x1ec00000
cpu(0):Mapped 2 MiB region 0x1ec00000 -- 0x1ee00000 -> 0x1ec00000 -- 0x1ee00000
cpu(0):Mapped 2 MiB region 0x1ee00000 -- 0x1f000000 -> 0x1ee00000 -- 0x1f000000
cpu(0):Mapped 2 MiB region 0x1f000000 -- 0x1f200000 -> 0x1f000000 -- 0x1f200000
cpu(0):Mapped 2 MiB region 0x1f200000 -- 0x1f400000 -> 0x1f200000 -- 0x1f400000
cpu(0):Mapped 2 MiB region 0x1f400000 -- 0x1f600000 -> 0x1f400000 -- 0x1f600000
cpu(0):Mapped 2 MiB region 0x1f600000 -- 0x1f800000 -> 0x1f600000 -- 0x1f800000
cpu(0):Mapped 2 MiB region 0x1f800000 -- 0x1fa00000 -> 0x1f800000 -- 0x1fa00000
cpu(0):Mapped 2 MiB region 0x1fa00000 -- 0x1fc00000 -> 0x1fa00000 -- 0x1fc00000
cpu(0):Mapped 2 MiB region 0x1fc00000 -- 0x1fe00000 -> 0x1fc00000 -- 0x1fe00000
cpu(0):Mapped 2 MiB region 0x1fe00000 -- 0x20000000 -> 0x1fe00000 -- 0x20000000
cpu(0):Mapped 2 MiB region 0x20000000 -- 0x20200000 -> 0x20000000 -- 0x20200000
cpu(0):Mapped 2 MiB region 0x20200000 -- 0x20400000 -> 0x20200000 -- 0x20400000
cpu(0):Mapped 2 MiB region 0x20400000 -- 0x20600000 -> 0x20400000 -- 0x20600000
cpu(0):Mapped 2 MiB region 0x20600000 -- 0x20800000 -> 0x20600000 -- 0x20800000
cpu(0):Mapped 2 MiB region 0x20800000 -- 0x20a00000 -> 0x20800000 -- 0x20a00000
cpu(0):Mapped 2 MiB region 0x20a00000 -- 0x20c00000 -> 0x20a00000 -- 0x20c00000
cpu(0):Mapped 2 MiB region 0x20c00000 -- 0x20e00000 -> 0x20c00000 -- 0x20e00000
cpu(0):Mapped 2 MiB region 0x20e00000 -- 0x21000000 -> 0x20e00000 -- 0x21000000
cpu(0):Mapped 2 MiB region 0x21000000 -- 0x21200000 -> 0x21000000 -- 0x21200000
cpu(0):Mapped 2 MiB region 0x21200000 -- 0x21400000 -> 0x21200000 -- 0x21400000
cpu(0):Mapped 2 MiB region 0x21400000 -- 0x21600000 -> 0x21400000 -- 0x21600000
cpu(0):Mapped 2 MiB region 0x21600000 -- 0x21800000 -> 0x21600000 -- 0x21800000
cpu(0):Mapped 2 MiB region 0x21800000 -- 0x21a00000 -> 0x21800000 -- 0x21a00000
cpu(0):Mapped 2 MiB region 0x21a00000 -- 0x21c00000 -> 0x21a00000 -- 0x21c00000
cpu(0):Mapped 2 MiB region 0x21c00000 -- 0x21e00000 -> 0x21c00000 -- 0x21e00000
cpu(0):Mapped 2 MiB region 0x21e00000 -- 0x22000000 -> 0x21e00000 -- 0x22000000
cpu(0):map_generic recurse from 2 MiB map to finish 0x22000000 -- 0xe52f000 -> 0x22000000 -- 0xe52f000
cpu(0):Mapping 0x100000000 -- 0x100001000 is smaller than 1 GiB, going deeper.
cpu(0):Mapping 0x140000000 -- 0x140001000 is smaller than 1 GiB, going deeper.
cpu(0):Mapping 0x180000000 -- 0x180001000 is smaller than 1 GiB, going deeper.
cpu(0):Mapping 0x1c0000000 -- 0x1c0001000 is smaller than 1 GiB, going deeper.
cpu(0):Mapping 0x200000000 -- 0x200001000 is smaller than 1 GiB, going deeper.
cpu(0):Mapping 0x240000000 -- 0x240001000 is smaller than 1 GiB, going deeper.
cpu(0):Mapping 0xfec00000 -- 0xfec01000 is smaller than 1 GiB, going deeper.
cpu(0):pml4_vaddr 100000000
cpu(0):=> Switching to new PageTable!
PCI 00/00/00 8086:29C0 06.00.00.00 Bridge
PCI 00/01/00 1234:1111 03.00.00.02 Display 0=FD000000 2=FEBD4000
PCI 00/02/00 8086:10D3 02.00.00.00 Network 0=FEB80000 1=FEBA0000 2=C040 3=FEBD0000
PCI 00/03/00 8086:2922 01.06.01.02 Storage SATA 4=C060 5=FEBD5000
PCI 00/1F/00 8086:2918 06.01.00.02 Bridge
PCI 00/1F/02 8086:2922 01.06.01.02 Storage SATA 4=C080 5=FEBD6000
PCI 00/1F/03 8086:2930 0C.05.00.02 SerialBus 4=0700
cpu(0):Init per-CPU area
cpu(0):KERNEL_PER_CPU_AREA: 0x110000000, KERNEL_PER_CPU_AREA_SIZE:50339840
cpu(0):Initializing CPU#0
cpu(0):set cpu id:0
cpu(0):creating thread idle with stack: 103000000--104000000
cpu(0):creating thread init with stack: 104000000--105000000
cpu(0):cpu0: Initialized
cpu(0):cpu0: Ready to enable interrupts
cpu(0):Starting new thread
cpu(0):domain/init: Binary start: 3ff504, end: 7270ac
cpu(0):domain/init: Binary is unsigned
cpu(0):NYI free
cpu(0):NYI free
cpu(0):num_pages: 44
cpu(0):domain/init: Entry point at 102b016b0
cpu(0):domain/init: .text starts at 102b00000
cpu(0):init userland 1
cpu(0):about to create proxy
cpu(0):domain/proxy: Binary start: 7270ac, end: a5a25c
cpu(0):domain/proxy: Binary is unsigned
cpu(0):NYI free
cpu(0):NYI free
cpu(0):num_pages: 49
cpu(0):domain/proxy: Entry point at 102b40000
cpu(0):domain/proxy: .text starts at 102b40000
cpu(0):domain/proxy: returned from entry point
cpu(0):created proxy
cpu(0):domain/tpm: Binary start: 3ec30d4, end: 42cfd74
cpu(0):domain/tpm: Binary is unsigned
cpu(0):NYI free
cpu(0):NYI free
cpu(0):num_pages: 91
cpu(0):domain/tpm: Entry point at 102b80000
cpu(0):domain/tpm: .text starts at 102b80000
cpu(0):tpm_init: => starting tpm driver domain
cpu(0):RID 0
cpu(0):ACCESS 0
cpu(0):STS 0
cpu(0):domain/tpm: returned from entry point
cpu(0):Creating pci
cpu(0):domain/pci: Binary start: 260c6c4, end: 295e1e4
cpu(0):domain/pci: Binary is unsigned
cpu(0):NYI free
cpu(0):NYI free
cpu(0):num_pages: 46
cpu(0):domain/pci: Entry point at 102d00000
cpu(0):domain/pci: .text starts at 102d00000
init: starting PCI domain
cpu(0):command 103 status 0
cpu(0):Enable bus mastering for device
cpu(0):command 103 status 0
cpu(0):Enable bus mastering for device
cpu(0):BarAddr fd000000 size 1000000
cpu(0):BarAddr febd4000 size 1000
cpu(0):command 103 status 10
cpu(0):Enable bus mastering for device
cpu(0):BarAddr feb80000 size 20000
cpu(0):BarAddr feba0000 size 20000
cpu(0):Bar I/O Addr c041 size 1f
cpu(0):BarAddr febd0000 size 4000
cpu(0):command 107 status 10
cpu(0):Enable bus mastering for device
cpu(0):Bar I/O Addr c061 size 1f
cpu(0):BarAddr febd5000 size 1000
cpu(0):command 103 status 0
cpu(0):Enable bus mastering for device
cpu(0):command 107 status 10
cpu(0):Enable bus mastering for device
cpu(0):Bar I/O Addr c081 size 1f
cpu(0):BarAddr febd6000 size 1000
cpu(0):command 103 status 0
cpu(0):Enable bus mastering for device
cpu(0):Bar I/O Addr 701 size 3f
cpu(0):domain/pci: returned from entry point
cpu(0):domain/virtio_net: Binary start: 317c984, end: 37a9744
cpu(0):domain/virtio_net: Binary is unsigned
cpu(0):NYI free
cpu(0):NYI free
cpu(0):num_pages: 38
cpu(0):domain/virtio_net: Entry point at 102d80000
cpu(0):domain/virtio_net: .text starts at 102d80000
cpu(0):domain/virtio_net: returned from entry point
cpu(0):domain/bdev_shadow: Binary start: 42cfd74, end: 806b9d4
cpu(0):domain/bdev_shadow: Binary is unsigned
cpu(0):NYI free
cpu(0):NYI free
cpu(0):num_pages: 15035
cpu(0):domain/bdev_shadow: Entry point at 10c000000
cpu(0):domain/bdev_shadow: .text starts at 10c000000
cpu(0):Init bdev shadow domain
cpu(0):domain/membdev: Binary start: 86618c4, end: c3eb2ec
cpu(0):domain/membdev: Binary is unsigned
cpu(0):NYI free
cpu(0):NYI free
cpu(0):num_pages: 15033
`

Refactor FS Log

In xv6, syscalls manually do begin_op() and end_op() to open and close transactions. This is unsafe and hard to port to Rust. Maybe wrap these two calls into a guard and use RAII to auto-close a transaction when the guard goes out of the scope.
But we need to fully understand the logging layer and make sure that we are able to refactor every single call site.

Measure CPU utilization

Write a library for measuring cpu utilization. The end goal is to have a minimal htop/top for process/threads/domains

RedLeaf does not rely on hardware address spaces for isolation?

In your OSDI'20 paper, you mentioned that "RedLeaf does not rely on hardware address spaces for isolation", but how do you realize memory isolation in RedLeaf? Since all the domains are in ring0, a malicious user program has access to all the physical memory and can do anything bad to other user programs.

git clone failed because redIDL is not public

Hello, I'm trying to build RedLeaf, but I failed to run git clone --recursive https://github.com/mars-research/redleaf.git. I got a permission error while cloning the submodule [email protected]:mars-research/redIDL.git. Is there any plan to make this module public?

PCI mmap is broken due to ngc

Temporary fix:

  • Disable building the interface under idl_generation rule
  184 .PHONY: idl_generation
  185 idl_generation: tools/redIDL
  186         @ if [ ! -f "tools/redIDL/codegen/ngc/Cargo.toml" ]; \
  187         then echo "redIDL not found. Maybe you want to do 'git submodule init && git submodule update' then try again?"; \
  188                         exit -1; \
  189         fi
  190         #make -C interface
  • Modify kernel/src/generated_domain_create.rs under function pci_create_domain_pci
      type UserInit_ = fn(
          ::alloc::boxed::Box<dyn::syscalls::Syscall>,
          ::alloc::boxed::Box<dyn::syscalls::Mmap>,
          ::alloc::boxed::Box<dyn::syscalls::Heap>,
     ) -> alloc::boxed::Box<dyn interface::pci::PCI>;
let pmmap_ = ::alloc::boxed::Box::new(crate::syscalls::Mmap::new());
....
let ep_rtn_ = user_ep_(pdom_, pmmap_, pheap_);

rv6 shell

  • Use keyboard driver from PR #10 to get user input.
  • Map device drivers to files
  • Implement pipe in rv6 fs.(issue #9)
  • Implement elf load.(issue #4)

And see more details in the image

image

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.