source: trunk/hal/tsar_mips32/core/hal_user.c

Last change on this file was 505, checked in by viala@…, 6 years ago

[hal] Fix protoypes and add headers in hal mips32 implementation.

Fix types mismatch between implementation and interface in .h.
Add header where they were absent.

File size: 2.6 KB
Line 
1/*
2 * hal_user_syscall.c - Implementation of user-side HAL API for TSAR-MIPS32.
3 *
4 * Author    Alain Greiner (2016,2017)
5 *
6 * Copyright (c) UPMC Sorbonne Universites
7 *
8 * This file is part of ALMOS-MKH.
9 *
10 * ALMOS-MKH is free software; you can redistribute it and/or modify it
11 * under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; version 2.0 of the License.
13 *
14 * ALMOS-MKH is distributed in the hope that it will be useful, but
15 * WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17 * General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with ALMOS-MKH; if not, write to the Free Software Foundation,
21 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22 */
23
24#include <hal_user.h>
25
26/////////////////////////////////////////////
27inline int hal_user_syscall( reg_t service_num,
28                             reg_t arg0,
29                             reg_t arg1,
30                             reg_t arg2,
31                             reg_t arg3 )
32{
33    register int num_and_ret __asm__("v0") = service_num;
34    register int a0          __asm__("a0") = arg0;
35    register int a1          __asm__("a1") = arg1;
36    register int a2          __asm__("a2") = arg2;
37    register int a3          __asm__("a3") = arg3;
38
39    asm volatile(
40            "syscall"
41            : "+r" (num_and_ret)
42            : "r" (a0),             
43              "r" (a1),
44              "r" (a2),
45              "r" (a3)
46            : "memory",
47              "at",
48              "v1",
49              "ra",
50              "t0",
51              "t1",
52              "t2",
53              "t3",
54              "t4",
55              "t5",
56              "t6",
57              "t7",
58              "t8",
59              "t9"
60               );
61
62    return (volatile int)num_and_ret;
63}
64
65///////////////////////////////////
66int hal_user_atomic_add( int * ptr,
67                         int   val )
68{
69        int current;
70 
71        asm volatile (
72                 ".set noreorder                             \n"       
73                 "1:                                 \n"
74                 "ll      %0,      (%1)              \n"
75                 "addu    $3,      %0,       %2      \n"
76                 "sc      $3,      (%1)              \n"
77                 "beq     $3,      $0,       1b      \n"
78                 "nop                                \n"
79                 "sync                               \n"
80                 ".set reorder                               \n"       
81                 :"=&r"(current) : "r" (ptr), "r" (val) : "$3" , "memory" );
82
83        return current;
84}
85
86/////////////////////
87void hal_user_fence( void )
88{
89        asm volatile ( "sync" );
90}
Note: See TracBrowser for help on using the repository browser.