Add assembly constants file
This commit is contained in:
		| @@ -2,6 +2,8 @@ | |||||||
| # v. 2.0. If a copy of the MPL was not distributed with this file, You can | # 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/. | # obtain one at https://mozilla.org/MPL/2.0/. | ||||||
|  |  | ||||||
|  | .include "./arch/riscv/constants.s" | ||||||
|  |  | ||||||
| .section .text | .section .text | ||||||
|  |  | ||||||
| # a0 - First pointer. | # a0 - First pointer. | ||||||
| @@ -237,3 +239,70 @@ memset: | |||||||
|  |  | ||||||
| .Lmemset_end: | .Lmemset_end: | ||||||
| 	ret | 	ret | ||||||
|  |  | ||||||
|  | # Maps a page of physical memory to the identical virtual memory. | ||||||
|  | # | ||||||
|  | # Parameters: | ||||||
|  | # a0 - Corresponding virtual address. | ||||||
|  | # a1 - Physical page address. | ||||||
|  | # a2 - Free memory page that can be used to create a leaf page table. | ||||||
|  | # a3 - Page table level. If a3 is 0 a superpage is allocated, otherwise a normal page. | ||||||
|  | # a4 - Flags. | ||||||
|  | # | ||||||
|  | # If the function creates new page tables in a2, it advances a2 by the page size and | ||||||
|  | # returns it in a0. | ||||||
|  | .type pmem_map_at, @function | ||||||
|  | .globl pmem_map_at | ||||||
|  | pmem_map_at: | ||||||
|  | 	csrr t0, satp | ||||||
|  | 	slli t0, t0, 12 # Root table address. | ||||||
|  |  | ||||||
|  | 	li t4, 0xfffffc00 | ||||||
|  | 	li t5, 0xffc # 10 bit * PTESIZE mask. | ||||||
|  | 	li t1, 20 | ||||||
|  |  | ||||||
|  | .Lpmem_map_at_loop: | ||||||
|  | 	# Multiply VPN[i] by 4 and add to the start address of the page table. | ||||||
|  | 	# This gives the physical address of the page table entry. | ||||||
|  | 	srl t2, a0, t1 | ||||||
|  | 	and t2, t2, t5 # VPN[i] * PTESIZE. | ||||||
|  | 	add t2, t0, t2 # a + VPN[i] * PTESIZE. | ||||||
|  |  | ||||||
|  | 	beqz a3, .Lpmem_map_at_leaf | ||||||
|  |  | ||||||
|  | 	lw t3, (t2) | ||||||
|  | 	andi t6, t3, 0b1 | ||||||
|  |  | ||||||
|  | 	beqz t6, .Lpmem_map_at_create | ||||||
|  |  | ||||||
|  | 	and t0, t3, t4 | ||||||
|  | 	slli t0, t0, 2 | ||||||
|  |  | ||||||
|  | 	j .Lpmem_map_at_next | ||||||
|  |  | ||||||
|  | .Lpmem_map_at_create: | ||||||
|  | 	# Take a chunk of free memory and use it as the next page table. | ||||||
|  | 	# The beginning addres off the chunk is the base address (a) for the next level. | ||||||
|  | 	mv t0, a2 | ||||||
|  | 	srli t3, t0, 2 | ||||||
|  | 	ori t3, t3, 0b1 | ||||||
|  | 	sw t3, (t2) | ||||||
|  |  | ||||||
|  | 	li t6, PAGE_SIZE | ||||||
|  | 	add a2, a2, t6 | ||||||
|  |  | ||||||
|  | .Lpmem_map_at_next: | ||||||
|  | 	# Calculate the next page table address for the next level. | ||||||
|  | 	addi t1, t1, -10 | ||||||
|  | 	addi a3, a3, -1 | ||||||
|  |  | ||||||
|  | 	j .Lpmem_map_at_loop | ||||||
|  |  | ||||||
|  | .Lpmem_map_at_leaf: | ||||||
|  | 	srli t3, a1, 2 # Physical page number mapped to 12 bits of the page table entry. | ||||||
|  | 	ori a4, a4, 0b1 | ||||||
|  | 	or t3, t3, a4 # Execute, write, read and valid. | ||||||
|  | 	sw t3, (t2) | ||||||
|  |  | ||||||
|  | 	mv a0, a2 | ||||||
|  | 	ret | ||||||
|   | |||||||
							
								
								
									
										1
									
								
								arch/riscv/constants.s
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								arch/riscv/constants.s
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | .equ PAGE_SIZE, 4096 | ||||||
| @@ -2,6 +2,8 @@ | |||||||
| # v. 2.0. If a copy of the MPL was not distributed with this file, You can | # 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/. | # obtain one at https://mozilla.org/MPL/2.0/. | ||||||
|  |  | ||||||
|  | .include "./arch/riscv/constants.s" | ||||||
|  |  | ||||||
| .section .rodata | .section .rodata | ||||||
|  |  | ||||||
| panic_message: .asciz "\nPanic" | panic_message: .asciz "\nPanic" | ||||||
| @@ -104,12 +106,10 @@ set_up_stack: | |||||||
| # a1 - Memory end pointer. | # a1 - Memory end pointer. | ||||||
| .type imem_zero, @function | .type imem_zero, @function | ||||||
| imem_zero: | imem_zero: | ||||||
| 	mv t0, a0 |  | ||||||
|  |  | ||||||
| .Limem_zero_loop: | .Limem_zero_loop: | ||||||
| 	bgeu t0, a1, .Limem_zero_end | 	bgeu a0, a1, .Limem_zero_end | ||||||
| 	sw zero, (t0) | 	sw zero, (a0) | ||||||
| 	addi t0, t0, 4 | 	addi a0, a0, 4 | ||||||
|  |  | ||||||
| 	j .Limem_zero_loop | 	j .Limem_zero_loop | ||||||
|  |  | ||||||
| @@ -125,7 +125,7 @@ imem_mirror: | |||||||
| 	csrr t0, satp | 	csrr t0, satp | ||||||
| 	slli t0, t0, 12 | 	slli t0, t0, 12 | ||||||
|  |  | ||||||
| 	li t3, 0x1000 | 	li t3, PAGE_SIZE | ||||||
| 	add t1, t0, t3 # Original page table. | 	add t1, t0, t3 # Original page table. | ||||||
| 	add t2, t1, t3 # Copied page table. | 	add t2, t1, t3 # Copied page table. | ||||||
|  |  | ||||||
| @@ -167,9 +167,10 @@ imem_initialize: | |||||||
| 	sw s1, 16(sp) | 	sw s1, 16(sp) | ||||||
| 	sw s2, 12(sp) | 	sw s2, 12(sp) | ||||||
| 	sw s3, 8(sp) | 	sw s3, 8(sp) | ||||||
|  | 	sw a0, 4(sp) | ||||||
|  |  | ||||||
| 	# Set s1 to the beginning of free memory (skipping root page table). | 	# Set s1 to the beginning of free memory (skipping root page table). | ||||||
| 	li s1, 4096 | 	li s1, PAGE_SIZE | ||||||
| 	add s1, a1, s1 | 	add s1, a1, s1 | ||||||
|  |  | ||||||
| 	slli a3, a3, 1 # Multiply by two to account for the copy in virtual memory. | 	slli a3, a3, 1 # Multiply by two to account for the copy in virtual memory. | ||||||
| @@ -190,28 +191,28 @@ imem_initialize: | |||||||
| 	srli t0, a1, 12 | 	srli t0, a1, 12 | ||||||
| 	csrw satp, t0 | 	csrw satp, t0 | ||||||
|  |  | ||||||
|  | 	# Zero memory for page tables. | ||||||
|  | 	mv a0, a1 | ||||||
|  | 	add a1, s1, a3 | ||||||
|  | 	call imem_zero | ||||||
|  |  | ||||||
| 	# Executable section. | 	# Executable section. | ||||||
| 	# a0 is coming from the parameter. | 	mv a0, s1 | ||||||
| 	addi a1, s2, %lo(etext) | 	lw a1, 4(sp) | ||||||
| 	mv a2, s1 | 	addi a2, s2, %lo(etext) | ||||||
| 	li a3, 1 | 	li a3, 0b1010 # Read and execute. | ||||||
| 	li a4, 0b1010 |  | ||||||
| 	jal imem_map_range | 	jal imem_map_range | ||||||
|  |  | ||||||
| 	# Read only section. | 	# Read only section. | ||||||
| 	addi a0, s2, %lo(etext) | 	addi a1, s2, %lo(etext) | ||||||
| 	addi a1, s3, %lo(_data) | 	addi a2, s3, %lo(_data) | ||||||
| 	mv a2, s1 | 	li a3, 0b0010 # Read. | ||||||
| 	li a3, 1 |  | ||||||
| 	li a4, 0b0010 |  | ||||||
| 	jal imem_map_range | 	jal imem_map_range | ||||||
|  |  | ||||||
| 	# Data section. | 	# Data section. | ||||||
| 	addi a0, s3, %lo(_data) | 	addi a1, s3, %lo(_data) | ||||||
| 	lw a1, 20(sp) | 	lw a2, 20(sp) | ||||||
| 	mv a2, s1 | 	li a3, 0b0110 # Read and write. | ||||||
| 	li a3, 1 |  | ||||||
| 	li a4, 0b0110 |  | ||||||
| 	jal imem_map_range | 	jal imem_map_range | ||||||
|  |  | ||||||
| 	# Enable paging. | 	# Enable paging. | ||||||
| @@ -236,11 +237,12 @@ imem_initialize: | |||||||
| # Maps multiple pages of physical memory to the identical virtual memory. | # Maps multiple pages of physical memory to the identical virtual memory. | ||||||
| # | # | ||||||
| # Parameters: | # Parameters: | ||||||
| # a0 - Start address. | # a0 - Start of the free memory that can be used to create leaf page tables. | ||||||
| # a1 - End address. | # a1 - Start address. | ||||||
| # a2 - Start of the free memory that can be used to create leaf page tables. | # a2 - End address. | ||||||
| # a3 - Page table level. If a3 is 0 a superpage is allocated, otherwise a normal page. | # a3 - Flags. | ||||||
| # a4 - Flags. | # | ||||||
|  | # If the function creates new page tables it advances and returns a0. | ||||||
| .type imem_map_range, @function | .type imem_map_range, @function | ||||||
| imem_map_range: | imem_map_range: | ||||||
| 	# Prologue. | 	# Prologue. | ||||||
| @@ -250,27 +252,30 @@ imem_map_range: | |||||||
| 	addi s0, sp, 32 | 	addi s0, sp, 32 | ||||||
|  |  | ||||||
| 	sw s1, 20(sp) | 	sw s1, 20(sp) | ||||||
| 	sw a2, 16(sp) | 	sw s2, 16(sp) | ||||||
| 	sw a3, 12(sp) | 	sw s3, 12(sp) | ||||||
| 	sw a4, 8(sp) | 	sw s4, 8(sp) | ||||||
|  |  | ||||||
| 	mv s1, a1 | 	mv s1, a1 | ||||||
|  | 	mv s2, a2 | ||||||
|  | 	li s3, PAGE_SIZE | ||||||
|  | 	mv s4, a3 | ||||||
|  |  | ||||||
| .Limem_map_range_loop: | .Limem_map_range_loop: | ||||||
| 	bge a0, s1, .Limem_map_range_end | 	bge s1, s2, .Limem_map_range_end | ||||||
|  |  | ||||||
| 	mv a1, a0 | 	mv a1, s1 | ||||||
| 	lw a2, 16(sp) | 	mv a2, s4 | ||||||
| 	lw a3, 12(sp) |  | ||||||
| 	lw a4, 8(sp) |  | ||||||
| 	jal imem_map_at | 	jal imem_map_at | ||||||
|  |  | ||||||
| 	li t0, 4096 | 	add s1, s1, s3 | ||||||
| 	add a0, a0, t0 |  | ||||||
|  |  | ||||||
| 	j .Limem_map_range_loop | 	j .Limem_map_range_loop | ||||||
|  |  | ||||||
| .Limem_map_range_end: | .Limem_map_range_end: | ||||||
|  | 	lw s4, 8(sp) | ||||||
|  | 	lw s3, 12(sp) | ||||||
|  | 	lw s2, 16(sp) | ||||||
| 	lw s1, 20(sp) | 	lw s1, 20(sp) | ||||||
|  |  | ||||||
| 	# Epilogue. | 	# Epilogue. | ||||||
| @@ -282,62 +287,53 @@ imem_map_range: | |||||||
| # Maps a page of physical memory to the identical virtual memory. | # Maps a page of physical memory to the identical virtual memory. | ||||||
| # | # | ||||||
| # Parameters: | # Parameters: | ||||||
| # a0 - Corresponding virtual address. | # a0 - Free memory page that can be used to create a leaf page table. | ||||||
| # a1 - Physical page address. | # a1 - Physical page address. | ||||||
| # a2 - Free memory page that can be used to create a leaf page table. | # a2 - Flags. | ||||||
| # a3 - Page table level. If a3 is 0 a superpage is allocated, otherwise a normal page. |  | ||||||
| # a4 - Flags. |  | ||||||
| # | # | ||||||
| # Returns virtual page address in a0. | # If the function creates new page tables it advances and returns a0. | ||||||
| .type imem_map_at, @function | .type imem_map_at, @function | ||||||
| imem_map_at: | imem_map_at: | ||||||
| 	csrr t0, satp | 	csrr t0, satp | ||||||
| 	slli t0, t0, 12 # Root table address. | 	slli t0, t0, 12 # Root table address. | ||||||
|  |  | ||||||
| 	li t4, 0xfffffc00 | 	li t1, 0xffc # 10 bit * PTESIZE mask. | ||||||
| 	li t5, 0xffc # 10 bit * PTESIZE mask. |  | ||||||
| 	li t1, 20 |  | ||||||
|  |  | ||||||
| .Limem_map_at_loop: | 	srli t2, a1, 20 | ||||||
| 	# Multiply VPN[i] by 4 and add to the start address of the page table. | 	and t2, t2, t1 # VPN[1] * PTESIZE. | ||||||
| 	# This gives the physical address of the page table entry. | 	add t2, t0, t2 # a + VPN[1] * PTESIZE. | ||||||
| 	srl t2, a0, t1 |  | ||||||
| 	and t2, t2, t5 # VPN[i] * PTESIZE. |  | ||||||
| 	add t2, t0, t2 # a + VPN[i] * PTESIZE. |  | ||||||
|  |  | ||||||
| 	beqz a3, .Limem_map_at_leaf |  | ||||||
|  |  | ||||||
| 	lw t3, (t2) | 	lw t3, (t2) | ||||||
| 	andi t6, t3, 0b1 | 	andi t4, t3, 0b1 | ||||||
|  |  | ||||||
| 	beqz t6, .Limem_map_at_create | 	beqz t4, .Limem_map_at_create | ||||||
|  |  | ||||||
|  | 	li t4, 0xfffffc00 | ||||||
| 	and t0, t3, t4 | 	and t0, t3, t4 | ||||||
| 	slli t0, t0, 2 | 	slli t0, t0, 2 | ||||||
|  |  | ||||||
| 	j .Limem_map_at_next | 	j .Limem_map_at_existing | ||||||
|  |  | ||||||
| .Limem_map_at_create: | .Limem_map_at_create: | ||||||
| 	# Take a chunk of free memory and use it as the next page table. | 	# Take a chunk of free memory and use it as the next page table. | ||||||
| 	# The beginning addres off the chunk is the base address (a) for the next level. | 	# The beginning addres off the chunk is the base address (a) for the next level. | ||||||
| 	mv t0, a2 | 	mv t0, a0 | ||||||
| 	srli t3, t0, 2 | 	srli t3, t0, 2 | ||||||
| 	ori t3, t3, 0b1 | 	ori t3, t3, 0b1 | ||||||
| 	sw t3, (t2) | 	sw t3, (t2) | ||||||
|  |  | ||||||
| .Limem_map_at_next: | 	li t4, PAGE_SIZE | ||||||
| 	# Calculate the next page table address for the next level. | 	add a0, a0, t4 | ||||||
| 	addi t1, t1, -10 |  | ||||||
| 	addi a3, a3, -1 |  | ||||||
|  |  | ||||||
| 	j .Limem_map_at_loop | .Limem_map_at_existing: | ||||||
|  | 	srli t2, a1, 10 | ||||||
|  | 	and t2, t2, t1 # VPN[0] * PTESIZE. | ||||||
|  | 	add t2, t0, t2 # a + VPN[0] * PTESIZE. | ||||||
|  |  | ||||||
| .Limem_map_at_leaf: |  | ||||||
| 	srli t3, a1, 2 # Physical page number mapped to 12 bits of the page table entry. | 	srli t3, a1, 2 # Physical page number mapped to 12 bits of the page table entry. | ||||||
| 	ori a4, a4, 0b1 | 	ori a2, a2, 0b1 | ||||||
| 	or t3, t3, a4 # Execute, write, read and valid. | 	or t3, t3, a2 # Execute, write, read and valid. | ||||||
| 	sw t3, (t2) | 	sw t3, (t2) | ||||||
|  |  | ||||||
| 	ret | 	ret | ||||||
|  |  | ||||||
| .section .text | .section .text | ||||||
| @@ -361,7 +357,7 @@ kernel_main: | |||||||
| 	lw a2, 20(sp) | 	lw a2, 20(sp) | ||||||
| 	li a3, 0 | 	li a3, 0 | ||||||
| 	li a4, 0b0010 | 	li a4, 0b0010 | ||||||
| 	call imem_map_at | 	call pmem_map_at | ||||||
|  |  | ||||||
| 	lw a0, 16(sp) | 	lw a0, 16(sp) | ||||||
| 	call device_tree | 	call device_tree | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user