mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			314 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			314 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
///////////////////////////////////////////
 | 
						|
// ebu.S
 | 
						|
//
 | 
						|
// Written: David_Harris@hmc.edu 21 January 2024
 | 
						|
//
 | 
						|
// Purpose: Test coverage for EBU
 | 
						|
//
 | 
						|
// A component of the CORE-V-WALLY configurable RISC-V project.
 | 
						|
// https://github.com/openhwgroup/cvw
 | 
						|
// 
 | 
						|
// Copyright (C) 2021-23 Harvey Mudd College & Oklahoma State University
 | 
						|
//
 | 
						|
// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1
 | 
						|
//
 | 
						|
// Licensed under the Solderpad Hardware License v 2.1 (the “License”); you may not use this file 
 | 
						|
// except in compliance with the License, or, at your option, the Apache License version 2.0. You 
 | 
						|
// may obtain a copy of the License at
 | 
						|
//
 | 
						|
// https://solderpad.org/licenses/SHL-2.1/
 | 
						|
//
 | 
						|
// Unless required by applicable law or agreed to in writing, any work distributed under the 
 | 
						|
// License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 
 | 
						|
// either express or implied. See the License for the specific language governing permissions 
 | 
						|
// and limitations under the License.
 | 
						|
////////////////////////////////////////////////////////////////////////////////////////////////
 | 
						|
 | 
						|
// load code to initalize stack, handle interrupts, terminate
 | 
						|
 | 
						|
#include "WALLY-init-lib.h"
 | 
						|
 | 
						|
# run-elf.bash find this in project description
 | 
						|
main:
 | 
						|
    li t5, 0x1
 | 
						|
    slli t5, t5, 62
 | 
						|
    ori t5, t5, 0xF0
 | 
						|
    csrs menvcfg, t5  # menvcfg.PBMTE = 1, CBZE, CBCFE, CBIE all 1
 | 
						|
 | 
						|
    # Page table root address at 0x80010000; SV48
 | 
						|
    li t5, 0x9000000000080010  
 | 
						|
    csrw satp, t5
 | 
						|
 | 
						|
    # sfence.vma x0, x0
 | 
						|
 | 
						|
    # switch to supervisor mode
 | 
						|
    li a0, 1   
 | 
						|
    ecall
 | 
						|
 | 
						|
    # 
 | 
						|
 | 
						|
#   Tricky case to cover.  I$ miss concurrent with DTLB miss.  HPTW has to hit the first
 | 
						|
#   access in the cache and miss a later one.  Trigger this by doing a load that touches
 | 
						|
#   a page not in the DTLB but where the top-level PTE is already there.  Has to happen
 | 
						|
#   near the end of the 16-instruction I$ line.
 | 
						|
# 
 | 
						|
#    Condition Coverage for instance /core/ebu/ebu/ebufsmarb --
 | 
						|
#
 | 
						|
#  File ../src/ebu/ebufsmarb.sv
 | 
						|
#----------------Focused Condition View-------------------
 | 
						|
#Line       72 Item    1  ((HREADY & FinalBeatD) & (LSUReq ~& IFUReq))
 | 
						|
#Condition totals: 2 of 4 input terms covered = 50.00%
 | 
						|
#
 | 
						|
#  Input Term   Covered  Reason for no coverage   Hint
 | 
						|
# -----------  --------  -----------------------  --------------
 | 
						|
#      HREADY         Y
 | 
						|
#  FinalBeatD         Y
 | 
						|
#      LSUReq         N  '_1' not hit             Hit '_1'
 | 
						|
#      IFUReq         N  No hits                  Hit '_0' and '_1'
 | 
						|
#
 | 
						|
#     Rows:       Hits  FEC Target            Non-masking condition(s)      
 | 
						|
# ---------  ---------  --------------------  -------------------------     
 | 
						|
#  Row   1:          2  HREADY_0              ((LSUReq ~& IFUReq) && FinalBeatD)
 | 
						|
#  Row   2:         14  HREADY_1              ((LSUReq ~& IFUReq) && FinalBeatD)
 | 
						|
#  Row   3:          1  FinalBeatD_0          ((LSUReq ~& IFUReq) && HREADY)
 | 
						|
#  Row   4:         14  FinalBeatD_1          ((LSUReq ~& IFUReq) && HREADY)
 | 
						|
#  Row   5:         14  LSUReq_0              ((HREADY & FinalBeatD) && IFUReq)
 | 
						|
#  Row   6:    ***0***  LSUReq_1              ((HREADY & FinalBeatD) && IFUReq)
 | 
						|
#  Row   7:    ***0***  IFUReq_0              ((HREADY & FinalBeatD) && LSUReq)
 | 
						|
# Row   8:    ***0***  IFUReq_1              ((HREADY & FinalBeatD) && LSUReq)
 | 
						|
 | 
						|
 | 
						|
    li a0, 0x80000000   
 | 
						|
    li a1, 0x80A00000
 | 
						|
    j label1
 | 
						|
 | 
						|
.align  6   # start on multiple of 64 bytes / 16 instruction cache line
 | 
						|
label1:
 | 
						|
    addi t2, t3, 0x100  # occupy part of cache line
 | 
						|
    sfence.vma          # flush tlb
 | 
						|
    lw t0, 0x234(a0)        # load to get an entry in the DTLB accessing top-level PTE
 | 
						|
    addi t2, t3, 0x103  # occupy part of cache line
 | 
						|
    addi t2, t3, 0x104  # occupy part of cache line
 | 
						|
    addi t2, t3, 0x105  # occupy part of cache line
 | 
						|
    addi t2, t3, 0x106  # occupy part of cache line
 | 
						|
    addi t2, t3, 0x107  # occupy part of cache line
 | 
						|
    addi t2, t3, 0x108  # occupy part of cache line
 | 
						|
    addi t2, t3, 0x109  # occupy part of cache line
 | 
						|
    addi t2, t3, 0x10A  # occupy part of cache line
 | 
						|
    lw t0, 0x234(a1)        # trigger DTLB miss
 | 
						|
    addi t2, t3, 0x10C  # occupy part of cache line
 | 
						|
    addi t2, t3, 0x10D  # occupy part of cache line
 | 
						|
    addi t2, t3, 0x10E  # occupy part of cache line
 | 
						|
    addi t2, t3, 0x10F  # occupy part of cache line
 | 
						|
 | 
						|
# next multiple of 16
 | 
						|
    addi t2, t3, 0x100  # occupy part of cache line
 | 
						|
    sfence.vma          # flush tlb
 | 
						|
    lw t0, 0x334(a0)        # load to get an entry in the DTLB accessing top-level PTE
 | 
						|
    addi t2, t3, 0x103  # occupy part of cache line
 | 
						|
    addi t2, t3, 0x104  # occupy part of cache line
 | 
						|
    addi t2, t3, 0x105  # occupy part of cache line
 | 
						|
    addi t2, t3, 0x106  # occupy part of cache line
 | 
						|
    addi t2, t3, 0x107  # occupy part of cache line
 | 
						|
    addi t2, t3, 0x108  # occupy part of cache line
 | 
						|
    addi t2, t3, 0x109  # occupy part of cache line
 | 
						|
    addi t2, t3, 0x10A  # occupy part of cache line
 | 
						|
    addi t2, t3, 0x10B  # occupy part of cache line
 | 
						|
    lw t0, 0x334(a1)        # trigger DTLB miss
 | 
						|
    addi t2, t3, 0x10D  # occupy part of cache line
 | 
						|
    addi t2, t3, 0x10E  # occupy part of cache line
 | 
						|
    addi t2, t3, 0x10F  # occupy part of cache line
 | 
						|
 | 
						|
# next multiple of 16
 | 
						|
    addi t2, t3, 0x100  # occupy part of cache line
 | 
						|
    sfence.vma          # flush tlb
 | 
						|
    lw t0, 0x434(a0)        # load to get an entry in the DTLB accessing top-level PTE
 | 
						|
    addi t2, t3, 0x103  # occupy part of cache line
 | 
						|
    addi t2, t3, 0x104  # occupy part of cache line
 | 
						|
    addi t2, t3, 0x105  # occupy part of cache line
 | 
						|
    addi t2, t3, 0x106  # occupy part of cache line
 | 
						|
    addi t2, t3, 0x107  # occupy part of cache line
 | 
						|
    addi t2, t3, 0x108  # occupy part of cache line
 | 
						|
    addi t2, t3, 0x109  # occupy part of cache line
 | 
						|
    addi t2, t3, 0x10A  # occupy part of cache line
 | 
						|
    addi t2, t3, 0x10B  # occupy part of cache line
 | 
						|
    addi t2, t3, 0x10C  # occupy part of cache line
 | 
						|
    lw t0, 0x434(a1)        # trigger DTLB miss
 | 
						|
    addi t2, t3, 0x10E  # occupy part of cache line
 | 
						|
    addi t2, t3, 0x10F  # occupy part of cache line
 | 
						|
 | 
						|
# next multiple of 16
 | 
						|
    addi t2, t3, 0x100  # occupy part of cache line
 | 
						|
    sfence.vma          # flush tlb
 | 
						|
    lw t0, 0x534(a0)        # load to get an entry in the DTLB accessing top-level PTE
 | 
						|
    addi t2, t3, 0x103  # occupy part of cache line
 | 
						|
    addi t2, t3, 0x104  # occupy part of cache line
 | 
						|
    addi t2, t3, 0x105  # occupy part of cache line
 | 
						|
    addi t2, t3, 0x106  # occupy part of cache line
 | 
						|
    addi t2, t3, 0x107  # occupy part of cache line
 | 
						|
    addi t2, t3, 0x108  # occupy part of cache line
 | 
						|
    addi t2, t3, 0x109  # occupy part of cache line
 | 
						|
    addi t2, t3, 0x10A  # occupy part of cache line
 | 
						|
    addi t2, t3, 0x10B  # occupy part of cache line
 | 
						|
    addi t2, t3, 0x10C  # occupy part of cache line
 | 
						|
    addi t2, t3, 0x10D  # occupy part of cache line
 | 
						|
    lw t0, 0x534(a1)        # trigger DTLB miss
 | 
						|
    addi t2, t3, 0x10F  # occupy part of cache line
 | 
						|
 | 
						|
    # wrap up
 | 
						|
    li a0, 3 # switch back to machine mode because code at 0x80000000 may not have clean page table entry
 | 
						|
    ecall
 | 
						|
    j done
 | 
						|
 | 
						|
 | 
						|
 | 
						|
.data
 | 
						|
 | 
						|
.align 16
 | 
						|
# root Page table situated at 0x80010000
 | 
						|
pagetable: 
 | 
						|
    .8byte 0x200044C1  # 0x00000000-0x80_00000000: PTE at 0x80011000 C1 dirty, accessed, valid
 | 
						|
    .8byte 0x00000000000010CF # misaligned terapage at 0x80_00000000
 | 
						|
 | 
						|
# next page table at 0x80011000
 | 
						|
.align 12
 | 
						|
    .8byte 0x00000000000010CF # misaligned gigapage at 0x00000000
 | 
						|
    .8byte 0x00000000200058C1 # PTE for pages at 0x40000000
 | 
						|
    .8byte 0x00000000200048C1 # gigapage at 0x80000000 pointing to 0x80120000
 | 
						|
 
 | 
						|
 | 
						|
# Next page table at 0x80012000 for gigapage at 0x80000000
 | 
						|
.align 12
 | 
						|
    .8byte 0x0000000020004CC1  # for VA starting at 80000000 (pointer to NAPOT 64 KiB pages)
 | 
						|
    .8byte 0x0000000020014CCF  # for VA starting at 80200000 (misaligned megapage)
 | 
						|
    .8byte 0x00000000200050C1  # for VA starting at 80400000 (bad PBMT pages)
 | 
						|
    .8byte 0x4000000020004CC1  # for VA starting at 80600000 (bad entry: nonleaf PTE can't have PBMT != 0)
 | 
						|
    .8byte 0x00000000200054C1  # for VA starting at 80800000 (testing rwx permissiosn with cbom/cboz)
 | 
						|
    .8byte 0x00000000200058C1  # for VA starting at 80A00000 (pointer to NAPOT 64 KiB pages like at 80000000)
 | 
						|
    .8byte 0x0000000020004CC1
 | 
						|
    .8byte 0x0000000020004CC1
 | 
						|
    .8byte 0x0000000020004CC1
 | 
						|
    .8byte 0x0000000020004CC1
 | 
						|
    .8byte 0x0000000020004CC1
 | 
						|
    .8byte 0x0000000020004CC1
 | 
						|
    .8byte 0x0000000020004CC1
 | 
						|
    .8byte 0x0000000020004CC1
 | 
						|
    .8byte 0x0000000020004CC1
 | 
						|
    .8byte 0x0000000020004CC1
 | 
						|
    .8byte 0x0000000020004CC1
 | 
						|
    .8byte 0x0000000020004CC1
 | 
						|
    .8byte 0x0000000020004CC1
 | 
						|
    .8byte 0x0000000020004CC1
 | 
						|
    .8byte 0x0000000020004CC1
 | 
						|
    .8byte 0x0000000020004CC1
 | 
						|
    .8byte 0x0000000020004CC1
 | 
						|
    .8byte 0x0000000020004CC1
 | 
						|
    .8byte 0x0000000020004CC1
 | 
						|
    .8byte 0x0000000020004CC1
 | 
						|
    .8byte 0x0000000020004CC1
 | 
						|
    .8byte 0x0000000020004CC1
 | 
						|
    .8byte 0x0000000020004CC1
 | 
						|
    .8byte 0x0000000020004CC1
 | 
						|
    .8byte 0x0000000020004CC1
 | 
						|
    .8byte 0x0000000020004CC1
 | 
						|
    .8byte 0x0000000020004CC1
 | 
						|
    .8byte 0x0000000020004CC1
 | 
						|
    .8byte 0x0000000020004CC1
 | 
						|
    .8byte 0x0000000020004CC1
 | 
						|
    .8byte 0x0000000020004CC1
 | 
						|
    .8byte 0x0000000020004CC1
 | 
						|
 | 
						|
# Leaf page table at 0x80013000 with NAPOT pages
 | 
						|
.align 12
 | 
						|
    #80000000
 | 
						|
    .8byte 0xA0000000200020CF
 | 
						|
    .8byte 0xA0000000200020CF
 | 
						|
    .8byte 0xA0000000200020CF
 | 
						|
    .8byte 0xA0000000200020CF
 | 
						|
 | 
						|
    .8byte 0xA0000000200020CF
 | 
						|
    .8byte 0xA0000000200020CF
 | 
						|
    .8byte 0xA0000000200020CF
 | 
						|
    .8byte 0xA0000000200020CF
 | 
						|
 | 
						|
    .8byte 0xA0000000200020CF
 | 
						|
    .8byte 0xA0000000200020CF
 | 
						|
    .8byte 0xA0000000200020CF
 | 
						|
    .8byte 0xA0000000200020CF
 | 
						|
 | 
						|
    .8byte 0xA0000000200020CF
 | 
						|
    .8byte 0xA0000000200020CF
 | 
						|
    .8byte 0xA0000000200020CF
 | 
						|
    .8byte 0xA0000000200020CF
 | 
						|
 | 
						|
    .8byte 0x80000000200060CF
 | 
						|
    .8byte 0x80000000200060CF
 | 
						|
    .8byte 0x80000000200060CF
 | 
						|
    .8byte 0x80000000200060CF
 | 
						|
 | 
						|
    .8byte 0x80000000200060CF
 | 
						|
    .8byte 0x80000000200060CF
 | 
						|
    .8byte 0x80000000200060CF
 | 
						|
    .8byte 0x80000000200060CF
 | 
						|
 | 
						|
    .8byte 0x80000000200060CF
 | 
						|
    .8byte 0x80000000200060CF
 | 
						|
    .8byte 0x80000000200060CF
 | 
						|
    .8byte 0x80000000200060CF
 | 
						|
 | 
						|
    .8byte 0x80000000200060CF
 | 
						|
    .8byte 0x80000000200060CF
 | 
						|
    .8byte 0x80000000200060CF
 | 
						|
    .8byte 0x80000000200060CF
 | 
						|
    
 | 
						|
    .8byte 0x800000002000A0CF
 | 
						|
    .8byte 0x800000002000A0CF
 | 
						|
    .8byte 0x800000002000A0CF
 | 
						|
    .8byte 0x800000002000A0CF
 | 
						|
 | 
						|
    .8byte 0x800000002000A0CF
 | 
						|
    .8byte 0x800000002000A0CF
 | 
						|
    .8byte 0x800000002000A0CF
 | 
						|
    .8byte 0x800000002000A0CF
 | 
						|
 | 
						|
    .8byte 0x800000002000A0CF
 | 
						|
    .8byte 0x800000002000A0CF
 | 
						|
    .8byte 0x800000002000A0CF
 | 
						|
    .8byte 0x800000002000A0CF
 | 
						|
 | 
						|
    .8byte 0x800000002000A0CF
 | 
						|
    .8byte 0x800000002000A0CF
 | 
						|
    .8byte 0x800000002000A0CF
 | 
						|
    .8byte 0x800000002000A0CF
 | 
						|
 | 
						|
    .8byte 0x800000002000E0CF
 | 
						|
    .8byte 0x800000002000E0CF
 | 
						|
    .8byte 0x800000002000E0CF
 | 
						|
    .8byte 0x800000002000E0CF
 | 
						|
 | 
						|
    .8byte 0x800000002000E0CF
 | 
						|
    .8byte 0x800000002000E0CF
 | 
						|
 | 
						|
# Leaf page table at 0x80014000 with PBMT pages
 | 
						|
.align 12
 | 
						|
    #80400000
 | 
						|
    .8byte 0x60000000200020CF   # reserved entry
 | 
						|
 | 
						|
# Leaf page table at 0x80015000 with various permissions for testing CBOM and CBOZ
 | 
						|
.align 12
 | 
						|
    #80800000
 | 
						|
    .8byte 0x00000000200000CF   # valid rwx for VA 80800000
 | 
						|
    .8byte 0x00000000200000CB   # valid r x for VA 80801000
 | 
						|
    .8byte 0x00000000200000C3   # valid r   for VA 80802000
 | 
						|
    .8byte 0x00000000200000C9   # valid   x for VA 80803000
 | 
						|
    .8byte 0x00000000200000CD   # valid  wx for VA 80804000 (illegal combination, but used to test tlbcontrol)
 | 
						|
    .8byte 0x000000002000000F   # valid rwx for VA 80805000  for covering ITLB translate and UpdateDA
 | 
						|
    .8byte 0x20000000200000CF   # PBMT=1    for VA 80806000  for covering ITLB BadPBMT
 | 
						|
 | 
						|
# Leaf page table at 0x80016000 with NAPOT pages
 | 
						|
.align 12
 | 
						|
    .8byte 0xA0000000200020CF
 | 
						|
    .8byte 0xA0000000200020CF
 | 
						|
    .8byte 0xA0000000200020CF
 | 
						|
    .8byte 0xA0000000200020CF
 |