summaryrefslogtreecommitdiff
path: root/gcc/ada
diff options
context:
space:
mode:
authorcharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>2007-10-15 13:53:30 +0000
committercharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>2007-10-15 13:53:30 +0000
commit0d5864d449195511725a88a264cf43006c3a342e (patch)
treef11d96eced9b624d50bcbf22e4859d2f37704a62 /gcc/ada
parentf9f3b518fb8494e8c911b7659d02e83e3c645f15 (diff)
downloadgcc-0d5864d449195511725a88a264cf43006c3a342e.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@129317 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ada')
-rw-r--r--gcc/ada/s-osinte-tru64.adb10
-rw-r--r--gcc/ada/s-osinte-tru64.ads22
-rw-r--r--gcc/ada/s-taprop-tru64.adb11
3 files changed, 26 insertions, 17 deletions
diff --git a/gcc/ada/s-osinte-tru64.adb b/gcc/ada/s-osinte-tru64.adb
index 3599c33495d..88cc2fdd3ec 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 5fe84b2e733..aa3eb057b43 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 975bae11f4f..35acb26ce58 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;
----------------