xref: /aosp_15_r20/external/crosvm/kernel_loader/src/test_elf.S (revision bb4ee6a4ae7042d18b07a98463b9c8b875e44b39)
1*bb4ee6a4SAndroid Build Coastguard Worker# Copyright 2022 The ChromiumOS Authors
2*bb4ee6a4SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be
3*bb4ee6a4SAndroid Build Coastguard Worker# found in the LICENSE file.
4*bb4ee6a4SAndroid Build Coastguard Worker
5*bb4ee6a4SAndroid Build Coastguard Worker# Build instructions:
6*bb4ee6a4SAndroid Build Coastguard Worker#  x86_64-linux-gnu-as test_elf.S -o test_elf.o
7*bb4ee6a4SAndroid Build Coastguard Worker#  x86_64-linux-gnu-ld test_elf.o -o test_elf.bin -T test_elf.ld
8*bb4ee6a4SAndroid Build Coastguard Worker
9*bb4ee6a4SAndroid Build Coastguard Worker    .intel_syntax noprefix
10*bb4ee6a4SAndroid Build Coastguard Worker
11*bb4ee6a4SAndroid Build Coastguard Worker    .section .rodata
12*bb4ee6a4SAndroid Build Coastguard Workerhello_world:
13*bb4ee6a4SAndroid Build Coastguard Worker    .string "Hello world!\n"
14*bb4ee6a4SAndroid Build Coastguard Worker    .set hello_size, .-hello_world
15*bb4ee6a4SAndroid Build Coastguard Worker
16*bb4ee6a4SAndroid Build Coastguard Worker    .text
17*bb4ee6a4SAndroid Build Coastguard Worker    .globl _start
18*bb4ee6a4SAndroid Build Coastguard Worker_start:
19*bb4ee6a4SAndroid Build Coastguard Worker    lea rsi, [rip + hello_world]    # rsi -> message string
20*bb4ee6a4SAndroid Build Coastguard Worker    mov rcx, hello_size             # rcx = length of message
21*bb4ee6a4SAndroid Build Coastguard Worker    mov dx, 0x3F8                   # dx = COM1 port
22*bb4ee6a4SAndroid Build Coastguard Worker
23*bb4ee6a4SAndroid Build Coastguard Worker.print_loop:
24*bb4ee6a4SAndroid Build Coastguard Worker    # Wait for the transmit buffer to be empty by polling the line status.
25*bb4ee6a4SAndroid Build Coastguard Worker    add dx, 5                       # dx = line status register
26*bb4ee6a4SAndroid Build Coastguard Worker.wait_empty:
27*bb4ee6a4SAndroid Build Coastguard Worker    in al, dx                       # read line status
28*bb4ee6a4SAndroid Build Coastguard Worker    test al, 0x20                   # check buffer empty flag
29*bb4ee6a4SAndroid Build Coastguard Worker    jz .wait_empty                  # keep waiting if flag is not set
30*bb4ee6a4SAndroid Build Coastguard Worker
31*bb4ee6a4SAndroid Build Coastguard Worker.wait_done:
32*bb4ee6a4SAndroid Build Coastguard Worker    sub dx, 5                       # dx = data register
33*bb4ee6a4SAndroid Build Coastguard Worker
34*bb4ee6a4SAndroid Build Coastguard Worker    # Load a byte of the message and send it to the serial port.
35*bb4ee6a4SAndroid Build Coastguard Worker    lodsb                           # load message byte from RSI to AL
36*bb4ee6a4SAndroid Build Coastguard Worker    out dx, al                      # send byte to serial port
37*bb4ee6a4SAndroid Build Coastguard Worker    dec rcx                         # rcx--
38*bb4ee6a4SAndroid Build Coastguard Worker    jnz .print_loop                 # repeat if rcx != 0
39*bb4ee6a4SAndroid Build Coastguard Worker
40*bb4ee6a4SAndroid Build Coastguard Worker.done:
41*bb4ee6a4SAndroid Build Coastguard Worker    int3                            # cause vcpu to exit
42