diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2007-10-15 15:53:30 +0200 |
---|---|---|
committer | Arnaud Charlet <charlet@gcc.gnu.org> | 2007-10-15 15:53:30 +0200 |
commit | f3bc37238b942ce0e901d3bdc6c93a5b776a9a2b (patch) | |
tree | f11d96eced9b624d50bcbf22e4859d2f37704a62 /gcc | |
parent | 488fa69898ccea3bb3376a58e36bd118ef306f43 (diff) | |
download | gcc-f3bc37238b942ce0e901d3bdc6c93a5b776a9a2b.zip gcc-f3bc37238b942ce0e901d3bdc6c93a5b776a9a2b.tar.gz gcc-f3bc37238b942ce0e901d3bdc6c93a5b776a9a2b.tar.bz2 |
s-osinte-tru64.adb: (Hide_Yellow_Zone): Add On parameter.
2007-10-15 Eric Botcazou <ebotcazou@adacore.com>
* s-osinte-tru64.adb: (Hide_Yellow_Zone): Add On parameter.
Set the protection status of the guard page based on the value of On.
* s-osinte-tru64.ads: (Hide_Yellow_Zone): Add On parameter.
* s-taprop-tru64.adb: (Enter_Task): Pass True to Hide_Yellow_Zone.
(Exit_Task): Pass False to Hide_Yellow_Zone.
From-SVN: r129317
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ada/s-osinte-tru64.adb | 10 | ||||
-rw-r--r-- | gcc/ada/s-osinte-tru64.ads | 22 | ||||
-rw-r--r-- | gcc/ada/s-taprop-tru64.adb | 11 |
3 files changed, 26 insertions, 17 deletions
diff --git a/gcc/ada/s-osinte-tru64.adb b/gcc/ada/s-osinte-tru64.adb index 3599c33..88cc2fd 100644 --- a/gcc/ada/s-osinte-tru64.adb +++ b/gcc/ada/s-osinte-tru64.adb @@ -83,7 +83,7 @@ package body System.OS_Interface is -- Hide_Yellow_Zone -- ---------------------- - procedure Hide_Yellow_Zone is + procedure Hide_Unhide_Yellow_Zone (Hide : Boolean) is type Teb_Ptr is access all pthread_teb_t; Teb : Teb_Ptr; Res : Interfaces.C.int; @@ -101,9 +101,13 @@ package body System.OS_Interface is -- Stick a guard page right above the Yellow Zone if it exists if Teb.all.stack_yellow /= Teb.all.stack_guard then - Res := mprotect (Teb.all.stack_yellow, Get_Page_Size, PROT_ON); + if Hide then + Res := mprotect (Teb.all.stack_yellow, Get_Page_Size, PROT_ON); + else + Res := mprotect (Teb.all.stack_yellow, Get_Page_Size, PROT_OFF); + end if; end if; - end Hide_Yellow_Zone; + end Hide_Unhide_Yellow_Zone; ----------------- -- To_Duration -- diff --git a/gcc/ada/s-osinte-tru64.ads b/gcc/ada/s-osinte-tru64.ads index 5fe84b2..aa3eb05 100644 --- a/gcc/ada/s-osinte-tru64.ads +++ b/gcc/ada/s-osinte-tru64.ads @@ -7,7 +7,7 @@ -- S p e c -- -- -- -- Copyright (C) 1991-1994, Florida State University -- --- Copyright (C) 1995-2007, Free Software Foundation, Inc. -- +-- Copyright (C) 1995-2007, Free Software Foundation, Inc. -- -- -- -- GNARL is free software; you can redistribute it and/or modify it under -- -- terms of the GNU General Public License as published by the Free Soft- -- @@ -273,18 +273,17 @@ package System.OS_Interface is ----------- Stack_Base_Available : constant Boolean := False; - -- Indicates wether the stack base is available on this target. + -- Indicates if the stack base is available on this target function Get_Stack_Base (thread : pthread_t) return Address; pragma Inline (Get_Stack_Base); - -- returns the stack base of the specified thread. - -- Only call this function when Stack_Base_Available is True. + -- Returns the stack base of the specified thread. Only call this function + -- when Stack_Base_Available is True. function Get_Page_Size return size_t; function Get_Page_Size return Address; pragma Import (C, Get_Page_Size, "getpagesize"); - -- returns the size of a page, or 0 if this is not relevant on this - -- target + -- Returns the size of a page, or 0 if this is not relevant on this target PROT_NONE : constant := 0; PROT_READ : constant := 1; @@ -298,11 +297,14 @@ package System.OS_Interface is function mprotect (addr : Address; len : size_t; prot : int) return int; pragma Import (C, mprotect); - procedure Hide_Yellow_Zone; + procedure Hide_Unhide_Yellow_Zone (Hide : Boolean); -- Every thread except the initial one features an overflow warning area - -- just above the overflow guard area on the stack. They are called - -- the Yellow Zone and the Red Zone respectively. This procedure hides - -- the former so that the latter could be exposed to stack probing. + -- (called the Yellow Zone) which is just above the overflow guard area + -- on the stack (called the Red Zone). During task execution, we want + -- signals from the Red Zone, so we need to hide the Yellow Zone. This + -- procedure is called at the start of task execution (with Hide set True) + -- to hide the Yellow Zone, and at the end of task execution (with Hide + -- set False) to unhide the Yellow Zone. --------------------------------------- -- Nonstandard Thread Initialization -- diff --git a/gcc/ada/s-taprop-tru64.adb b/gcc/ada/s-taprop-tru64.adb index 975bae1..35acb26 100644 --- a/gcc/ada/s-taprop-tru64.adb +++ b/gcc/ada/s-taprop-tru64.adb @@ -173,9 +173,11 @@ package body System.Task_Primitives.Operations is pragma Unreferenced (Sig); T : constant Task_Id := Self; - Result : Interfaces.C.int; Old_Set : aliased sigset_t; + Result : Interfaces.C.int; + pragma Warnings (Off, Result); + begin -- It is not safe to raise an exception when using ZCX and the GCC -- exception handling mechanism. @@ -720,7 +722,7 @@ package body System.Task_Primitives.Operations is procedure Enter_Task (Self_ID : Task_Id) is begin - Hide_Yellow_Zone; + Hide_Unhide_Yellow_Zone (Hide => True); Self_ID.Common.LL.Thread := pthread_self; Specific.Set (Self_ID); @@ -843,8 +845,8 @@ package body System.Task_Primitives.Operations is use System.Task_Info; begin - -- Account for the Yellow Zone (2 pages) and the guard page - -- right above. See Hide_Yellow_Zone for the rationale. + -- Account for the Yellow Zone (2 pages) and the guard page right above. + -- See Hide_Unhide_Yellow_Zone for the rationale. Adjusted_Stack_Size := Interfaces.C.size_t (Stack_Size) + 3 * Get_Page_Size; @@ -1006,6 +1008,7 @@ package body System.Task_Primitives.Operations is procedure Exit_Task is begin Specific.Set (null); + Hide_Unhide_Yellow_Zone (Hide => False); end Exit_Task; ---------------- |