aboutsummaryrefslogtreecommitdiff
path: root/shell
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2008-02-27 18:41:59 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2008-02-27 18:41:59 +0000
commit574f2f43948bb21d6e4187936ba5a5afccba25f6 (patch)
tree0b39aca564149e5ad30b3cc791228655ff1b1827 /shell
parentfe66a0eca1bfeae0abc0fc1e7d3709f271e05e82 (diff)
downloadbusybox-w32-574f2f43948bb21d6e4187936ba5a5afccba25f6.tar.gz
busybox-w32-574f2f43948bb21d6e4187936ba5a5afccba25f6.tar.bz2
busybox-w32-574f2f43948bb21d6e4187936ba5a5afccba25f6.zip
*: add optimization barrier to all "G trick" locations
Diffstat (limited to 'shell')
-rw-r--r--shell/Kbuild7
-rw-r--r--shell/ash.c24
-rw-r--r--shell/ash_ptr_hack.c16
-rw-r--r--shell/hush.c5
-rw-r--r--shell/msh.c2
5 files changed, 36 insertions, 18 deletions
diff --git a/shell/Kbuild b/shell/Kbuild
index 36a8ffd3a..deedc24f3 100644
--- a/shell/Kbuild
+++ b/shell/Kbuild
@@ -5,8 +5,7 @@
5# Licensed under the GPL v2, see the file LICENSE in this tarball. 5# Licensed under the GPL v2, see the file LICENSE in this tarball.
6 6
7lib-y:= 7lib-y:=
8lib-$(CONFIG_ASH) += ash.o 8lib-$(CONFIG_ASH) += ash.o ash_ptr_hack.o
9lib-$(CONFIG_HUSH) += hush.o 9lib-$(CONFIG_HUSH) += hush.o
10lib-$(CONFIG_MSH) += msh.o 10lib-$(CONFIG_MSH) += msh.o
11
12lib-$(CONFIG_CTTYHACK) += cttyhack.o 11lib-$(CONFIG_CTTYHACK) += cttyhack.o
diff --git a/shell/ash.c b/shell/ash.c
index 9c762e2ed..9b1a73024 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -202,9 +202,8 @@ struct globals_misc {
202 /* indicates specified signal received */ 202 /* indicates specified signal received */
203 char gotsig[NSIG - 1]; 203 char gotsig[NSIG - 1];
204}; 204};
205/* Make it reside in writable memory, yet make compiler understand that it is not going to change. */ 205extern struct globals_misc *const ash_ptr_to_globals_misc;
206static struct globals_misc *const ptr_to_globals_misc __attribute__ ((section (".data"))); 206#define G_misc (*ash_ptr_to_globals_misc)
207#define G_misc (*ptr_to_globals_misc)
208#define rootpid (G_misc.rootpid ) 207#define rootpid (G_misc.rootpid )
209#define shlvl (G_misc.shlvl ) 208#define shlvl (G_misc.shlvl )
210#define minusc (G_misc.minusc ) 209#define minusc (G_misc.minusc )
@@ -223,7 +222,8 @@ static struct globals_misc *const ptr_to_globals_misc __attribute__ ((section ("
223#define sigmode (G_misc.sigmode ) 222#define sigmode (G_misc.sigmode )
224#define gotsig (G_misc.gotsig ) 223#define gotsig (G_misc.gotsig )
225#define INIT_G_misc() do { \ 224#define INIT_G_misc() do { \
226 (*(struct globals_misc**)&ptr_to_globals_misc) = xzalloc(sizeof(G_misc)); \ 225 (*(struct globals_misc**)&ash_ptr_to_globals_misc) = xzalloc(sizeof(G_misc)); \
226 barrier(); \
227 curdir = nullstr; \ 227 curdir = nullstr; \
228 physdir = nullstr; \ 228 physdir = nullstr; \
229} while (0) 229} while (0)
@@ -1147,9 +1147,8 @@ struct globals_memstack {
1147 int herefd; // = -1; 1147 int herefd; // = -1;
1148 struct stack_block stackbase; 1148 struct stack_block stackbase;
1149}; 1149};
1150/* Make it reside in writable memory, yet make compiler understand that it is not going to change. */ 1150extern struct globals_memstack *const ash_ptr_to_globals_memstack;
1151static struct globals_memstack *const ptr_to_globals_memstack __attribute__ ((section (".data"))); 1151#define G_memstack (*ash_ptr_to_globals_memstack)
1152#define G_memstack (*ptr_to_globals_memstack)
1153#define g_stackp (G_memstack.g_stackp ) 1152#define g_stackp (G_memstack.g_stackp )
1154#define markp (G_memstack.markp ) 1153#define markp (G_memstack.markp )
1155#define g_stacknxt (G_memstack.g_stacknxt ) 1154#define g_stacknxt (G_memstack.g_stacknxt )
@@ -1158,7 +1157,8 @@ static struct globals_memstack *const ptr_to_globals_memstack __attribute__ ((se
1158#define herefd (G_memstack.herefd ) 1157#define herefd (G_memstack.herefd )
1159#define stackbase (G_memstack.stackbase ) 1158#define stackbase (G_memstack.stackbase )
1160#define INIT_G_memstack() do { \ 1159#define INIT_G_memstack() do { \
1161 (*(struct globals_memstack**)&ptr_to_globals_memstack) = xzalloc(sizeof(G_memstack)); \ 1160 (*(struct globals_memstack**)&ash_ptr_to_globals_memstack) = xzalloc(sizeof(G_memstack)); \
1161 barrier(); \
1162 g_stackp = &stackbase; \ 1162 g_stackp = &stackbase; \
1163 g_stacknxt = stackbase.space; \ 1163 g_stacknxt = stackbase.space; \
1164 g_stacknleft = MINSIZE; \ 1164 g_stacknleft = MINSIZE; \
@@ -1778,9 +1778,8 @@ struct globals_var {
1778 struct var *vartab[VTABSIZE]; 1778 struct var *vartab[VTABSIZE];
1779 struct var varinit[ARRAY_SIZE(varinit_data)]; 1779 struct var varinit[ARRAY_SIZE(varinit_data)];
1780}; 1780};
1781/* Make it reside in writable memory, yet make compiler understand that it is not going to change. */ 1781extern struct globals_var *const ash_ptr_to_globals_var;
1782static struct globals_var *const ptr_to_globals_var __attribute__ ((section (".data"))); 1782#define G_var (*ash_ptr_to_globals_var)
1783#define G_var (*ptr_to_globals_var)
1784#define shellparam (G_var.shellparam ) 1783#define shellparam (G_var.shellparam )
1785#define redirlist (G_var.redirlist ) 1784#define redirlist (G_var.redirlist )
1786#define g_nullredirs (G_var.g_nullredirs ) 1785#define g_nullredirs (G_var.g_nullredirs )
@@ -1789,7 +1788,8 @@ static struct globals_var *const ptr_to_globals_var __attribute__ ((section (".d
1789#define varinit (G_var.varinit ) 1788#define varinit (G_var.varinit )
1790#define INIT_G_var() do { \ 1789#define INIT_G_var() do { \
1791 int i; \ 1790 int i; \
1792 (*(struct globals_var**)&ptr_to_globals_var) = xzalloc(sizeof(G_var)); \ 1791 (*(struct globals_var**)&ash_ptr_to_globals_var) = xzalloc(sizeof(G_var)); \
1792 barrier(); \
1793 for (i = 0; i < ARRAY_SIZE(varinit_data); i++) { \ 1793 for (i = 0; i < ARRAY_SIZE(varinit_data); i++) { \
1794 varinit[i].flags = varinit_data[i].flags; \ 1794 varinit[i].flags = varinit_data[i].flags; \
1795 varinit[i].text = varinit_data[i].text; \ 1795 varinit[i].text = varinit_data[i].text; \
diff --git a/shell/ash_ptr_hack.c b/shell/ash_ptr_hack.c
new file mode 100644
index 000000000..490b73b6d
--- /dev/null
+++ b/shell/ash_ptr_hack.c
@@ -0,0 +1,16 @@
1/* vi: set sw=4 ts=4: */
2/*
3 * Copyright (C) 2008 by Denys Vlasenko <vda.linux@googlemail.com>
4 *
5 * Licensed under GPLv2, see file LICENSE in this tarball for details.
6 */
7
8/* We cheat here. They are declared as const ptr in ash.c,
9 * but here we make them live in R/W memory */
10struct globals_misc;
11struct globals_memstack;
12struct globals_var;
13
14struct globals_misc *ash_ptr_to_globals_misc;
15struct globals_memstack *ash_ptr_to_globals_memstack;
16struct globals_var *ash_ptr_to_globals_var;
diff --git a/shell/hush.c b/shell/hush.c
index d9ef2390e..b44f35bdd 100644
--- a/shell/hush.c
+++ b/shell/hush.c
@@ -460,6 +460,9 @@ enum { run_list_level = 0 };
460#endif 460#endif
461#define charmap (G.charmap ) 461#define charmap (G.charmap )
462#define user_input_buf (G.user_input_buf ) 462#define user_input_buf (G.user_input_buf )
463#define INIT_G() do { \
464 SET_PTR_TO_GLOBALS(xzalloc(sizeof(G))); \
465} while (0)
463 466
464 467
465#define B_CHUNK 100 468#define B_CHUNK 100
@@ -3778,7 +3781,7 @@ int hush_main(int argc, char **argv)
3778 char **e; 3781 char **e;
3779 struct variable *cur_var; 3782 struct variable *cur_var;
3780 3783
3781 PTR_TO_GLOBALS = xzalloc(sizeof(G)); 3784 INIT_G();
3782 3785
3783 /* Deal with HUSH_VERSION */ 3786 /* Deal with HUSH_VERSION */
3784 shell_ver = const_shell_ver; /* copying struct here */ 3787 shell_ver = const_shell_ver; /* copying struct here */
diff --git a/shell/msh.c b/shell/msh.c
index 917b08a1e..569011bbd 100644
--- a/shell/msh.c
+++ b/shell/msh.c
@@ -705,7 +705,7 @@ struct globals {
705#define child_cmd (G.child_cmd ) 705#define child_cmd (G.child_cmd )
706#define iostack (G.iostack ) 706#define iostack (G.iostack )
707#define INIT_G() do { \ 707#define INIT_G() do { \
708 PTR_TO_GLOBALS = xzalloc(sizeof(G)); \ 708 SET_PTR_TO_GLOBALS(xzalloc(sizeof(G))); \
709 global_env.linep = line; \ 709 global_env.linep = line; \
710 global_env.iobase = iostack; \ 710 global_env.iobase = iostack; \
711 global_env.iop = iostack - 1; \ 711 global_env.iop = iostack - 1; \