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