// File: /workspace/github_c_makefile_star2_O0/hobo0xcc[P]rve/src/cpu.c
// Function: VirtioRead
uint8_t VirtioRead(State *state, uint64_t offset) {
    if (offset >= VIRTIO_MAGIC_VALUE_BASE && offset < VIRTIO_MAGIC_VALUE_BASE + 4) {
        return ReadRange8(0x74726976, offset - VIRTIO_MAGIC_VALUE_BASE);
    } else if (offset >= VIRTIO_DEVICE_VERSION_BASE && offset < VIRTIO_DEVICE_VERSION_BASE + 4) {
        return ReadRange8(0x01, offset - VIRTIO_DEVICE_VERSION_BASE);
    } else if (offset >= VIRTIO_DEVICE_ID_BASE && offset < VIRTIO_DEVICE_ID_BASE + 4) {
        return ReadRange8(0x02, offset - VIRTIO_DEVICE_ID_BASE);
    } else if (offset >= VIRTIO_VENDOR_ID_BASE && offset < VIRTIO_VENDOR_ID_BASE + 4) {
        return ReadRange8(0x554d4551, offset - VIRTIO_VENDOR_ID_BASE);
    } else if (offset >= VIRTIO_HOST_FEATURES_BASE && offset < VIRTIO_HOST_FEATURES_BASE + 4) {
        return ReadRange8(state->virtio->host_features, offset - VIRTIO_HOST_FEATURES_BASE);
    } else if (offset >= VIRTIO_QUEUE_NUM_MAX_BASE && offset < VIRTIO_QUEUE_NUM_MAX_BASE + 4) {
        return ReadRange8(0x2000, offset - VIRTIO_QUEUE_NUM_MAX_BASE);
    } else if (offset >= VIRTIO_QUEUE_PFN_BASE && offset < VIRTIO_QUEUE_PFN_BASE + 4) {
        return ReadRange8(state->virtio->queue_pfn, offset - VIRTIO_QUEUE_PFN_BASE);
    } else if (offset >= VIRTIO_INTERRUPT_STATUS_BASE && offset < VIRTIO_INTERRUPT_STATUS_BASE + 4) {
        return ReadRange8(state->virtio->interrupt_status, offset - VIRTIO_INTERRUPT_STATUS_BASE);
    } else if (offset >= VIRTIO_STATUS_BASE && offset < VIRTIO_STATUS_BASE + 4) {
        return ReadRange8(state->virtio->status, offset - VIRTIO_STATUS_BASE);
    } else {
        return 0;
    }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x20, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
cmpq $0x0, -0x18(%rbp)
jb 0x3538
cmpq $0x4, -0x18(%rbp)
jae 0x3538
movq -0x18(%rbp), %rsi
subq $0x0, %rsi
movl $0x74726976, %edi       # imm = 0x74726976
callq 0x28a0
movb %al, -0x1(%rbp)
jmp 0x369e
cmpq $0x4, -0x18(%rbp)
jb 0x3560
cmpq $0x8, -0x18(%rbp)
jae 0x3560
movq -0x18(%rbp), %rsi
subq $0x4, %rsi
movl $0x1, %edi
callq 0x28a0
movb %al, -0x1(%rbp)
jmp 0x369e
cmpq $0x8, -0x18(%rbp)
jb 0x3588
cmpq $0xc, -0x18(%rbp)
jae 0x3588
movq -0x18(%rbp), %rsi
subq $0x8, %rsi
movl $0x2, %edi
callq 0x28a0
movb %al, -0x1(%rbp)
jmp 0x369e
cmpq $0xc, -0x18(%rbp)
jb 0x35b0
cmpq $0x10, -0x18(%rbp)
jae 0x35b0
movq -0x18(%rbp), %rsi
subq $0xc, %rsi
movl $0x554d4551, %edi       # imm = 0x554D4551
callq 0x28a0
movb %al, -0x1(%rbp)
jmp 0x369e
cmpq $0x10, -0x18(%rbp)
jb 0x35e2
cmpq $0x14, -0x18(%rbp)
jae 0x35e2
movq -0x10(%rbp), %rax
movq 0x8130(%rax), %rax
movl (%rax), %eax
movl %eax, %edi
movq -0x18(%rbp), %rsi
subq $0x10, %rsi
callq 0x28a0
movb %al, -0x1(%rbp)
jmp 0x369e
cmpq $0x34, -0x18(%rbp)
jb 0x360a
cmpq $0x38, -0x18(%rbp)
jae 0x360a
movq -0x18(%rbp), %rsi
subq $0x34, %rsi
movl $0x2000, %edi           # imm = 0x2000
callq 0x28a0
movb %al, -0x1(%rbp)
jmp 0x369e
cmpq $0x40, -0x18(%rbp)
jb 0x363a
cmpq $0x44, -0x18(%rbp)
jae 0x363a
movq -0x10(%rbp), %rax
movq 0x8130(%rax), %rax
movl 0x18(%rax), %eax
movl %eax, %edi
movq -0x18(%rbp), %rsi
subq $0x40, %rsi
callq 0x28a0
movb %al, -0x1(%rbp)
jmp 0x369e
cmpq $0x60, -0x18(%rbp)
jb 0x366a
cmpq $0x64, -0x18(%rbp)
jae 0x366a
movq -0x10(%rbp), %rax
movq 0x8130(%rax), %rax
movl 0x20(%rax), %eax
movl %eax, %edi
movq -0x18(%rbp), %rsi
subq $0x60, %rsi
callq 0x28a0
movb %al, -0x1(%rbp)
jmp 0x369e
cmpq $0x70, -0x18(%rbp)
jb 0x369a
cmpq $0x74, -0x18(%rbp)
jae 0x369a
movq -0x10(%rbp), %rax
movq 0x8130(%rax), %rax
movl 0x28(%rax), %eax
movl %eax, %edi
movq -0x18(%rbp), %rsi
subq $0x70, %rsi
callq 0x28a0
movb %al, -0x1(%rbp)
jmp 0x369e
movb $0x0, -0x1(%rbp)
movb -0x1(%rbp), %al
addq $0x20, %rsp
popq %rbp
retq
nopw (%rax,%rax)