diff --git a/rialto/src/exceptions.rs b/rialto/src/exceptions.rs
new file mode 100644
index 0000000..61f7846
--- /dev/null
+++ b/rialto/src/exceptions.rs
@@ -0,0 +1,79 @@
+// Copyright 2022, The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+//! Exception handlers.
+
+use core::arch::asm;
+use vmbase::{console::emergency_write_str, eprintln, power::reboot};
+
+#[no_mangle]
+extern "C" fn sync_exception_current() {
+    emergency_write_str("sync_exception_current\n");
+    print_esr();
+    reboot();
+}
+
+#[no_mangle]
+extern "C" fn irq_current() {
+    emergency_write_str("irq_current\n");
+    reboot();
+}
+
+#[no_mangle]
+extern "C" fn fiq_current() {
+    emergency_write_str("fiq_current\n");
+    reboot();
+}
+
+#[no_mangle]
+extern "C" fn serr_current() {
+    emergency_write_str("serr_current\n");
+    print_esr();
+    reboot();
+}
+
+#[no_mangle]
+extern "C" fn sync_lower() {
+    emergency_write_str("sync_lower\n");
+    print_esr();
+    reboot();
+}
+
+#[no_mangle]
+extern "C" fn irq_lower() {
+    emergency_write_str("irq_lower\n");
+    reboot();
+}
+
+#[no_mangle]
+extern "C" fn fiq_lower() {
+    emergency_write_str("fiq_lower\n");
+    reboot();
+}
+
+#[no_mangle]
+extern "C" fn serr_lower() {
+    emergency_write_str("serr_lower\n");
+    print_esr();
+    reboot();
+}
+
+#[inline]
+fn print_esr() {
+    let mut esr: u64;
+    unsafe {
+        asm!("mrs {esr}, esr_el1", esr = out(reg) esr);
+    }
+    eprintln!("esr={:#08x}", esr);
+}
diff --git a/rialto/src/main.rs b/rialto/src/main.rs
new file mode 100644
index 0000000..a769abb
--- /dev/null
+++ b/rialto/src/main.rs
@@ -0,0 +1,128 @@
+// Copyright 2022, The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+//! Project Rialto main source file.
+
+#![no_main]
+#![no_std]
+#![feature(default_alloc_error_handler)]
+
+mod exceptions;
+
+extern crate alloc;
+extern crate log;
+
+use aarch64_paging::{
+    idmap::IdMap,
+    paging::{Attributes, MemoryRegion},
+    AddressRangeError,
+};
+use buddy_system_allocator::LockedHeap;
+use log::{debug, info};
+use vmbase::main;
+
+const SZ_1K: usize = 1024;
+const SZ_64K: usize = 64 * SZ_1K;
+const SZ_1M: usize = 1024 * SZ_1K;
+const SZ_1G: usize = 1024 * SZ_1M;
+
+// Root level is given by the value of TCR_EL1.TG0 and TCR_EL1.T0SZ, set in
+// entry.S. For 4KB granule and 39-bit VA, the root level is 1.
+const PT_ROOT_LEVEL: usize = 1;
+const PT_ASID: usize = 1;
+
+#[global_allocator]
+static HEAP_ALLOCATOR: LockedHeap<32> = LockedHeap::<32>::new();
+
+static mut HEAP: [u8; SZ_64K] = [0; SZ_64K];
+
+unsafe fn kimg_ptr(sym: &u8) -> *const u8 {
+    sym as *const u8
+}
+
+unsafe fn kimg_addr(sym: &u8) -> usize {
+    kimg_ptr(sym) as usize
+}
+
+unsafe fn kimg_region(begin: &u8, end: &u8) -> MemoryRegion {
+    MemoryRegion::new(kimg_addr(begin), kimg_addr(end))
+}
+
+fn init_heap() {
+    // SAFETY: Allocator set to otherwise unused, static memory.
+    unsafe {
+        HEAP_ALLOCATOR.lock().init(&mut HEAP as *mut u8 as usize, HEAP.len());
+    }
+    info!("Initialized heap.");
+}
+
+fn init_kernel_pgt(pgt: &mut IdMap) -> Result<(), AddressRangeError> {
+    // The first 1 GiB of address space is used by crosvm for MMIO.
+    let reg_dev = MemoryRegion::new(0, SZ_1G);
+    // SAFETY: Taking addresses of kernel image sections to set up page table
+    // mappings. Not taking ownerhip of the memory.
+    let reg_text = unsafe { kimg_region(&text_begin, &text_end) };
+    let reg_rodata = unsafe { kimg_region(&rodata_begin, &rodata_end) };
+    let reg_data = unsafe { kimg_region(&data_begin, &boot_stack_end) };
+
+    debug!("Preparing kernel page tables.");
+    debug!("  dev:    {}-{}", reg_dev.start(), reg_dev.end());
+    debug!("  text:   {}-{}", reg_text.start(), reg_text.end());
+    debug!("  rodata: {}-{}", reg_rodata.start(), reg_rodata.end());
+    debug!("  data:   {}-{}", reg_data.start(), reg_data.end());
+
+    let prot_dev = Attributes::DEVICE_NGNRE | Attributes::EXECUTE_NEVER;
+    let prot_rx = Attributes::NORMAL | Attributes::NON_GLOBAL | Attributes::READ_ONLY;
+    let prot_ro = Attributes::NORMAL
+        | Attributes::NON_GLOBAL
+        | Attributes::READ_ONLY
+        | Attributes::EXECUTE_NEVER;
+    let prot_rw = Attributes::NORMAL | Attributes::NON_GLOBAL | Attributes::EXECUTE_NEVER;
+
+    pgt.map_range(&reg_dev, prot_dev)?;
+    pgt.map_range(&reg_text, prot_rx)?;
+    pgt.map_range(&reg_rodata, prot_ro)?;
+    pgt.map_range(&reg_data, prot_rw)?;
+
+    info!("Finished preparing kernel page table.");
+    Ok(())
+}
+
+fn activate_kernel_pgt(pgt: &mut IdMap) {
+    pgt.activate();
+    info!("Activated kernel page table.");
+}
+
+/// Entry point for Rialto.
+pub fn main(_a0: u64, _a1: u64, _a2: u64, _a3: u64) {
+    vmbase::logger::init(log::LevelFilter::Debug).unwrap();
+
+    info!("Welcome to Rialto!");
+    init_heap();
+
+    let mut pgt = IdMap::new(PT_ASID, PT_ROOT_LEVEL);
+    init_kernel_pgt(&mut pgt).unwrap();
+    activate_kernel_pgt(&mut pgt);
+}
+
+extern "C" {
+    static text_begin: u8;
+    static text_end: u8;
+    static rodata_begin: u8;
+    static rodata_end: u8;
+    static data_begin: u8;
+    static boot_stack_end: u8;
+}
+
+main!(main);
