summaryrefslogtreecommitdiff
path: root/boot/symbol.s
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2025-05-08 23:36:29 +0200
committerEugen Wissner <belka@caraus.de>2025-05-08 23:36:29 +0200
commit92f50fff5f8a9ec2db03cc57dbf00a43e64943bf (patch)
tree0bb225b4468ff9a9b7f6ad34e38e9bef5b692b11 /boot/symbol.s
parent3f11d63a0f86191f010bc0093ee8616c154d9a1b (diff)
downloadelna-92f50fff5f8a9ec2db03cc57dbf00a43e64943bf.tar.gz
Parse procedure parameters
Diffstat (limited to 'boot/symbol.s')
-rw-r--r--boot/symbol.s66
1 files changed, 65 insertions, 1 deletions
diff --git a/boot/symbol.s b/boot/symbol.s
index 66409aa..a927b0e 100644
--- a/boot/symbol.s
+++ b/boot/symbol.s
@@ -2,7 +2,7 @@
# 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 symbol_table_build
+.global symbol_table_build, symbol_table_find
.include "boot/definitions.inc"
@@ -49,6 +49,70 @@ symbol_table: .zero SYMBOL_PRIME
.section .text
+# Searches for a symbol by name.
+#
+# Parameters:
+# a0 - Local symbol table or 0.
+# a1 - Length of the symbol to search.
+# a2 - Pointer to the symbol name.
+#
+# Sets a0 to the symbol info.
+.type symbol_table_find, @function
+symbol_table_find:
+ # Prologue.
+ addi sp, sp, -32
+ sw ra, 28(sp)
+ sw s0, 24(sp)
+ addi s0, sp, 32
+
+ sw s1, 20(sp) # Current symbol in the table.
+ sw s2, 16(sp) # Symbol table length.
+ sw s3, 12(sp) # Length of the symbol to search.
+ sw s4, 8(sp) # Pointer to the symbol to search.
+
+ mv s3, a1
+ mv s4, a2
+
+ la s1, symbol_table
+ lw s2, 0(s1)
+ addi s1, s1, 4 # Advance to the first symbol in the table.
+
+.Lsymbol_table_find_loop:
+ beqz s2, .Lsymbol_table_find_not_found
+
+ # Compare string lengths.
+ lw a2, 0(s1)
+ bne s3, a2, .Lsymbol_table_find_continue
+
+ # If lengths match, compare the content.
+ mv a0, s4
+ lw a1, 4(s1)
+ call _memcmp
+
+ bnez a0, .Lsymbol_table_find_continue
+
+ lw a0, 8(s1) # Pointer to the symbol.
+ j .Lsymbol_table_end
+
+.Lsymbol_table_find_continue:
+ addi s2, s2, -1
+ j .Lsymbol_table_find_loop
+
+.Lsymbol_table_find_not_found:
+ li a0, 0
+
+.Lsymbol_table_end:
+ lw s1, 20(sp)
+ lw s2, 16(sp)
+ lw s3, 12(sp)
+ lw s4, 8(sp)
+
+ # Epilogue.
+ lw ra, 28(sp)
+ lw s0, 24(sp)
+ addi sp, sp, 32
+ ret
+
# Build the initial symbols.
#
# Sets a0 to the pointer to the global symbol table.