summaryrefslogtreecommitdiff
path: root/boot/common-boot.s
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2025-09-07 20:51:39 +0200
committerEugen Wissner <belka@caraus.de>2025-09-07 20:51:39 +0200
commitd16ec370dc000e81978853661bbc7f5dac803975 (patch)
tree2f679b63be3595d61cbe1b52a38890153cb37c69 /boot/common-boot.s
parente0ac57dc1d27831b374b7540256d4e4285284492 (diff)
downloadelna-d16ec370dc000e81978853661bbc7f5dac803975.tar.gz
Compile static initializers
Diffstat (limited to 'boot/common-boot.s')
-rw-r--r--boot/common-boot.s368
1 files changed, 0 insertions, 368 deletions
diff --git a/boot/common-boot.s b/boot/common-boot.s
deleted file mode 100644
index 9305d40..0000000
--- a/boot/common-boot.s
+++ /dev/null
@@ -1,368 +0,0 @@
-# This Source Code Form is subject to the terms of the Mozilla Public License,
-# v. 2.0. If a copy of the MPL was not distributed with this file, You can
-# obtain one at https://mozilla.org/MPL/2.0/.
-
-.global _read_file, _write_error
-.global _memcmp, _memchr, _memmem, _mmap
-.global _current, _get, _advance, _label_counter
-.global _divide_by_zero_error, _strings_index, _string_equal
-
-.section .rodata
-
-.equ SYS_READ, 63
-.equ SYS_WRITE, 64
-.equ SYS_MMAP2, 222
-.equ STDIN, 0
-.equ STDOUT, 1
-.equ STDERR, 2
-.equ PROT_READ, 0x1
-.equ PROT_WRITE, 0x2
-.equ MAP_PRIVATE, 0x02
-.equ MAP_ANONYMOUS, 0x20
-
-new_line: .ascii "\n"
-
-.section .text
-
-# Write the current token to stderr. Ends the output with a newline.
-#
-# a0 - String pointer.
-# a1 - String length.
-.type _write_error, @function
-_write_error:
- mv t0, a0
- mv t1, a1
-
- li a0, STDERR
- mv a1, t0
- mv a2, t1
- li a7, SYS_WRITE
- ecall
-
- li a0, STDERR
- la a1, new_line
- li a2, 1
- li a7, SYS_WRITE
- ecall
-
- ret
-
-# a0 - First pointer.
-# a1 - Second pointer.
-# a2 - The length to compare.
-#
-# Returns 0 in a0 if memory regions are equal.
-.type _memcmp, @function
-_memcmp:
- mv t0, a0
- li a0, 0
-
-.Lmemcmp_loop:
- beqz a2, .Lmemcmp_end
-
- lbu t1, (t0)
- lbu t2, (a1)
- sub a0, t1, t2
-
- bnez a0, .Lmemcmp_end
-
- addi t0, t0, 1
- addi a1, a1, 1
- addi a2, a2, -1
-
- j .Lmemcmp_loop
-
-.Lmemcmp_end:
- ret
-
-# Reads standard input into a buffer.
-# a0 - Buffer pointer.
-# a1 - Buffer size.
-#
-# Sets s1 to the buffer passed in a0.
-#
-# Returns the amount of bytes written in a0.
-.type _read_file, @function
-_read_file:
- # Prologue.
- addi sp, sp, -8
- sw ra, 4(sp)
- sw s0, 0(sp)
- addi s0, sp, 8
-
- mv s1, a0
-
- li a0, STDIN
- mv a2, a1
- mv a1, s1
- li a7, SYS_READ
- ecall
-
- # Epilogue.
- lw ra, 4(sp)
- lw s0, 0(sp)
- addi sp, sp, 8
- ret
-
-.type _divide_by_zero_error, @function
-_divide_by_zero_error:
- addi a7, zero, 172 # getpid
- ecall
-
- addi a1, zero, 8 # SIGFPE
- addi a7, zero, 129 # kill
- ecall
- ret
-
-# a0 - Pointer to an array to get the first element.
-#
-# Dereferences a pointer and returns what is on the address in a0.
-.type _get, @function
-_get:
- lw a0, (a0)
- ret
-
-# Searches for the occurences of a character in the given memory block.
-#
-# Parameters:
-# a0 - Memory block.
-# a1 - Needle.
-# a2 - Memory size.
-#
-# Sets a0 to the pointer to the found character or to null if the character
-# doesn't occur in the memory block.
-.type _memchr, @function
-_memchr:
-.Lmemchr_loop:
- beqz a2, .Lmemchr_nil # Exit if the length is 0.
-
- lbu t0, (a0) # Load the character from the memory block.
- beq t0, a1, .Lmemchr_end # Exit if the character was found.
-
- # Otherwise, continue with the next character.
- addi a0, a0, 1
- addi a2, a2, -1
-
- j .Lmemchr_loop
-
-.Lmemchr_nil:
- li a0, 0
-
-.Lmemchr_end:
- ret
-
-# Locates a substring.
-#
-# Parameters:
-# a0 - Haystack.
-# a1 - Haystack size.
-# a2 - Needle.
-# a3 - Needle size.
-#
-# Sets a0 to the pointer to the beginning of the substring in memory or to 0
-# if the substring doesn't occur in the block.
-.type _memmem, @function
-_memmem:
- # Prologue.
- addi sp, sp, -24
- sw ra, 20(sp)
- sw s0, 16(sp)
- addi s0, sp, 24
-
- # Save preserved registers. They are used to keep arguments.
- sw s1, 12(sp)
- sw s2, 8(sp)
- sw s3, 4(sp)
- sw s4, 0(sp)
-
- mv s1, a0
- mv s2, a1
- mv s3, a2
- mv s4, a3
-
-.Lmemmem_loop:
- blt s2, s3, .Lmemmem_nil # Exit if the needle length is greater than memory.
-
- mv a0, s1
- mv a1, s3
- mv a2, s4
- call _memcmp
-
- mv t0, a0 # memcmp result.
- mv a0, s1 # Memory pointer for the case the substring was found.
- beqz t0, .Lmemmem_end
-
- addi s1, s1, 1
- add s2, s2, -1
-
- j .Lmemmem_loop
-
-.Lmemmem_nil:
- li a0, 0
-
-.Lmemmem_end:
-
- # Restore the preserved registers.
- lw s1, 12(sp)
- lw s2, 8(sp)
- lw s3, 4(sp)
- lw s4, 0(sp)
-
- # Epilogue.
- lw ra, 20(sp)
- lw s0, 16(sp)
- add sp, sp, 24
- ret
-
-# Searches for a string in a string array.
-#
-# Parameters:
-# a0 - Number of elements in the string array.
-# a1 - String array.
-# a2 - Needle length.
-# a3 - Needle.
-#
-# Sets a0 to the 1-based index of the needle in the haystack or to 0 if the
-# element could not be found.
-.type _strings_index, @function
-_strings_index:
- # Prologue.
- addi sp, sp, -32
- sw ra, 28(sp)
- sw s0, 24(sp)
- addi s0, sp, 32
-
- sw s1, 20(sp)
- mv s1, a0
- sw s2, 16(sp)
- mv s2, a1
- sw s3, 12(sp)
- mv s3, a2
- sw s4, 8(sp)
- mv s4, a3
- sw s5, 4(sp)
- li s5, 0 # Index counter.
-
-.Lstrings_index_loop:
- addi s5, s5, 1
- beqz s1, .Lstrings_index_missing
-
- lw a2, (s2) # Read the length of the current element in the haystack.
- bne a2, s3, .Lstrings_index_next # Lengths don't match, skip the iteration.
-
- addi a0, s2, 4
- mv a1, s4
- call _memcmp
-
- beqz a0, .Lstrings_index_end
-
-.Lstrings_index_next:
- # Advance the pointer, reduce the length.
- lw a2, (s2)
- addi s2, s2, 4
- add s2, s2, a2
- addi s1, s1, -1
- j .Lstrings_index_loop
-
-.Lstrings_index_missing:
- li s5, 0
-
-.Lstrings_index_end:
- mv a0, s5
-
- lw s1, 20(sp)
- lw s2, 16(sp)
- lw s3, 12(sp)
- lw s4, 8(sp)
- lw s5, 4(sp)
-
- # Epilogue.
- lw ra, 28(sp)
- lw s0, 24(sp)
- add sp, sp, 32
- ret
-
-# Compares two strings for equality.
-#
-# Parameters:
-# a0 - Length of the first string.
-# a1 - Pointer to the first string.
-# a2 - Length of the second string.
-# a3 - Pointer to the second string.
-#
-# Sets a0 to 1 if the string are equal, to 0 if not.
-.type _string_equal, @function
-_string_equal:
- # Prologue.
- addi sp, sp, -32
- sw ra, 28(sp)
- sw s0, 24(sp)
- addi s0, sp, 32
-
- # Compare string lengths.
- bne a0, a2, .Lstring_equal_not_found
-
- # If lengths match, compare the content.
- mv a0, a1
- mv a1, a3
- # a2 is already set to the length.
- call _memcmp
-
- bnez a0, .Lstring_equal_not_found
-
- li a0, 1
- j .Lstring_equal_end
-
-.Lstring_equal_not_found:
- mv a0, zero
-
-.Lstring_equal_end:
- # Epilogue.
- lw ra, 28(sp)
- lw s0, 24(sp)
- addi sp, sp, 32
- ret
-
-# Sets a0 to the mapping address.
-.type _mmap, @function
-_mmap:
- li a0, 0 # Address at which to create the mapping.
- li a1, 4096 # The length of the mapping.
- li a2, PROT_READ | PROT_WRITE # Protection flags.
- li a3, MAP_ANONYMOUS | MAP_PRIVATE # The mapping is not backed by a file.
- li a4, -1 # File descriptor.
- li a5, 0 # Page offset.
- li a7, SYS_MMAP2
- ecall
-
- ret
-
-# Sets the a0 to the current position in the source text (s1).
-.type _current, @function
-_current:
- mv a0, s1
- ret
-
-# Advances the position of the source text.
-#
-# Parameters:
-# a0 - The number of bytes to advance.
-.type _advance, @function
-_advance:
- add s1, s1, a0
- ret
-
-# Advances the global label counter by 1 setting a0 to the previous value.
-#
-# Parameters:
-# a0 - If it is 0, resets the counter to 1.
-.type _label_counter, @function
-_label_counter:
- bnez a0, .Llabel_counter_advance
- li s2, 0
-
-.Llabel_counter_advance:
- mv a0, s2
- addi s2, s2, 1
-
- ret