# # Lock test -- intentionally deadlocks. The test scaffolding will set a # CPU time limit to abort. If no deadlock occurs, we get the ERROR message. # TEST_LOCK_SIZE=256 DRVR_THR_STK_SZ=2048 .data .align 2 bsy_lck0: .space TEST_LOCK_SIZE .align 2 bsy_lck1: .space TEST_LOCK_SIZE .text .globl bsy_t1main bsy_t1main: sub $sp, $sp, 4 sw $ra, 4($sp) .data bsy_t1_msg1: .asciiz "t1main, about to do first acquire\n" bsy_t1_msg2: .asciiz "t1main, about to try second acquire\n" bsy_t1_msg3: .asciiz "t1main: ERROR, SHOULD HAVE DEADLOCKED\n" .text la $a0, bsy_t1_msg1 li $v0, 4 syscall la $a0, bsy_lck0 jal lock_acquire la $a0, bsy_t1_msg2 li $v0, 4 syscall la $a0, bsy_lck0 jal lock_acquire la $a0, bsy_t1_msg3 li $v0, 4 syscall lw $ra, 4($sp) add $sp, $sp, 4 jr $ra .globl bsy_t2main bsy_t2main: sub $sp, $sp, 4 sw $ra, 4($sp) # no-op, return immediately lw $ra, 4($sp) add $sp, $sp, 4 jr $ra .globl bsy_t3main bsy_t3main: sub $sp, $sp, 4 sw $ra, 4($sp) # no-op, return immediately lw $ra, 4($sp) add $sp, $sp, 4 jr $ra .globl main # # 8 + 3 * THR_STATE_SIZE + 3 * 4 * 512 # = 8 + 3 * 68 + 3 * 2048 # = 8 + 204 + 6144 # = 6356 # # fp -> t2stk -2044($fp) # t1stk -4092($fp) # t0stk -6140($fp) # t2 -6440($fp) 300 byte states # t1 -6740($fp) # t0 -7040($fp) # old-ra -7044($fp) # old-fp -7048($fp) # sp -> main: subu $sp, $sp, 7052 sw $fp, 4($sp) sw $ra, 8($sp) addu $fp, $sp, 7052 li $t0, 2048 subu $sp, $sp, 4 sw $t0, 4($sp) # push shared 4th arg la $a3, -6140($fp) li $a2, 0 la $a1, bsy_t1main la $a0, -7040($fp) jal thr_init la $a3, -4092($fp) li $a2, 1 la $a1, bsy_t2main la $a0, -6740($fp) jal thr_init la $a3, -2044($fp) li $a2, 2 la $a1, bsy_t3main la $a0, -6440($fp) jal thr_init addu $sp, $sp, 4 # pop shared 4th arg la $a0, bsy_lck0 jal lock_init la $a0, bsy_lck1 jal lock_init jal thr_go .data bsy_done_msg: .asciiz "All done!\n" .text la $a0, bsy_done_msg li $v0, 4 syscall lw $ra, -7044($fp) lw $fp, -7048($fp) addu $sp, $sp, 7052 jr $ra