comparison packages/hal/mips/arch/current/src/hal_syscall.c @ 208:e0c0827131d1 ecos

Merge from eCos master repository on 2002-05-20-20:11:54-BST
author jlarmour
date Mon, 20 May 2002 22:19:26 +0000
parents b939e9cada46
children d2c90368aeef
comparison
equal deleted inserted replaced
207:74c807ddde34 208:e0c0827131d1
3 // hal_syscall.c 3 // hal_syscall.c
4 // 4 //
5 // 5 //
6 // 6 //
7 //============================================================================= 7 //=============================================================================
8 //####COPYRIGHTBEGIN#### 8 //####ECOSGPLCOPYRIGHTBEGIN####
9 // 9 // -------------------------------------------
10 // ------------------------------------------- 10 // This file is part of eCos, the Embedded Configurable Operating System.
11 // The contents of this file are subject to the Red Hat eCos Public License 11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
12 // Version 1.1 (the "License"); you may not use this file except in 12 //
13 // compliance with the License. You may obtain a copy of the License at 13 // eCos is free software; you can redistribute it and/or modify it under
14 // http://www.redhat.com/ 14 // the terms of the GNU General Public License as published by the Free
15 // 15 // Software Foundation; either version 2 or (at your option) any later version.
16 // Software distributed under the License is distributed on an "AS IS" 16 //
17 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the 17 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
18 // License for the specific language governing rights and limitations under 18 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
19 // the License. 19 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
20 // 20 // for more details.
21 // The Original Code is eCos - Embedded Configurable Operating System, 21 //
22 // released September 30, 1998. 22 // You should have received a copy of the GNU General Public License along
23 // 23 // with eCos; if not, write to the Free Software Foundation, Inc.,
24 // The Initial Developer of the Original Code is Red Hat. 24 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
25 // Portions created by Red Hat are 25 //
26 // Copyright (C) 1998, 1999, 2000 Red Hat, Inc. 26 // As a special exception, if other files instantiate templates or use macros
27 // All Rights Reserved. 27 // or inline functions from this file, or you compile this file and link it
28 // ------------------------------------------- 28 // with other works to produce a work based on this file, this file does not
29 // 29 // by itself cause the resulting work to be covered by the GNU General Public
30 //####COPYRIGHTEND#### 30 // License. However the source code for this file must still be made available
31 // in accordance with section (3) of the GNU General Public License.
32 //
33 // This exception does not invalidate any other reasons why a work based on
34 // this file might be covered by the GNU General Public License.
35 //
36 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
37 // at http://sources.redhat.com/ecos/ecos-license
38 // -------------------------------------------
39 //####ECOSGPLCOPYRIGHTEND####
31 //============================================================================= 40 //=============================================================================
32 //#####DESCRIPTIONBEGIN#### 41 //#####DESCRIPTIONBEGIN####
33 // 42 //
34 // Author(s): msalter 43 // Author(s): msalter
35 // Contributors:msalter 44 // Contributors:msalter
60 #include <cyg/hal/hal_misc.h> // Helper functions 69 #include <cyg/hal/hal_misc.h> // Helper functions
61 70
62 extern CYG_ADDRWORD __do_syscall(CYG_ADDRWORD func, // syscall function number 71 extern CYG_ADDRWORD __do_syscall(CYG_ADDRWORD func, // syscall function number
63 CYG_ADDRWORD arg1, CYG_ADDRWORD arg2, // up to four args. 72 CYG_ADDRWORD arg1, CYG_ADDRWORD arg2, // up to four args.
64 CYG_ADDRWORD arg3, CYG_ADDRWORD arg4, 73 CYG_ADDRWORD arg3, CYG_ADDRWORD arg4,
65 CYG_ADDRWORD *retval); // syscall return value 74 CYG_ADDRWORD *retval, // syscall return value
75 CYG_ADDRWORD *sig); // signal to return (or 0)
66 76
67 #define SYS_exit 1 77 #define SYS_exit 1
68 #define SYS_interrupt 1000 78 #define SYS_interrupt 1000
69 79
70 int 80 int
71 hal_syscall_handler(void) 81 hal_syscall_handler(void)
72 { 82 {
73 CYG_ADDRWORD func, arg1, arg2, arg3, arg4; 83 CYG_ADDRWORD func, arg1, arg2, arg3, arg4;
74 CYG_ADDRWORD err; 84 CYG_ADDRWORD err, sig;
75 85
76 func = get_register(REG_A0); 86 func = get_register(REG_A0);
77 arg1 = get_register(REG_A1); 87 arg1 = get_register(REG_A1);
78 arg2 = get_register(REG_A2); 88 arg2 = get_register(REG_A2);
79 arg3 = get_register(REG_A3); 89 arg3 = get_register(REG_A3);
91 // A console interrupt landed us here. 101 // A console interrupt landed us here.
92 // Invoke the debug agent so as to cause a SIGINT. 102 // Invoke the debug agent so as to cause a SIGINT.
93 return SIGINT; 103 return SIGINT;
94 } 104 }
95 105
96 if (__do_syscall(func, arg1, arg2, arg3, arg4, &err)) { 106 if (__do_syscall(func, arg1, arg2, arg3, arg4, &err, &sig)) {
97 put_register(REG_V0, err); 107 put_register(REG_V0, err);
98 return 0; 108 return (int)sig;
99 } 109 }
100 110
101 return SIGTRAP; 111 return SIGTRAP;
102 } 112 }
103 113