Commit f3bc3723 by Eric Botcazou Committed by Arnaud Charlet

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
parent 488fa698
...@@ -83,7 +83,7 @@ package body System.OS_Interface is ...@@ -83,7 +83,7 @@ package body System.OS_Interface is
-- Hide_Yellow_Zone -- -- 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; type Teb_Ptr is access all pthread_teb_t;
Teb : Teb_Ptr; Teb : Teb_Ptr;
Res : Interfaces.C.int; Res : Interfaces.C.int;
...@@ -101,9 +101,13 @@ package body System.OS_Interface is ...@@ -101,9 +101,13 @@ package body System.OS_Interface is
-- Stick a guard page right above the Yellow Zone if it exists -- Stick a guard page right above the Yellow Zone if it exists
if Teb.all.stack_yellow /= Teb.all.stack_guard then if Teb.all.stack_yellow /= Teb.all.stack_guard then
if Hide then
Res := mprotect (Teb.all.stack_yellow, Get_Page_Size, PROT_ON); 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 if;
end Hide_Unhide_Yellow_Zone;
----------------- -----------------
-- To_Duration -- -- To_Duration --
......
...@@ -273,18 +273,17 @@ package System.OS_Interface is ...@@ -273,18 +273,17 @@ package System.OS_Interface is
----------- -----------
Stack_Base_Available : constant Boolean := False; 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; function Get_Stack_Base (thread : pthread_t) return Address;
pragma Inline (Get_Stack_Base); pragma Inline (Get_Stack_Base);
-- returns the stack base of the specified thread. -- Returns the stack base of the specified thread. Only call this function
-- Only call this function when Stack_Base_Available is True. -- when Stack_Base_Available is True.
function Get_Page_Size return size_t; function Get_Page_Size return size_t;
function Get_Page_Size return Address; function Get_Page_Size return Address;
pragma Import (C, Get_Page_Size, "getpagesize"); pragma Import (C, Get_Page_Size, "getpagesize");
-- returns the size of a page, or 0 if this is not relevant on this -- Returns the size of a page, or 0 if this is not relevant on this target
-- target
PROT_NONE : constant := 0; PROT_NONE : constant := 0;
PROT_READ : constant := 1; PROT_READ : constant := 1;
...@@ -298,11 +297,14 @@ package System.OS_Interface is ...@@ -298,11 +297,14 @@ package System.OS_Interface is
function mprotect (addr : Address; len : size_t; prot : int) return int; function mprotect (addr : Address; len : size_t; prot : int) return int;
pragma Import (C, mprotect); 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 -- Every thread except the initial one features an overflow warning area
-- just above the overflow guard area on the stack. They are called -- (called the Yellow Zone) which is just above the overflow guard area
-- the Yellow Zone and the Red Zone respectively. This procedure hides -- on the stack (called the Red Zone). During task execution, we want
-- the former so that the latter could be exposed to stack probing. -- 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 -- -- Nonstandard Thread Initialization --
......
...@@ -173,9 +173,11 @@ package body System.Task_Primitives.Operations is ...@@ -173,9 +173,11 @@ package body System.Task_Primitives.Operations is
pragma Unreferenced (Sig); pragma Unreferenced (Sig);
T : constant Task_Id := Self; T : constant Task_Id := Self;
Result : Interfaces.C.int;
Old_Set : aliased sigset_t; Old_Set : aliased sigset_t;
Result : Interfaces.C.int;
pragma Warnings (Off, Result);
begin begin
-- It is not safe to raise an exception when using ZCX and the GCC -- It is not safe to raise an exception when using ZCX and the GCC
-- exception handling mechanism. -- exception handling mechanism.
...@@ -720,7 +722,7 @@ package body System.Task_Primitives.Operations is ...@@ -720,7 +722,7 @@ package body System.Task_Primitives.Operations is
procedure Enter_Task (Self_ID : Task_Id) is procedure Enter_Task (Self_ID : Task_Id) is
begin begin
Hide_Yellow_Zone; Hide_Unhide_Yellow_Zone (Hide => True);
Self_ID.Common.LL.Thread := pthread_self; Self_ID.Common.LL.Thread := pthread_self;
Specific.Set (Self_ID); Specific.Set (Self_ID);
...@@ -843,8 +845,8 @@ package body System.Task_Primitives.Operations is ...@@ -843,8 +845,8 @@ package body System.Task_Primitives.Operations is
use System.Task_Info; use System.Task_Info;
begin begin
-- Account for the Yellow Zone (2 pages) and the guard page -- Account for the Yellow Zone (2 pages) and the guard page right above.
-- right above. See Hide_Yellow_Zone for the rationale. -- See Hide_Unhide_Yellow_Zone for the rationale.
Adjusted_Stack_Size := Adjusted_Stack_Size :=
Interfaces.C.size_t (Stack_Size) + 3 * Get_Page_Size; Interfaces.C.size_t (Stack_Size) + 3 * Get_Page_Size;
...@@ -1006,6 +1008,7 @@ package body System.Task_Primitives.Operations is ...@@ -1006,6 +1008,7 @@ package body System.Task_Primitives.Operations is
procedure Exit_Task is procedure Exit_Task is
begin begin
Specific.Set (null); Specific.Set (null);
Hide_Unhide_Yellow_Zone (Hide => False);
end Exit_Task; end Exit_Task;
---------------- ----------------
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment