112771Sqtt2@cornell.edu/* 212771Sqtt2@cornell.edu * Copyright (c) 2018, Cornell University 312771Sqtt2@cornell.edu * All rights reserved. 412771Sqtt2@cornell.edu * 512771Sqtt2@cornell.edu * Redistribution and use in source and binary forms, with or 612771Sqtt2@cornell.edu * without modification, are permitted provided that the following 712771Sqtt2@cornell.edu * conditions are met: 812771Sqtt2@cornell.edu * 912771Sqtt2@cornell.edu * Redistributions of source code must retain the above copyright 1012771Sqtt2@cornell.edu * notice, this list of conditions and the following disclaimer. 1112771Sqtt2@cornell.edu * 1212771Sqtt2@cornell.edu * Redistributions in binary form must reproduce the above 1312771Sqtt2@cornell.edu * copyright notice, this list of conditions and the following 1412771Sqtt2@cornell.edu * disclaimer in the documentation and/or other materials provided 1512771Sqtt2@cornell.edu * with the distribution. 1612771Sqtt2@cornell.edu * 1712771Sqtt2@cornell.edu * Neither the name of Cornell University nor the names of its 1812771Sqtt2@cornell.edu * contributors may be used to endorse or promote products derived 1912771Sqtt2@cornell.edu * from this software without specific prior written permission. 2012771Sqtt2@cornell.edu * 2112771Sqtt2@cornell.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 2212771Sqtt2@cornell.edu * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 2312771Sqtt2@cornell.edu * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 2412771Sqtt2@cornell.edu * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 2512771Sqtt2@cornell.edu * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 2612771Sqtt2@cornell.edu * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2712771Sqtt2@cornell.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2812771Sqtt2@cornell.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 2912771Sqtt2@cornell.edu * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 3012771Sqtt2@cornell.edu * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 3112771Sqtt2@cornell.edu * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 3212771Sqtt2@cornell.edu * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 3312771Sqtt2@cornell.edu * POSSIBILITY OF SUCH DAMAGE. 3412771Sqtt2@cornell.edu * 3512771Sqtt2@cornell.edu * Authors: Tuan Ta 3612771Sqtt2@cornell.edu */ 3712771Sqtt2@cornell.edu 3812771Sqtt2@cornell.edu//------------------------------------------------------------------------ 3912771Sqtt2@cornell.edu// This test_macros includes necessary functions and macros to create 4012771Sqtt2@cornell.edu// and exit threads. They're used in multi-threaded assembly tests. 4112771Sqtt2@cornell.edu// This assumes the target system can concurrently support 4 different 4212771Sqtt2@cornell.edu// threads (i.e., 1 master thread and 3 child threads) 4312771Sqtt2@cornell.edu//------------------------------------------------------------------------ 4412771Sqtt2@cornell.edu 4512771Sqtt2@cornell.edu#ifndef __TEST_MACROS_MT_H 4612771Sqtt2@cornell.edu#define __TEST_MACROS_MT_H 4712771Sqtt2@cornell.edu 4812771Sqtt2@cornell.edu#define SYSCALL_MMAP 222 4912771Sqtt2@cornell.edu#define SYSCALL_MUNMAP 215 5012771Sqtt2@cornell.edu#define SYSCALL_CLONE 220 5112771Sqtt2@cornell.edu 5212771Sqtt2@cornell.edu#define STACK_SIZE (4096 * 1024) 5312771Sqtt2@cornell.edu 5412771Sqtt2@cornell.edu#define PROT_READ 0x1 5512771Sqtt2@cornell.edu#define PROT_WRITE 0x2 5612771Sqtt2@cornell.edu#define MMAP_PROT_FLAGS (PROT_READ | PROT_WRITE) 5712771Sqtt2@cornell.edu 5812771Sqtt2@cornell.edu#define MAP_PRIVATE 0x02 5912771Sqtt2@cornell.edu#define MAP_ANONYMOUS 0x20 6012771Sqtt2@cornell.edu#define MAP_STACK 0x20000 6112771Sqtt2@cornell.edu#define MMAP_MAP_FLAGS (MAP_PRIVATE | MAP_ANONYMOUS | MAP_STACK) 6212771Sqtt2@cornell.edu 6312771Sqtt2@cornell.edu#define CLONE_VM 0x00000100 6412771Sqtt2@cornell.edu#define CLONE_FS 0x00000200 6512771Sqtt2@cornell.edu#define CLONE_FILES 0x00000400 6612771Sqtt2@cornell.edu#define CLONE_SIGHAND 0x00000800 6712771Sqtt2@cornell.edu#define CLONE_PARENT 0x00008000 6812771Sqtt2@cornell.edu#define CLONE_THREAD 0x00010000 6912771Sqtt2@cornell.edu#define CLONE_IO 0x80000000 7012771Sqtt2@cornell.edu#define CLONE_FLAGS (CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND\ 7112771Sqtt2@cornell.edu | CLONE_PARENT | CLONE_THREAD | CLONE_IO) 7212771Sqtt2@cornell.edu 7312771Sqtt2@cornell.edu#define NUM_THREADS 3 7412771Sqtt2@cornell.edu 7512771Sqtt2@cornell.edu#define FAILURE 1 7612771Sqtt2@cornell.edu#define SUCCESS 0 7712771Sqtt2@cornell.edu 7812771Sqtt2@cornell.edu#define HARTID 0xF14 7912771Sqtt2@cornell.edu 8012771Sqtt2@cornell.edu//------------------------------------------------------------------------ 8112771Sqtt2@cornell.edu// create NUM_THREADS child threads 8212771Sqtt2@cornell.edu//------------------------------------------------------------------------ 8312771Sqtt2@cornell.edu_create_threads: 8412771Sqtt2@cornell.edu li t0, NUM_THREADS 8512771Sqtt2@cornell.edu mv s0, ra // save return register 8612771Sqtt2@cornell.edu1: 8712771Sqtt2@cornell.edu jal ra, _alloc_stack 8812771Sqtt2@cornell.edu addi sp, sp, -8 8912771Sqtt2@cornell.edu sd a0, (sp) // save pointer to the new stack 9012771Sqtt2@cornell.edu jal ra, _clone_thread // clone a new thread 9112771Sqtt2@cornell.edu addi t0, t0, -1 9212771Sqtt2@cornell.edu bnez t0, 1b 9312771Sqtt2@cornell.edu mv ra, s0 // restore return register 9412771Sqtt2@cornell.edu ret 9512771Sqtt2@cornell.edu 9612771Sqtt2@cornell.edu_alloc_stack: 9712771Sqtt2@cornell.edu li a0, 0 9812771Sqtt2@cornell.edu li a1, STACK_SIZE 9912771Sqtt2@cornell.edu li a2, MMAP_PROT_FLAGS 10012771Sqtt2@cornell.edu li a3, MMAP_MAP_FLAGS 10112771Sqtt2@cornell.edu li a4, -1 10212771Sqtt2@cornell.edu li a5, 0 10312771Sqtt2@cornell.edu li a7, SYSCALL_MMAP 10412771Sqtt2@cornell.edu ecall 10512771Sqtt2@cornell.edu ret 10612771Sqtt2@cornell.edu 10712771Sqtt2@cornell.edu_clone_thread: 10812771Sqtt2@cornell.edu li a1, STACK_SIZE 10912771Sqtt2@cornell.edu add a1, a1, a0 11012771Sqtt2@cornell.edu li a0, CLONE_FLAGS 11112771Sqtt2@cornell.edu li a7, SYSCALL_CLONE 11212771Sqtt2@cornell.edu ecall 11312771Sqtt2@cornell.edu beqz a0, _mt_test 11412771Sqtt2@cornell.edu ret 11512771Sqtt2@cornell.edu 11612771Sqtt2@cornell.edu//------------------------------------------------------------------------ 11712771Sqtt2@cornell.edu// wait for all child threads to exit 11812771Sqtt2@cornell.edu//------------------------------------------------------------------------ 11912771Sqtt2@cornell.edu_join: 12012771Sqtt2@cornell.edu la t0, barrier 12112771Sqtt2@cornell.edu li t1, NUM_THREADS 12212771Sqtt2@cornell.edu1: 12312771Sqtt2@cornell.edu ld t2, (t0) 12412771Sqtt2@cornell.edu bne t1, t2, 1b 12512771Sqtt2@cornell.edu ret 12612771Sqtt2@cornell.edu 12712771Sqtt2@cornell.edu//------------------------------------------------------------------------ 12812771Sqtt2@cornell.edu// deallocate NUM_THREADS child threads 12912771Sqtt2@cornell.edu//------------------------------------------------------------------------ 13012771Sqtt2@cornell.edu_delete_threads: 13112771Sqtt2@cornell.edu li t0, NUM_THREADS 13212771Sqtt2@cornell.edu mv s0, ra // save return register 13312771Sqtt2@cornell.edu1: 13412771Sqtt2@cornell.edu ld a0, (sp) // pop the new stack's pointer 13512771Sqtt2@cornell.edu addi sp, sp, 8 13612771Sqtt2@cornell.edu jal ra, _dealloc_stack 13712771Sqtt2@cornell.edu addi t0, t0, -1 13812771Sqtt2@cornell.edu bnez t0, 1b 13912771Sqtt2@cornell.edu mv ra, s0 // restore return register 14012771Sqtt2@cornell.edu ret 14112771Sqtt2@cornell.edu 14212771Sqtt2@cornell.edu_dealloc_stack: 14312771Sqtt2@cornell.edu li a1, STACK_SIZE 14412771Sqtt2@cornell.edu li a7, SYSCALL_MUNMAP 14512771Sqtt2@cornell.edu ecall 14612771Sqtt2@cornell.edu ret 14712771Sqtt2@cornell.edu 14812771Sqtt2@cornell.edu#define MT_DATA \ 14912771Sqtt2@cornell.edu shared_var: .dword 0; \ 15012771Sqtt2@cornell.edu barrier: .dword 0; \ 15112771Sqtt2@cornell.edu array: .dword 0x00000000deadbeef, \ 15212771Sqtt2@cornell.edu 0xdeadbeefdeadbeef, \ 15312771Sqtt2@cornell.edu 0x12343eeaaf423451; \ 15412771Sqtt2@cornell.edu 15512771Sqtt2@cornell.edu#endif 156