Compare commits
444 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
270dd28b51 | ||
|
|
85c936a6cb | ||
|
|
bfff009f7c | ||
|
|
a1fef219ad | ||
|
|
6f9fef2b13 | ||
|
|
cc1d39e55d | ||
|
|
fd8bed670e | ||
|
|
24a3b236a0 | ||
|
|
27e55b8cf1 | ||
|
|
70e52faf36 | ||
|
|
8db36c3828 | ||
|
|
06dd71a7e0 | ||
|
|
01fe83dcb3 | ||
|
|
c86d168165 | ||
|
|
a032dc3d1b | ||
|
|
201fa7fb55 | ||
|
|
dd676f7149 | ||
|
|
a751e96b1a | ||
|
|
c3bfa3f6a9 | ||
|
|
1e1fa4f70d | ||
|
|
39f9d7fdff | ||
|
|
3e3ccf377c | ||
|
|
13e71ac9dc | ||
|
|
b1681f4a3a | ||
|
|
1226e692d9 | ||
|
|
73ea4b1ce9 | ||
|
|
09f663c246 | ||
|
|
9b77630c8b | ||
|
|
b70d470e20 | ||
|
|
ecc850dfef | ||
|
|
b11377f2e9 | ||
|
|
ed1edb152b | ||
|
|
28c434a230 | ||
|
|
daa234d8b9 | ||
|
|
e803698618 | ||
|
|
c862b29d65 | ||
|
|
dd58d366c3 | ||
|
|
ab284b0531 | ||
|
|
42b9b31606 | ||
|
|
29c5c68761 | ||
|
|
38c08a6663 | ||
|
|
57258e7f59 | ||
|
|
8c33c92720 | ||
|
|
a269d96978 | ||
|
|
2910818f06 | ||
|
|
3df82d61ce | ||
|
|
159092c58e | ||
|
|
60011718d2 | ||
|
|
7e342751a2 | ||
|
|
c23bc8d401 | ||
|
|
5e760db417 | ||
|
|
e4da71010c | ||
|
|
c25fb2aa39 | ||
|
|
b51886421e | ||
|
|
22c6c5c736 | ||
|
|
cd00fc3a78 | ||
|
|
00a34a8ba3 | ||
|
|
8900c2cec5 | ||
|
|
fca02ee248 | ||
|
|
781a69617b | ||
|
|
04d4145b3e | ||
|
|
96aab7e215 | ||
|
|
98ee584ab6 | ||
|
|
6b031c5472 | ||
|
|
e42c414454 | ||
|
|
e613483bee | ||
|
|
c0271f4727 | ||
|
|
4969762f15 | ||
|
|
09d3648e43 | ||
|
|
4e905cd412 | ||
|
|
8c11daf726 | ||
|
|
5cb8a1f10f | ||
|
|
dbba7dea18 | ||
|
|
b6ab5911b7 | ||
|
|
b0d7f890d0 | ||
|
|
b9c0cdddab | ||
|
|
7ee7dd5e2c | ||
|
|
07db4a80a7 | ||
|
|
f04e5c24ab | ||
|
|
b8bacdd2de | ||
|
|
a121ffc785 | ||
|
|
88f9693390 | ||
|
|
124ec580a0 | ||
|
|
af7f61db49 | ||
|
|
ee299b5780 | ||
|
|
c60a778c8d | ||
|
|
25a129ea6a | ||
|
|
8e9924c523 | ||
|
|
c71291a429 | ||
|
|
ba93b83d68 | ||
|
|
c2f41ca9ad | ||
|
|
062d7ecae3 | ||
|
|
58d038fcac | ||
|
|
510310342c | ||
|
|
a6198f267b | ||
|
|
5e78bd85ab | ||
|
|
85c0c8a01f | ||
|
|
e29f579061 | ||
|
|
63703589e5 | ||
|
|
5c8c1986b5 | ||
|
|
e4370d235c | ||
|
|
31ac007cb5 | ||
|
|
56da7e2de9 | ||
|
|
35300e7b4f | ||
|
|
439dc0928b | ||
|
|
4b3e58fd3d | ||
|
|
b7cdbd6c42 | ||
|
|
77f5cac2bf | ||
|
|
9102b176c4 | ||
|
|
bb4317beaf | ||
|
|
d24b7585b7 | ||
|
|
4438f994dc | ||
|
|
52afbbbc98 | ||
|
|
460917c4a0 | ||
|
|
7803468afe | ||
|
|
8f2c7d2265 | ||
|
|
c6c3a84a46 | ||
|
|
5a7ca14fcc | ||
|
|
d7b882855a | ||
|
|
2337832e4c | ||
|
|
be635ceb19 | ||
|
|
0b0b7b03d7 | ||
|
|
82914c6a2e | ||
|
|
f127dfdf1e | ||
|
|
567dcd3846 | ||
|
|
b080e0f301 | ||
|
|
ff383d96ba | ||
|
|
0bcd3d5de3 | ||
|
|
9d6e0319f7 | ||
|
|
0e50eb44a9 | ||
|
|
2db69d0f24 | ||
|
|
a697f5e98d | ||
|
|
4439b04d9f | ||
|
|
38c3b2358a | ||
|
|
221ce34da2 | ||
|
|
4246d41007 | ||
|
|
65df9c8084 | ||
|
|
7836aa0136 | ||
|
|
1cf7fad15a | ||
|
|
0076e1f5e0 | ||
|
|
cae6b9f154 | ||
|
|
5fcbfa2eb5 | ||
|
|
9a20cfaefb | ||
|
|
f57b0c5d4f | ||
|
|
0fdeb254b3 | ||
|
|
895a8c4099 | ||
|
|
e531ee626e | ||
|
|
94d093f058 | ||
|
|
9b8424523a | ||
|
|
ebc702624b | ||
|
|
ea125cb58c | ||
|
|
689a799bb9 | ||
|
|
802b1ac14b | ||
|
|
affe3e9010 | ||
|
|
0b2169964a | ||
|
|
f18d1f5383 | ||
|
|
ea35954613 | ||
|
|
61a942acdc | ||
|
|
c4b4b7222e | ||
|
|
21af0351d1 | ||
|
|
1e1c91962e | ||
|
|
b1aa94d417 | ||
|
|
a6a9bac5b7 | ||
|
|
240a23a21b | ||
|
|
d5108dba80 | ||
|
|
20368dd317 | ||
|
|
b93e14f695 | ||
|
|
3e3f3c5590 | ||
|
|
e8f8660b73 | ||
|
|
794684985f | ||
|
|
625607e6db | ||
|
|
05afa8b6dd | ||
|
|
6cf89076dc | ||
|
|
29a658716b | ||
|
|
a7c9988aeb | ||
|
|
d4fa953975 | ||
|
|
786649d2a3 | ||
|
|
d7416c6f79 | ||
|
|
cb1522ca92 | ||
|
|
14660a10c3 | ||
|
|
1387c9687b | ||
|
|
ec99adde4a | ||
|
|
c716e87c53 | ||
|
|
d898f18293 | ||
|
|
bc0759e2dc | ||
|
|
1aa429d4f5 | ||
|
|
1543119139 | ||
|
|
0a0a78ac2e | ||
|
|
6999d0a3f9 | ||
|
|
f01a883971 | ||
|
|
3185334c1c | ||
|
|
bc887aab44 | ||
|
|
6f7c428a34 | ||
|
|
68c702d024 | ||
|
|
97273adcc5 | ||
|
|
ad2cb6375a | ||
|
|
6df4bd8f8c | ||
|
|
0994c3300e | ||
|
|
a5c3e48843 | ||
|
|
df2c993721 | ||
|
|
dc8d6b740c | ||
|
|
c2e1b8d694 | ||
|
|
f6d8138e05 | ||
|
|
9d587dcbe8 | ||
|
|
eb675818c7 | ||
|
|
3ce7763715 | ||
|
|
fd429ecc5b | ||
|
|
ed7f5abc28 | ||
|
|
79e5026f01 | ||
|
|
a1b50051ed | ||
|
|
9a79920ef9 | ||
|
|
141fa5120e | ||
|
|
699cb4f88c | ||
|
|
bc3e6ded65 | ||
|
|
eae5c40f60 | ||
|
|
0c7384f980 | ||
|
|
67ebcca74d | ||
|
|
3d365b0d7a | ||
|
|
94e96927a6 | ||
|
|
3636c8e7e4 | ||
|
|
b920da5103 | ||
|
|
f1a40a409f | ||
|
|
4ce4c9f264 | ||
|
|
e770a22fa5 | ||
|
|
9bb8076dc0 | ||
|
|
229b041320 | ||
|
|
e1f204de4a | ||
|
|
c6cc0bf07a | ||
|
|
04e54ead5d | ||
|
|
992705d465 | ||
|
|
ae09d979b6 | ||
|
|
14d819eff4 | ||
|
|
1cbe389879 | ||
|
|
0758f6254e | ||
|
|
db732a245c | ||
|
|
08f2840f7d | ||
|
|
521bdc6181 | ||
|
|
e7b6a3472b | ||
|
|
11756d96ef | ||
|
|
f185be06eb | ||
|
|
854bc85602 | ||
|
|
ab8fe0bbbf | ||
|
|
b87c06cbcb | ||
|
|
b939ca9370 | ||
|
|
ec202a1ca9 | ||
|
|
d4471df94e | ||
|
|
a6ac4acf40 | ||
|
|
8ff754c466 | ||
|
|
90dba00742 | ||
|
|
86ae1380e4 | ||
|
|
9bb48186e6 | ||
|
|
139123dc12 | ||
|
|
6602cf442c | ||
|
|
f148863586 | ||
|
|
ec375da27a | ||
|
|
c50e7c1029 | ||
|
|
5f4dbb2c71 | ||
|
|
328609269b | ||
|
|
056fdb2633 | ||
|
|
09d0a59e22 | ||
|
|
511555c8cb | ||
|
|
81699345cc | ||
|
|
130751ff66 | ||
|
|
f3d18eb9de | ||
|
|
249bda4aef | ||
|
|
aaa246f86f | ||
|
|
c52f7a5b49 | ||
|
|
90a34f54c9 | ||
|
|
bfb5080b71 | ||
|
|
641dfed37e | ||
|
|
4572e6be3f | ||
|
|
12e44050c9 | ||
|
|
d5190990f5 | ||
|
|
82822b1f16 | ||
|
|
7f02889f76 | ||
|
|
9dc86869d8 | ||
|
|
02bb127007 | ||
|
|
c26c4aba4f | ||
|
|
e8d8ad60c2 | ||
|
|
a7f645f7df | ||
|
|
73731d2a0d | ||
|
|
0f049c5ed7 | ||
|
|
8d5f95de04 | ||
|
|
88fca2c0df | ||
|
|
81d18e35dd | ||
|
|
309da8fc53 | ||
|
|
535e3f3af6 | ||
|
|
4c80dca479 | ||
|
|
7bef1f5117 | ||
|
|
bb8c8355c2 | ||
|
|
fab0641813 | ||
|
|
ce3af4734a | ||
|
|
e2dea4e9f8 | ||
|
|
0d9c1df75a | ||
|
|
6a979cf4b8 | ||
|
|
c107d1fdf9 | ||
|
|
bc89a51e00 | ||
|
|
9da9e755fa | ||
|
|
fe42481d6f | ||
|
|
b1ea6eb82a | ||
|
|
8c2e20c3aa | ||
|
|
65667709a8 | ||
|
|
51bc5fd61f | ||
|
|
3b277b2354 | ||
|
|
3e4c9bdd90 | ||
|
|
06b1b4f8ab | ||
|
|
7b4de6e6c2 | ||
|
|
1c266f4849 | ||
|
|
b7a7281195 | ||
|
|
b77732fb4f | ||
|
|
a224bf648a | ||
|
|
642520f80c | ||
|
|
5cb75b00c7 | ||
|
|
7dd0d1137f | ||
|
|
cb2fe29f06 | ||
|
|
3432f46d8b | ||
|
|
afcf1a24aa | ||
|
|
140f813d77 | ||
|
|
7ad6f9595c | ||
|
|
1796c20b88 | ||
|
|
0da5b76916 | ||
|
|
4ac1efae6c | ||
|
|
523a066245 | ||
|
|
98df469d29 | ||
|
|
f46287a711 | ||
|
|
c260b5c6f3 | ||
|
|
c9157f273f | ||
|
|
840acd6021 | ||
|
|
c949a894c6 | ||
|
|
228f8f8533 | ||
|
|
8ee9eca74e | ||
|
|
748429fc92 | ||
|
|
a9dfcd9a89 | ||
|
|
559fc9746c | ||
|
|
54169bc3ea | ||
|
|
142e923222 | ||
|
|
86efc86945 | ||
|
|
ebaafa95d8 | ||
|
|
b8ee144e67 | ||
|
|
722ae0e7d5 | ||
|
|
f56e087208 | ||
|
|
f55f01cc11 | ||
|
|
1fa398cfab | ||
|
|
8123cc413e | ||
|
|
d4459cf9f3 | ||
|
|
4bb65494e9 | ||
|
|
2f2b3cdc6f | ||
|
|
1e9f9d9809 | ||
|
|
1b25379c02 | ||
|
|
38bbb4e390 | ||
|
|
0fa88f513f | ||
|
|
cd54c5983a | ||
|
|
6084faeecd | ||
|
|
d209c00a30 | ||
|
|
9a5d5feb9c | ||
|
|
0cda763f95 | ||
|
|
cc7be46b7d | ||
|
|
589504dc33 | ||
|
|
bf2f38051b | ||
|
|
2d2d0af6fb | ||
|
|
7f47dc78a1 | ||
|
|
c3c9187ed5 | ||
|
|
aebacb243e | ||
|
|
5a8d1f09e8 | ||
|
|
0e10b6d1ee | ||
|
|
d649d6fc2d | ||
|
|
bad487cc07 | ||
|
|
3b6056fb1a | ||
|
|
5cc738d6bd | ||
|
|
c9fa445f54 | ||
|
|
d273a2f58b | ||
|
|
4e7069d499 | ||
|
|
66f44e77af | ||
|
|
35f908b75c | ||
|
|
2f0089dfb9 | ||
|
|
2af6d5115a | ||
|
|
ac25c5e1e7 | ||
|
|
90c0355d90 | ||
|
|
43230eb623 | ||
|
|
f18dc8428d | ||
|
|
ab53c8e0a4 | ||
|
|
6c33e236d7 | ||
|
|
85d36f1469 | ||
|
|
0ecf31d896 | ||
|
|
08a625cc0d | ||
|
|
12840601e1 | ||
|
|
2ae6883a8b | ||
|
|
d5629606c5 | ||
|
|
285059e504 | ||
|
|
5b6d0a887c | ||
|
|
3573b8649e | ||
|
|
d7523cdd84 | ||
|
|
5753db5846 | ||
|
|
2d7cb0af89 | ||
|
|
1cb9b435a9 | ||
|
|
43ecf06e83 | ||
|
|
51982de36b | ||
|
|
0a22320a3c | ||
|
|
8813e890c5 | ||
|
|
e664ffba18 | ||
|
|
3bd0137c25 | ||
|
|
4f2b4aa402 | ||
|
|
682cd34b74 | ||
|
|
2bc4d06a48 | ||
|
|
4f2c1e07c1 | ||
|
|
77bb3038d3 | ||
|
|
931448a94d | ||
|
|
c51bbbabc6 | ||
|
|
2ddc52e1a4 | ||
|
|
3c93958c48 | ||
|
|
9763c40f64 | ||
|
|
3bf77446cc | ||
|
|
c3dfb1663d | ||
|
|
217dd9c1e5 | ||
|
|
d4cd756a91 | ||
|
|
b894619d1b | ||
|
|
b962da700b | ||
|
|
196379854b | ||
|
|
d213efac79 | ||
|
|
38910fe13d | ||
|
|
4d4279121b | ||
|
|
99da5b6484 | ||
|
|
6b60dee890 | ||
|
|
dd08a3151e | ||
|
|
e1442bf12b | ||
|
|
86f297ddc4 | ||
|
|
823b222af9 | ||
|
|
9c25eb8ef2 | ||
|
|
665eead78b | ||
|
|
f8ef43c77d | ||
|
|
8f4afe410f | ||
|
|
da9bb421cc | ||
|
|
1e89796d3e | ||
|
|
a1a2900606 | ||
|
|
79b977ac06 | ||
|
|
37e3118df6 | ||
|
|
be4d84c0c1 | ||
|
|
c43c1b640a | ||
|
|
e294db7e53 | ||
|
|
df3f388e09 | ||
|
|
a2fbe99b60 | ||
|
|
9c847c0a8f | ||
|
|
58c1fd4512 | ||
|
|
dae9a5ff13 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,3 +1,4 @@
|
|||||||
|
*~
|
||||||
*.o
|
*.o
|
||||||
*.elf
|
*.elf
|
||||||
*.bin
|
*.bin
|
||||||
|
|||||||
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
[submodule "ihk"]
|
||||||
|
path = ihk
|
||||||
|
url = https://github.com/RIKEN-SysSoft/ihk.git
|
||||||
75
Makefile.in
75
Makefile.in
@@ -4,13 +4,21 @@ INCDIR = @INCDIR@
|
|||||||
ETCDIR = @ETCDIR@
|
ETCDIR = @ETCDIR@
|
||||||
MANDIR = @MANDIR@
|
MANDIR = @MANDIR@
|
||||||
|
|
||||||
all::
|
all: executer-mcctrl executer-mcoverlayfs executer-user mckernel mck-tools
|
||||||
@(cd executer/kernel/mcctrl; make modules)
|
|
||||||
@(cd executer/kernel/mcoverlayfs; make modules)
|
executer-mcctrl:
|
||||||
@(cd executer/user; make)
|
+@(cd executer/kernel/mcctrl; $(MAKE) modules)
|
||||||
@case "$(TARGET)" in \
|
|
||||||
|
executer-mcoverlayfs:
|
||||||
|
+@(cd executer/kernel/mcoverlayfs; $(MAKE) modules)
|
||||||
|
|
||||||
|
executer-user:
|
||||||
|
+@(cd executer/user; $(MAKE))
|
||||||
|
|
||||||
|
mckernel:
|
||||||
|
+@case "$(TARGET)" in \
|
||||||
attached-mic | builtin-x86 | builtin-mic | smp-x86 | smp-arm64) \
|
attached-mic | builtin-x86 | builtin-mic | smp-x86 | smp-arm64) \
|
||||||
(cd kernel; make) \
|
(cd kernel; $(MAKE)) \
|
||||||
;; \
|
;; \
|
||||||
*) \
|
*) \
|
||||||
echo "unknown target $(TARGET)" >&2 \
|
echo "unknown target $(TARGET)" >&2 \
|
||||||
@@ -18,13 +26,16 @@ all::
|
|||||||
;; \
|
;; \
|
||||||
esac
|
esac
|
||||||
|
|
||||||
install::
|
mck-tools:
|
||||||
@(cd executer/kernel/mcctrl; make install)
|
+@(cd tools/mcstat; $(MAKE))
|
||||||
@(cd executer/kernel/mcoverlayfs; make install)
|
|
||||||
@(cd executer/user; make install)
|
install:
|
||||||
|
@(cd executer/kernel/mcctrl; $(MAKE) install)
|
||||||
|
@(cd executer/kernel/mcoverlayfs; $(MAKE) install)
|
||||||
|
@(cd executer/user; $(MAKE) install)
|
||||||
@case "$(TARGET)" in \
|
@case "$(TARGET)" in \
|
||||||
attached-mic | builtin-x86 | builtin-mic | smp-x86 | smp-arm64) \
|
attached-mic | builtin-x86 | builtin-mic | smp-x86 | smp-arm64) \
|
||||||
(cd kernel; make install) \
|
(cd kernel; $(MAKE) install) \
|
||||||
;; \
|
;; \
|
||||||
*) \
|
*) \
|
||||||
echo "unknown target $(TARGET)" >&2 \
|
echo "unknown target $(TARGET)" >&2 \
|
||||||
@@ -32,51 +43,39 @@ install::
|
|||||||
;; \
|
;; \
|
||||||
esac
|
esac
|
||||||
@case "$(TARGET)" in \
|
@case "$(TARGET)" in \
|
||||||
attached-mic) \
|
|
||||||
mkdir -p -m 755 $(SBINDIR); \
|
|
||||||
install -m 755 arch/x86/tools/mcreboot-attached-mic.sh $(SBINDIR)/mcreboot; \
|
|
||||||
install -m 755 arch/x86/tools/mcshutdown-attached-mic.sh $(SBINDIR)/mcshutdown; \
|
|
||||||
mkdir -p -m 755 $(MANDIR)/man1; \
|
|
||||||
install -m 644 arch/x86/tools/mcreboot.1 $(MANDIR)/man1/mcreboot.1; \
|
|
||||||
;; \
|
|
||||||
builtin-x86) \
|
|
||||||
mkdir -p -m 755 $(SBINDIR); \
|
|
||||||
install -m 755 arch/x86/tools/mcreboot-builtin-x86.sh $(SBINDIR)/mcreboot; \
|
|
||||||
install -m 755 arch/x86/tools/mcshutdown-builtin-x86.sh $(SBINDIR)/mcshutdown; \
|
|
||||||
mkdir -p -m 755 $(MANDIR)/man1; \
|
|
||||||
install -m 644 arch/x86/tools/mcreboot.1 $(MANDIR)/man1/mcreboot.1; \
|
|
||||||
;; \
|
|
||||||
smp-x86 | smp-arm64) \
|
smp-x86 | smp-arm64) \
|
||||||
mkdir -p -m 755 $(SBINDIR); \
|
mkdir -p -m 755 $(SBINDIR); \
|
||||||
install -m 755 arch/x86/tools/mcreboot-smp-x86.sh $(SBINDIR)/mcreboot.sh; \
|
install -m 755 arch/x86_64/tools/mcreboot-smp-x86.sh $(SBINDIR)/mcreboot.sh; \
|
||||||
install -m 755 arch/x86/tools/mcstop+release-smp-x86.sh $(SBINDIR)/mcstop+release.sh; \
|
install -m 755 arch/x86_64/tools/mcstop+release-smp-x86.sh $(SBINDIR)/mcstop+release.sh; \
|
||||||
install -m 600 arch/x86/tools/mcoverlay-destroy-smp-x86.sh $(SBINDIR)/mcoverlay-destroy.sh; \
|
install -m 755 arch/x86_64/tools/mcoverlay-destroy-smp-x86.sh $(SBINDIR)/mcoverlay-destroy.sh; \
|
||||||
install -m 600 arch/x86/tools/mcoverlay-create-smp-x86.sh $(SBINDIR)/mcoverlay-create.sh; \
|
install -m 755 arch/x86_64/tools/mcoverlay-create-smp-x86.sh $(SBINDIR)/mcoverlay-create.sh; \
|
||||||
install -m 755 arch/x86/tools/eclair-dump-backtrace.exp $(SBINDIR)/eclair-dump-backtrace.exp;\
|
install -m 755 arch/x86_64/tools/eclair-dump-backtrace.exp $(SBINDIR)/eclair-dump-backtrace.exp;\
|
||||||
mkdir -p -m 755 $(ETCDIR); \
|
mkdir -p -m 755 $(ETCDIR); \
|
||||||
install -m 644 arch/x86/tools/irqbalance_mck.service $(ETCDIR)/irqbalance_mck.service; \
|
install -m 644 arch/x86_64/tools/irqbalance_mck.service $(ETCDIR)/irqbalance_mck.service; \
|
||||||
install -m 644 arch/x86/tools/irqbalance_mck.in $(ETCDIR)/irqbalance_mck.in; \
|
install -m 644 arch/x86_64/tools/irqbalance_mck.in $(ETCDIR)/irqbalance_mck.in; \
|
||||||
mkdir -p -m 755 $(INCDIR); \
|
mkdir -p -m 755 $(INCDIR); \
|
||||||
install -m 644 kernel/include/swapfmt.h $(INCDIR); \
|
install -m 644 kernel/include/swapfmt.h $(INCDIR); \
|
||||||
mkdir -p -m 755 $(MANDIR)/man1; \
|
mkdir -p -m 755 $(MANDIR)/man1; \
|
||||||
install -m 644 arch/x86/tools/mcreboot.1 $(MANDIR)/man1/mcreboot.1; \
|
install -m 644 arch/x86_64/tools/mcreboot.1 $(MANDIR)/man1/mcreboot.1; \
|
||||||
;; \
|
;; \
|
||||||
*) \
|
*) \
|
||||||
echo "unknown target $(TARGET)" >&2 \
|
echo "unknown target $(TARGET)" >&2 \
|
||||||
exit 1 \
|
exit 1 \
|
||||||
;; \
|
;; \
|
||||||
esac
|
esac
|
||||||
|
@(cd tools/mcstat/; $(MAKE) install)
|
||||||
|
|
||||||
clean::
|
clean:
|
||||||
@(cd executer/kernel/mcctrl; make clean)
|
@(cd executer/kernel/mcctrl; $(MAKE) clean)
|
||||||
@(cd executer/kernel/mcoverlayfs; make clean)
|
@(cd executer/kernel/mcoverlayfs; $(MAKE) clean)
|
||||||
@(cd executer/user; make clean)
|
@(cd executer/user; $(MAKE) clean)
|
||||||
@case "$(TARGET)" in \
|
@case "$(TARGET)" in \
|
||||||
attached-mic | builtin-x86 | builtin-mic | smp-x86 | smp-arm64) \
|
attached-mic | builtin-x86 | builtin-mic | smp-x86 | smp-arm64) \
|
||||||
(cd kernel; make clean) \
|
(cd kernel; $(MAKE) clean) \
|
||||||
;; \
|
;; \
|
||||||
*) \
|
*) \
|
||||||
echo "unknown target $(TARGET)" >&2 \
|
echo "unknown target $(TARGET)" >&2 \
|
||||||
exit 1 \
|
exit 1 \
|
||||||
;; \
|
;; \
|
||||||
esac
|
esac
|
||||||
|
@(cd tools/mcstat; $(MAKE) clean)
|
||||||
|
|||||||
@@ -30,6 +30,7 @@
|
|||||||
#include <debug-monitors.h>
|
#include <debug-monitors.h>
|
||||||
#include <sysreg.h>
|
#include <sysreg.h>
|
||||||
#include <cpufeature.h>
|
#include <cpufeature.h>
|
||||||
|
#include <debug.h>
|
||||||
#ifdef POSTK_DEBUG_ARCH_DEP_65
|
#ifdef POSTK_DEBUG_ARCH_DEP_65
|
||||||
#include <hwcap.h>
|
#include <hwcap.h>
|
||||||
#endif /* POSTK_DEBUG_ARCH_DEP_65 */
|
#endif /* POSTK_DEBUG_ARCH_DEP_65 */
|
||||||
@@ -39,16 +40,10 @@
|
|||||||
#include "postk_print_sysreg.c"
|
#include "postk_print_sysreg.c"
|
||||||
|
|
||||||
#ifdef DEBUG_PRINT_CPU
|
#ifdef DEBUG_PRINT_CPU
|
||||||
#define dkprintf kprintf
|
#undef DDEBUG_DEFAULT
|
||||||
#define ekprintf kprintf
|
#define DDEBUG_DEFAULT DDEBUG_PRINT
|
||||||
#else
|
|
||||||
#define dkprintf(...) do { if (0) kprintf(__VA_ARGS__); } while (0)
|
|
||||||
#define ekprintf kprintf
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define BUG_ON(condition) do { if (condition) { kprintf("PANIC: %s: %s(line:%d)\n",\
|
|
||||||
__FILE__, __FUNCTION__, __LINE__); panic(""); } } while(0)
|
|
||||||
|
|
||||||
struct cpuinfo_arm64 cpuinfo_data[NR_CPUS]; /* index is logical cpuid */
|
struct cpuinfo_arm64 cpuinfo_data[NR_CPUS]; /* index is logical cpuid */
|
||||||
static unsigned int per_cpu_timer_val[NR_CPUS] = { 0 };
|
static unsigned int per_cpu_timer_val[NR_CPUS] = { 0 };
|
||||||
|
|
||||||
@@ -590,6 +585,8 @@ static void show_context_stack(struct pt_regs *regs)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ihk_mc_debug_show_interrupt_context(regs);
|
||||||
|
|
||||||
sp = (uintptr_t)regs + sizeof(*regs);
|
sp = (uintptr_t)regs + sizeof(*regs);
|
||||||
stack_top = ALIGN_UP(sp, (uintptr_t)KERNEL_STACK_SIZE);
|
stack_top = ALIGN_UP(sp, (uintptr_t)KERNEL_STACK_SIZE);
|
||||||
max_loop = (stack_top - sp) / min_stack_frame_size;
|
max_loop = (stack_top - sp) / min_stack_frame_size;
|
||||||
@@ -1170,8 +1167,6 @@ void arch_clone_thread(struct thread *othread, unsigned long pc,
|
|||||||
asm("mrs %0, tpidr_el0" : "=r" (tls));
|
asm("mrs %0, tpidr_el0" : "=r" (tls));
|
||||||
othread->tlsblock_base = nthread->tlsblock_base = tls;
|
othread->tlsblock_base = nthread->tlsblock_base = tls;
|
||||||
|
|
||||||
/* copy fp_regs values from parent. */
|
|
||||||
save_fp_regs(othread);
|
|
||||||
if ((othread->fp_regs != NULL) && (check_and_allocate_fp_regs(nthread) == 0)) {
|
if ((othread->fp_regs != NULL) && (check_and_allocate_fp_regs(nthread) == 0)) {
|
||||||
memcpy(nthread->fp_regs, othread->fp_regs, sizeof(fp_regs_struct));
|
memcpy(nthread->fp_regs, othread->fp_regs, sizeof(fp_regs_struct));
|
||||||
}
|
}
|
||||||
@@ -1205,6 +1200,10 @@ void ihk_mc_delay_us(int us)
|
|||||||
arch_delay(us);
|
arch_delay(us);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void arch_print_stack()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void arch_show_interrupt_context(const void *reg)
|
void arch_show_interrupt_context(const void *reg)
|
||||||
{
|
{
|
||||||
const struct pt_regs *regs = (struct pt_regs *)reg;
|
const struct pt_regs *regs = (struct pt_regs *)reg;
|
||||||
@@ -1279,7 +1278,6 @@ int ihk_mc_interrupt_cpu(int cpu, int vector)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef POSTK_DEBUG_ARCH_DEP_22
|
|
||||||
/*
|
/*
|
||||||
* @ref.impl linux-linaro/arch/arm64/kernel/process.c::tls_thread_switch()
|
* @ref.impl linux-linaro/arch/arm64/kernel/process.c::tls_thread_switch()
|
||||||
*/
|
*/
|
||||||
@@ -1305,14 +1303,13 @@ struct thread *arch_switch_context(struct thread *prev, struct thread *next)
|
|||||||
extern void perf_start(struct mc_perf_event *event);
|
extern void perf_start(struct mc_perf_event *event);
|
||||||
extern void perf_reset(struct mc_perf_event *event);
|
extern void perf_reset(struct mc_perf_event *event);
|
||||||
struct thread *last;
|
struct thread *last;
|
||||||
#ifdef POSTK_DEBUG_TEMP_FIX_41 /* early to wait4() wakeup for ptrace, fix. */
|
|
||||||
struct mcs_rwlock_node_irqsave lock;
|
struct mcs_rwlock_node_irqsave lock;
|
||||||
#endif /* POSTK_DEBUG_TEMP_FIX_41 */
|
|
||||||
|
|
||||||
/* Set up new TLS.. */
|
/* Set up new TLS.. */
|
||||||
dkprintf("[%d] arch_switch_context: tlsblock_base: 0x%lX\n",
|
dkprintf("[%d] arch_switch_context: tlsblock_base: 0x%lX\n",
|
||||||
ihk_mc_get_processor_id(), next->tlsblock_base);
|
ihk_mc_get_processor_id(), next->tlsblock_base);
|
||||||
|
|
||||||
|
#ifdef ENABLE_PERF
|
||||||
/* Performance monitoring inherit */
|
/* Performance monitoring inherit */
|
||||||
if(next->proc->monitoring_event) {
|
if(next->proc->monitoring_event) {
|
||||||
if(next->proc->perf_status == PP_RESET)
|
if(next->proc->perf_status == PP_RESET)
|
||||||
@@ -1322,10 +1319,10 @@ struct thread *arch_switch_context(struct thread *prev, struct thread *next)
|
|||||||
perf_start(next->proc->monitoring_event);
|
perf_start(next->proc->monitoring_event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif /*ENABLE_PERF*/
|
||||||
if (likely(prev)) {
|
if (likely(prev)) {
|
||||||
tls_thread_switch(prev, next);
|
tls_thread_switch(prev, next);
|
||||||
|
|
||||||
#ifdef POSTK_DEBUG_TEMP_FIX_41 /* early to wait4() wakeup for ptrace, fix. */
|
|
||||||
mcs_rwlock_writer_lock(&prev->proc->update_lock, &lock);
|
mcs_rwlock_writer_lock(&prev->proc->update_lock, &lock);
|
||||||
if (prev->proc->status & (PS_DELAY_STOPPED | PS_DELAY_TRACED)) {
|
if (prev->proc->status & (PS_DELAY_STOPPED | PS_DELAY_TRACED)) {
|
||||||
switch (prev->proc->status) {
|
switch (prev->proc->status) {
|
||||||
@@ -1339,11 +1336,12 @@ struct thread *arch_switch_context(struct thread *prev, struct thread *next)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
mcs_rwlock_writer_unlock(&prev->proc->update_lock, &lock);
|
mcs_rwlock_writer_unlock(&prev->proc->update_lock, &lock);
|
||||||
|
|
||||||
|
/* Wake up the parent who tried wait4 and sleeping */
|
||||||
waitq_wakeup(&prev->proc->parent->waitpid_q);
|
waitq_wakeup(&prev->proc->parent->waitpid_q);
|
||||||
} else {
|
} else {
|
||||||
mcs_rwlock_writer_unlock(&prev->proc->update_lock, &lock);
|
mcs_rwlock_writer_unlock(&prev->proc->update_lock, &lock);
|
||||||
}
|
}
|
||||||
#endif /* POSTK_DEBUG_TEMP_FIX_41 */
|
|
||||||
|
|
||||||
last = ihk_mc_switch_context(&prev->ctx, &next->ctx, prev);
|
last = ihk_mc_switch_context(&prev->ctx, &next->ctx, prev);
|
||||||
}
|
}
|
||||||
@@ -1353,7 +1351,6 @@ struct thread *arch_switch_context(struct thread *prev, struct thread *next)
|
|||||||
|
|
||||||
return last;
|
return last;
|
||||||
}
|
}
|
||||||
#endif /* POSTK_DEBUG_ARCH_DEP_22 */
|
|
||||||
|
|
||||||
/*@
|
/*@
|
||||||
@ requires \valid(thread);
|
@ requires \valid(thread);
|
||||||
@@ -1428,8 +1425,14 @@ save_fp_regs(struct thread *thread)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void copy_fp_regs(struct thread *from, struct thread *to)
|
||||||
clear_fp_regs(struct thread *thread)
|
{
|
||||||
|
if ((from->fp_regs != NULL) && (check_and_allocate_fp_regs(to) == 0)) {
|
||||||
|
memcpy(to->fp_regs, from->fp_regs, sizeof(fp_regs_struct));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void clear_fp_regs(void)
|
||||||
{
|
{
|
||||||
if (likely(elf_hwcap & (HWCAP_FP | HWCAP_ASIMD))) {
|
if (likely(elf_hwcap & (HWCAP_FP | HWCAP_ASIMD))) {
|
||||||
#ifdef CONFIG_ARM64_SVE
|
#ifdef CONFIG_ARM64_SVE
|
||||||
@@ -1466,7 +1469,7 @@ restore_fp_regs(struct thread *thread)
|
|||||||
if (likely(elf_hwcap & (HWCAP_FP | HWCAP_ASIMD))) {
|
if (likely(elf_hwcap & (HWCAP_FP | HWCAP_ASIMD))) {
|
||||||
if (!thread->fp_regs) {
|
if (!thread->fp_regs) {
|
||||||
// only clear fpregs.
|
// only clear fpregs.
|
||||||
clear_fp_regs(thread);
|
clear_fp_regs();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
thread_fpsimd_load(thread);
|
thread_fpsimd_load(thread);
|
||||||
@@ -1499,7 +1502,6 @@ unhandled_page_fault(struct thread *thread, void *fault_addr, void *regs)
|
|||||||
const uintptr_t address = (uintptr_t)fault_addr;
|
const uintptr_t address = (uintptr_t)fault_addr;
|
||||||
struct process_vm *vm = thread->vm;
|
struct process_vm *vm = thread->vm;
|
||||||
struct vm_range *range;
|
struct vm_range *range;
|
||||||
char found;
|
|
||||||
unsigned long irqflags;
|
unsigned long irqflags;
|
||||||
unsigned long error = 0;
|
unsigned long error = 0;
|
||||||
|
|
||||||
@@ -1513,17 +1515,12 @@ unhandled_page_fault(struct thread *thread, void *fault_addr, void *regs)
|
|||||||
(error & PF_RSVD ? "was" : "wasn't"),
|
(error & PF_RSVD ? "was" : "wasn't"),
|
||||||
(error & PF_INSTR ? "was" : "wasn't"));
|
(error & PF_INSTR ? "was" : "wasn't"));
|
||||||
|
|
||||||
found = 0;
|
range = lookup_process_memory_range(vm, address, address+1);
|
||||||
list_for_each_entry(range, &vm->vm_range_list, list) {
|
if (range) {
|
||||||
if (range->start <= address && range->end > address) {
|
__kprintf("address is in range, flag: 0x%lx\n",
|
||||||
found = 1;
|
range->flag);
|
||||||
__kprintf("address is in range, flag: 0x%lx\n",
|
ihk_mc_pt_print_pte(vm->address_space->page_table, (void*)address);
|
||||||
range->flag);
|
} else {
|
||||||
ihk_mc_pt_print_pte(vm->address_space->page_table, (void*)address);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!found) {
|
|
||||||
__kprintf("address is out of range! \n");
|
__kprintf("address is out of range! \n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,20 +9,16 @@
|
|||||||
#include <prctl.h>
|
#include <prctl.h>
|
||||||
#include <cpufeature.h>
|
#include <cpufeature.h>
|
||||||
#include <kmalloc.h>
|
#include <kmalloc.h>
|
||||||
|
#include <debug.h>
|
||||||
|
#include <process.h>
|
||||||
|
|
||||||
//#define DEBUG_PRINT_FPSIMD
|
//#define DEBUG_PRINT_FPSIMD
|
||||||
|
|
||||||
#ifdef DEBUG_PRINT_FPSIMD
|
#ifdef DEBUG_PRINT_FPSIMD
|
||||||
#define dkprintf kprintf
|
#undef DDEBUG_DEFAULT
|
||||||
#define ekprintf kprintf
|
#define DDEBUG_DEFAULT DDEBUG_PRINT
|
||||||
#else
|
|
||||||
#define dkprintf(...) do { if (0) kprintf(__VA_ARGS__); } while (0)
|
|
||||||
#define ekprintf kprintf
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define BUG_ON(condition) do { if (condition) { kprintf("PANIC: %s: %s(line:%d)\n",\
|
|
||||||
__FILE__, __FUNCTION__, __LINE__); panic(""); } } while(0)
|
|
||||||
|
|
||||||
#ifdef CONFIG_ARM64_SVE
|
#ifdef CONFIG_ARM64_SVE
|
||||||
|
|
||||||
/* Maximum supported vector length across all CPUs (initially poisoned) */
|
/* Maximum supported vector length across all CPUs (initially poisoned) */
|
||||||
@@ -73,9 +69,6 @@ static int get_nr_threads(struct process *proc)
|
|||||||
return nr_threads;
|
return nr_threads;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern void save_fp_regs(struct thread *thread);
|
|
||||||
extern void clear_fp_regs(struct thread *thread);
|
|
||||||
extern void restore_fp_regs(struct thread *thread);
|
|
||||||
/* @ref.impl arch/arm64/kernel/fpsimd.c::sve_set_vector_length */
|
/* @ref.impl arch/arm64/kernel/fpsimd.c::sve_set_vector_length */
|
||||||
int sve_set_vector_length(struct thread *thread,
|
int sve_set_vector_length(struct thread *thread,
|
||||||
unsigned long vl, unsigned long flags)
|
unsigned long vl, unsigned long flags)
|
||||||
@@ -129,7 +122,7 @@ int sve_set_vector_length(struct thread *thread,
|
|||||||
/* for self at prctl syscall */
|
/* for self at prctl syscall */
|
||||||
if (thread == cpu_local_var(current)) {
|
if (thread == cpu_local_var(current)) {
|
||||||
save_fp_regs(thread);
|
save_fp_regs(thread);
|
||||||
clear_fp_regs(thread);
|
clear_fp_regs();
|
||||||
thread_sve_to_fpsimd(thread, &fp_regs);
|
thread_sve_to_fpsimd(thread, &fp_regs);
|
||||||
sve_free(thread);
|
sve_free(thread);
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
#include <process.h>
|
#include <process.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <elfcore.h>
|
#include <elfcore.h>
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
#define align32(x) ((((x) + 3) / 4) * 4)
|
#define align32(x) ((((x) + 3) / 4) * 4)
|
||||||
#define alignpage(x) ((((x) + (PAGE_SIZE) - 1) / (PAGE_SIZE)) * (PAGE_SIZE))
|
#define alignpage(x) ((((x) + (PAGE_SIZE) - 1) / (PAGE_SIZE)) * (PAGE_SIZE))
|
||||||
@@ -14,11 +15,8 @@
|
|||||||
//#define DEBUG_PRINT_GENCORE
|
//#define DEBUG_PRINT_GENCORE
|
||||||
|
|
||||||
#ifdef DEBUG_PRINT_GENCORE
|
#ifdef DEBUG_PRINT_GENCORE
|
||||||
#define dkprintf(...) kprintf(__VA_ARGS__)
|
#undef DDEBUG_DEFAULT
|
||||||
#define ekprintf(...) kprintf(__VA_ARGS__)
|
#define DDEBUG_DEFAULT DDEBUG_PRINT
|
||||||
#else
|
|
||||||
#define dkprintf(...) do { if (0) kprintf(__VA_ARGS__); } while (0)
|
|
||||||
#define ekprintf(...) kprintf(__VA_ARGS__)
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -221,7 +219,7 @@ int gencore(struct thread *thread, void *regs,
|
|||||||
Elf64_Ehdr eh;
|
Elf64_Ehdr eh;
|
||||||
Elf64_Phdr *ph = NULL;
|
Elf64_Phdr *ph = NULL;
|
||||||
void *note = NULL;
|
void *note = NULL;
|
||||||
struct vm_range *range;
|
struct vm_range *range, *next;
|
||||||
struct process_vm *vm = thread->vm;
|
struct process_vm *vm = thread->vm;
|
||||||
int segs = 1; /* the first one is for NOTE */
|
int segs = 1; /* the first one is for NOTE */
|
||||||
int notesize, phsize, alignednotesize;
|
int notesize, phsize, alignednotesize;
|
||||||
@@ -235,7 +233,10 @@ int gencore(struct thread *thread, void *regs,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
list_for_each_entry(range, &vm->vm_range_list, list) {
|
next = lookup_process_memory_range(vm, 0, -1);
|
||||||
|
while ((range = next)) {
|
||||||
|
next = next_process_memory_range(vm, range);
|
||||||
|
|
||||||
dkprintf("start:%lx end:%lx flag:%lx objoff:%lx\n",
|
dkprintf("start:%lx end:%lx flag:%lx objoff:%lx\n",
|
||||||
range->start, range->end, range->flag, range->objoff);
|
range->start, range->end, range->flag, range->objoff);
|
||||||
/* We omit reserved areas because they are only for
|
/* We omit reserved areas because they are only for
|
||||||
@@ -323,7 +324,10 @@ int gencore(struct thread *thread, void *regs,
|
|||||||
|
|
||||||
/* program header for each memory chunk */
|
/* program header for each memory chunk */
|
||||||
i = 1;
|
i = 1;
|
||||||
list_for_each_entry(range, &vm->vm_range_list, list) {
|
next = lookup_process_memory_range(vm, 0, -1);
|
||||||
|
while ((range = next)) {
|
||||||
|
next = next_process_memory_range(vm, range);
|
||||||
|
|
||||||
unsigned long flag = range->flag;
|
unsigned long flag = range->flag;
|
||||||
unsigned long size = range->end - range->start;
|
unsigned long size = range->end - range->start;
|
||||||
|
|
||||||
@@ -364,7 +368,10 @@ int gencore(struct thread *thread, void *regs,
|
|||||||
dkprintf("coretable[2]: %lx@%lx(%lx)\n", ct[2].len, ct[2].addr, note);
|
dkprintf("coretable[2]: %lx@%lx(%lx)\n", ct[2].len, ct[2].addr, note);
|
||||||
|
|
||||||
i = 3; /* memory segments */
|
i = 3; /* memory segments */
|
||||||
list_for_each_entry(range, &vm->vm_range_list, list) {
|
next = lookup_process_memory_range(vm, 0, -1);
|
||||||
|
while ((range = next)) {
|
||||||
|
next = next_process_memory_range(vm, range);
|
||||||
|
|
||||||
unsigned long phys;
|
unsigned long phys;
|
||||||
|
|
||||||
if (range->flag & VR_RESERVED)
|
if (range->flag & VR_RESERVED)
|
||||||
|
|||||||
@@ -134,4 +134,12 @@ futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int get_futex_value_locked(uint32_t *dest, uint32_t *from)
|
||||||
|
{
|
||||||
|
|
||||||
|
*dest = *(volatile uint32_t *)from;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* !__HEADER_ARM64_COMMON_ARCH_FUTEX_H */
|
#endif /* !__HEADER_ARM64_COMMON_ARCH_FUTEX_H */
|
||||||
|
|||||||
@@ -6,6 +6,8 @@
|
|||||||
|
|
||||||
#include <ihk/cpu.h>
|
#include <ihk/cpu.h>
|
||||||
#include <ihk/atomic.h>
|
#include <ihk/atomic.h>
|
||||||
|
#include "affinity.h"
|
||||||
|
#include <lwk/compiler.h>
|
||||||
|
|
||||||
//#define DEBUG_SPINLOCK
|
//#define DEBUG_SPINLOCK
|
||||||
//#define DEBUG_MCS_RWLOCK
|
//#define DEBUG_MCS_RWLOCK
|
||||||
@@ -152,6 +154,8 @@ typedef struct mcs_lock_node {
|
|||||||
unsigned long irqsave;
|
unsigned long irqsave;
|
||||||
} __attribute__((aligned(64))) mcs_lock_node_t;
|
} __attribute__((aligned(64))) mcs_lock_node_t;
|
||||||
|
|
||||||
|
typedef mcs_lock_node_t mcs_lock_t;
|
||||||
|
|
||||||
static void mcs_lock_init(struct mcs_lock_node *node)
|
static void mcs_lock_init(struct mcs_lock_node *node)
|
||||||
{
|
{
|
||||||
node->locked = 0;
|
node->locked = 0;
|
||||||
@@ -602,4 +606,16 @@ __mcs_rwlock_reader_unlock(struct mcs_rwlock_lock *lock, struct mcs_rwlock_node_
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int irqflags_can_interrupt(unsigned long flags)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_HAS_NMI
|
||||||
|
#warning irqflags_can_interrupt needs testing/fixing on such a target
|
||||||
|
return flags > ICC_PMR_EL1_MASKED;
|
||||||
|
#else
|
||||||
|
// PSTATE.DAIF I bit clear means interrupt is possible
|
||||||
|
return !(flags & (1 << 7));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif /* !__HEADER_ARM64_COMMON_ARCH_LOCK_H */
|
#endif /* !__HEADER_ARM64_COMMON_ARCH_LOCK_H */
|
||||||
|
|||||||
@@ -215,7 +215,7 @@ static const unsigned int PTL1_ENTRIES = __PTL1_ENTRIES;
|
|||||||
#define PAGE_P2ALIGN 0
|
#define PAGE_P2ALIGN 0
|
||||||
#define page_offset(addr) __page_offset(addr, PAGE_SIZE)
|
#define page_offset(addr) __page_offset(addr, PAGE_SIZE)
|
||||||
#define page_align(addr) __page_align(addr, PAGE_SIZE)
|
#define page_align(addr) __page_align(addr, PAGE_SIZE)
|
||||||
#define page_align_up(addr) __page_align_up((addr, PAGE_SIZE)
|
#define page_align_up(addr) __page_align_up(addr, PAGE_SIZE)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* large page
|
* large page
|
||||||
@@ -263,6 +263,8 @@ static const unsigned int PTL1_ENTRIES = __PTL1_ENTRIES;
|
|||||||
|
|
||||||
#define PTE_FILEOFF PTE_SPECIAL
|
#define PTE_FILEOFF PTE_SPECIAL
|
||||||
|
|
||||||
|
#define PT_ENTRIES (PAGE_SIZE >> 3)
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
#include <ihk/types.h>
|
#include <ihk/types.h>
|
||||||
|
|||||||
@@ -35,38 +35,4 @@ void arm64_disable_pmu(void);
|
|||||||
int armv8pmu_init(struct arm_pmu* cpu_pmu);
|
int armv8pmu_init(struct arm_pmu* cpu_pmu);
|
||||||
|
|
||||||
/* TODO[PMU]: 共通部に定義があっても良い。今後の動向を見てここの定義を削除する */
|
/* TODO[PMU]: 共通部に定義があっても良い。今後の動向を見てここの定義を削除する */
|
||||||
/*
|
|
||||||
* Generalized hardware cache events:
|
|
||||||
*
|
|
||||||
* { L1-D, L1-I, LLC, ITLB, DTLB, BPU, NODE } x
|
|
||||||
* { read, write, prefetch } x
|
|
||||||
* { accesses, misses }
|
|
||||||
*/
|
|
||||||
enum perf_hw_cache_id {
|
|
||||||
PERF_COUNT_HW_CACHE_L1D = 0,
|
|
||||||
PERF_COUNT_HW_CACHE_L1I = 1,
|
|
||||||
PERF_COUNT_HW_CACHE_LL = 2,
|
|
||||||
PERF_COUNT_HW_CACHE_DTLB = 3,
|
|
||||||
PERF_COUNT_HW_CACHE_ITLB = 4,
|
|
||||||
PERF_COUNT_HW_CACHE_BPU = 5,
|
|
||||||
PERF_COUNT_HW_CACHE_NODE = 6,
|
|
||||||
|
|
||||||
PERF_COUNT_HW_CACHE_MAX, /* non-ABI */
|
|
||||||
};
|
|
||||||
|
|
||||||
enum perf_hw_cache_op_id {
|
|
||||||
PERF_COUNT_HW_CACHE_OP_READ = 0,
|
|
||||||
PERF_COUNT_HW_CACHE_OP_WRITE = 1,
|
|
||||||
PERF_COUNT_HW_CACHE_OP_PREFETCH = 2,
|
|
||||||
|
|
||||||
PERF_COUNT_HW_CACHE_OP_MAX, /* non-ABI */
|
|
||||||
};
|
|
||||||
|
|
||||||
enum perf_hw_cache_op_result_id {
|
|
||||||
PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0,
|
|
||||||
PERF_COUNT_HW_CACHE_RESULT_MISS = 1,
|
|
||||||
|
|
||||||
PERF_COUNT_HW_CACHE_RESULT_MAX, /* non-ABI */
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -25,6 +25,8 @@
|
|||||||
#define smp_rmb() dmb(ishld)
|
#define smp_rmb() dmb(ishld)
|
||||||
#define smp_wmb() dmb(ishst)
|
#define smp_wmb() dmb(ishst)
|
||||||
|
|
||||||
|
#define arch_barrier() smp_mb()
|
||||||
|
|
||||||
#define smp_store_release(p, v) \
|
#define smp_store_release(p, v) \
|
||||||
do { \
|
do { \
|
||||||
compiletime_assert_atomic_type(*p); \
|
compiletime_assert_atomic_type(*p); \
|
||||||
|
|||||||
34
arch/arm64/kernel/include/arch_rusage.h
Normal file
34
arch/arm64/kernel/include/arch_rusage.h
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
#ifndef ARCH_RUSAGE_H_INCLUDED
|
||||||
|
#define ARCH_RUSAGE_H_INCLUDED
|
||||||
|
|
||||||
|
#include <arch-memory.h>
|
||||||
|
|
||||||
|
//#define DEBUG_RUSAGE
|
||||||
|
|
||||||
|
extern struct rusage_global *rusage;
|
||||||
|
|
||||||
|
#define IHK_OS_PGSIZE_4KB 0
|
||||||
|
#define IHK_OS_PGSIZE_16KB 1
|
||||||
|
#define IHK_OS_PGSIZE_64KB 2
|
||||||
|
|
||||||
|
static inline int rusage_pgsize_to_pgtype(size_t pgsize)
|
||||||
|
{
|
||||||
|
int ret = IHK_OS_PGSIZE_4KB;
|
||||||
|
switch (pgsize) {
|
||||||
|
case __PTL1_SIZE:
|
||||||
|
ret = IHK_OS_PGSIZE_4KB;
|
||||||
|
break;
|
||||||
|
case __PTL2_SIZE:
|
||||||
|
ret = IHK_OS_PGSIZE_16KB;
|
||||||
|
break;
|
||||||
|
case __PTL3_SIZE:
|
||||||
|
ret = IHK_OS_PGSIZE_64KB;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
kprintf("%s: Error: Unknown pgsize=%ld\n", __FUNCTION__, pgsize);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* !defined(ARCH_RUSAGE_H_INCLUDED) */
|
||||||
@@ -6,6 +6,8 @@
|
|||||||
|
|
||||||
#if defined(CONFIG_HAS_NMI)
|
#if defined(CONFIG_HAS_NMI)
|
||||||
#include <arm-gic-v3.h>
|
#include <arm-gic-v3.h>
|
||||||
|
#else /* defined(CONFIG_HAS_NMI) */
|
||||||
|
#include <sysreg.h>
|
||||||
#endif /* defined(CONFIG_HAS_NMI) */
|
#endif /* defined(CONFIG_HAS_NMI) */
|
||||||
|
|
||||||
#if defined(CONFIG_HAS_NMI)
|
#if defined(CONFIG_HAS_NMI)
|
||||||
|
|||||||
@@ -35,6 +35,8 @@
|
|||||||
#define MIDR_IMPLEMENTOR(midr) \
|
#define MIDR_IMPLEMENTOR(midr) \
|
||||||
(((midr) & MIDR_IMPLEMENTOR_MASK) >> MIDR_IMPLEMENTOR_SHIFT)
|
(((midr) & MIDR_IMPLEMENTOR_MASK) >> MIDR_IMPLEMENTOR_SHIFT)
|
||||||
|
|
||||||
|
#define ARM_CPU_IMP_CAVIUM 0x43
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
static unsigned int read_cpuid_id(void)
|
static unsigned int read_cpuid_id(void)
|
||||||
|
|||||||
@@ -73,6 +73,7 @@ static inline void pt_regs_write_reg(struct pt_regs *regs, int r,
|
|||||||
#define ihk_mc_syscall_arg5(uc) (uc)->regs[5]
|
#define ihk_mc_syscall_arg5(uc) (uc)->regs[5]
|
||||||
|
|
||||||
#define ihk_mc_syscall_ret(uc) (uc)->regs[0]
|
#define ihk_mc_syscall_ret(uc) (uc)->regs[0]
|
||||||
|
#define ihk_mc_syscall_number(uc) (uc)->regs[8]
|
||||||
|
|
||||||
#define ihk_mc_syscall_pc(uc) (uc)->pc
|
#define ihk_mc_syscall_pc(uc) (uc)->pc
|
||||||
#define ihk_mc_syscall_sp(uc) (uc)->sp
|
#define ihk_mc_syscall_sp(uc) (uc)->sp
|
||||||
|
|||||||
@@ -9,6 +9,11 @@
|
|||||||
#define _NSIG_BPW 64
|
#define _NSIG_BPW 64
|
||||||
#define _NSIG_WORDS (_NSIG / _NSIG_BPW)
|
#define _NSIG_WORDS (_NSIG / _NSIG_BPW)
|
||||||
|
|
||||||
|
static inline int valid_signal(unsigned long sig)
|
||||||
|
{
|
||||||
|
return sig <= _NSIG ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
typedef unsigned long int __sigset_t;
|
typedef unsigned long int __sigset_t;
|
||||||
#define __sigmask(sig) (((__sigset_t) 1) << ((sig) - 1))
|
#define __sigmask(sig) (((__sigset_t) 1) << ((sig) - 1))
|
||||||
|
|
||||||
|
|||||||
@@ -114,14 +114,18 @@ SYSCALL_HANDLED(236, get_mempolicy)
|
|||||||
SYSCALL_HANDLED(237, set_mempolicy)
|
SYSCALL_HANDLED(237, set_mempolicy)
|
||||||
SYSCALL_HANDLED(238, migrate_pages)
|
SYSCALL_HANDLED(238, migrate_pages)
|
||||||
SYSCALL_HANDLED(239, move_pages)
|
SYSCALL_HANDLED(239, move_pages)
|
||||||
|
#ifdef PERF_ENABLE
|
||||||
SYSCALL_HANDLED(241, perf_event_open)
|
SYSCALL_HANDLED(241, perf_event_open)
|
||||||
|
#endif // PERF_ENABLE
|
||||||
SYSCALL_HANDLED(260, wait4)
|
SYSCALL_HANDLED(260, wait4)
|
||||||
SYSCALL_HANDLED(270, process_vm_readv)
|
SYSCALL_HANDLED(270, process_vm_readv)
|
||||||
SYSCALL_HANDLED(271, process_vm_writev)
|
SYSCALL_HANDLED(271, process_vm_writev)
|
||||||
|
#ifdef PERF_ENABLE
|
||||||
SYSCALL_HANDLED(601, pmc_init)
|
SYSCALL_HANDLED(601, pmc_init)
|
||||||
SYSCALL_HANDLED(602, pmc_start)
|
SYSCALL_HANDLED(602, pmc_start)
|
||||||
SYSCALL_HANDLED(603, pmc_stop)
|
SYSCALL_HANDLED(603, pmc_stop)
|
||||||
SYSCALL_HANDLED(604, pmc_reset)
|
SYSCALL_HANDLED(604, pmc_reset)
|
||||||
|
#endif // PERF_ENABLE
|
||||||
SYSCALL_HANDLED(700, get_cpu_id)
|
SYSCALL_HANDLED(700, get_cpu_id)
|
||||||
#ifdef PROFILE_ENABLE
|
#ifdef PROFILE_ENABLE
|
||||||
SYSCALL_HANDLED(__NR_profile, profile)
|
SYSCALL_HANDLED(__NR_profile, profile)
|
||||||
@@ -144,5 +148,3 @@ SYSCALL_HANDLED(1045, signalfd)
|
|||||||
SYSCALL_DELEGATED(1049, stat)
|
SYSCALL_DELEGATED(1049, stat)
|
||||||
SYSCALL_DELEGATED(1060, getpgrp)
|
SYSCALL_DELEGATED(1060, getpgrp)
|
||||||
SYSCALL_DELEGATED(1062, time)
|
SYSCALL_DELEGATED(1062, time)
|
||||||
SYSCALL_HANDLED(1071, vfork)
|
|
||||||
SYSCALL_DELEGATED(1079, fork)
|
|
||||||
|
|||||||
@@ -7,15 +7,13 @@
|
|||||||
#include <arch/cpu.h>
|
#include <arch/cpu.h>
|
||||||
#include <memory.h>
|
#include <memory.h>
|
||||||
#include <syscall.h>
|
#include <syscall.h>
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
// #define DEBUG_GICV2
|
// #define DEBUG_GICV2
|
||||||
|
|
||||||
#ifdef DEBUG_GICV2
|
#ifdef DEBUG_GICV2
|
||||||
#define dkprintf(...) kprintf(__VA_ARGS__)
|
#undef DDEBUG_DEFAULT
|
||||||
#define ekprintf(...) kprintf(__VA_ARGS__)
|
#define DDEBUG_DEFAULT DDEBUG_PRINT
|
||||||
#else
|
|
||||||
#define dkprintf(...)
|
|
||||||
#define ekprintf(...) kprintf(__VA_ARGS__)
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void *dist_base;
|
void *dist_base;
|
||||||
|
|||||||
@@ -7,15 +7,19 @@
|
|||||||
#include <cputype.h>
|
#include <cputype.h>
|
||||||
#include <process.h>
|
#include <process.h>
|
||||||
#include <syscall.h>
|
#include <syscall.h>
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
//#define DEBUG_GICV3
|
//#define DEBUG_GICV3
|
||||||
|
|
||||||
|
#define USE_CAVIUM_THUNDER_X
|
||||||
|
|
||||||
#ifdef DEBUG_GICV3
|
#ifdef DEBUG_GICV3
|
||||||
#define dkprintf(...) kprintf(__VA_ARGS__)
|
#undef DDEBUG_DEFAULT
|
||||||
#define ekprintf(...) kprintf(__VA_ARGS__)
|
#define DDEBUG_DEFAULT DDEBUG_PRINT
|
||||||
#else
|
#endif
|
||||||
#define dkprintf(...)
|
|
||||||
#define ekprintf(...) kprintf(__VA_ARGS__)
|
#ifdef USE_CAVIUM_THUNDER_X
|
||||||
|
static char is_cavium_thunderx = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void *dist_base;
|
void *dist_base;
|
||||||
@@ -108,8 +112,8 @@ static uint64_t gic_read_iar_cavium_thunderx(void)
|
|||||||
asm volatile("nop;nop;nop;nop;");
|
asm volatile("nop;nop;nop;nop;");
|
||||||
asm volatile("mrs_s %0, " __stringify(ICC_IAR1_EL1) : "=r" (irqstat));
|
asm volatile("mrs_s %0, " __stringify(ICC_IAR1_EL1) : "=r" (irqstat));
|
||||||
asm volatile("nop;nop;nop;nop;");
|
asm volatile("nop;nop;nop;nop;");
|
||||||
mb();
|
|
||||||
#endif /* CONFIG_HAS_NMI */
|
#endif /* CONFIG_HAS_NMI */
|
||||||
|
mb();
|
||||||
|
|
||||||
return irqstat;
|
return irqstat;
|
||||||
}
|
}
|
||||||
@@ -118,7 +122,7 @@ static uint64_t gic_read_iar_cavium_thunderx(void)
|
|||||||
static uint64_t gic_read_iar(void)
|
static uint64_t gic_read_iar(void)
|
||||||
{
|
{
|
||||||
#ifdef USE_CAVIUM_THUNDER_X
|
#ifdef USE_CAVIUM_THUNDER_X
|
||||||
if (static_key_false(&is_cavium_thunderx))
|
if (is_cavium_thunderx)
|
||||||
return gic_read_iar_cavium_thunderx();
|
return gic_read_iar_cavium_thunderx();
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
@@ -266,6 +270,7 @@ void arm64_issue_ipi_gicv3(uint32_t cpuid, uint32_t vector)
|
|||||||
{
|
{
|
||||||
dkprintf("Send irq#%d to cpuid=%d\n", vector, cpuid);
|
dkprintf("Send irq#%d to cpuid=%d\n", vector, cpuid);
|
||||||
|
|
||||||
|
barrier();
|
||||||
if(vector < 16){
|
if(vector < 16){
|
||||||
// send SGI
|
// send SGI
|
||||||
arm64_raise_sgi_gicv3(cpuid, vector);
|
arm64_raise_sgi_gicv3(cpuid, vector);
|
||||||
@@ -304,7 +309,9 @@ void gic_dist_init_gicv3(unsigned long dist_base_pa, unsigned long size)
|
|||||||
|
|
||||||
#ifdef USE_CAVIUM_THUNDER_X
|
#ifdef USE_CAVIUM_THUNDER_X
|
||||||
/* Cavium ThunderX erratum 23154 */
|
/* Cavium ThunderX erratum 23154 */
|
||||||
gicv3_check_capabilities();
|
if (MIDR_IMPLEMENTOR(read_cpuid_id()) == ARM_CPU_IMP_CAVIUM) {
|
||||||
|
is_cavium_thunderx = 1;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -399,6 +406,7 @@ void gic_enable_gicv3(void)
|
|||||||
/* Set specific IPI to NMI */
|
/* Set specific IPI to NMI */
|
||||||
writeb_relaxed(GICD_INT_NMI_PRI, rd_sgi_base + GIC_DIST_PRI + INTRID_CPU_STOP);
|
writeb_relaxed(GICD_INT_NMI_PRI, rd_sgi_base + GIC_DIST_PRI + INTRID_CPU_STOP);
|
||||||
writeb_relaxed(GICD_INT_NMI_PRI, rd_sgi_base + GIC_DIST_PRI + INTRID_MEMDUMP);
|
writeb_relaxed(GICD_INT_NMI_PRI, rd_sgi_base + GIC_DIST_PRI + INTRID_MEMDUMP);
|
||||||
|
writeb_relaxed(GICD_INT_NMI_PRI, rd_sgi_base + GIC_DIST_PRI + INTRID_STACK_TRACE);
|
||||||
|
|
||||||
/* sync wait */
|
/* sync wait */
|
||||||
gic_do_wait_for_rwp(rbase);
|
gic_do_wait_for_rwp(rbase);
|
||||||
|
|||||||
@@ -20,10 +20,11 @@ size_t arm64_cpu_local_variables_span = LOCALS_SPAN; /* for debugger */
|
|||||||
void init_processors_local(int max_id)
|
void init_processors_local(int max_id)
|
||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
const int sz = (max_id + 1) * KERNEL_STACK_SIZE;
|
||||||
union arm64_cpu_local_variables *tmp;
|
union arm64_cpu_local_variables *tmp;
|
||||||
|
|
||||||
/* allocate one more for alignment */
|
/* allocate one more for alignment */
|
||||||
locals = ihk_mc_alloc_pages((max_id + 1) * (KERNEL_STACK_SIZE / PAGE_SIZE), IHK_MC_AP_CRITICAL);
|
locals = ihk_mc_alloc_pages(((sz + PAGE_SIZE - 1) / PAGE_SIZE), IHK_MC_AP_CRITICAL);
|
||||||
locals = (union arm64_cpu_local_variables *)ALIGN_UP((unsigned long)locals, KERNEL_STACK_SIZE);
|
locals = (union arm64_cpu_local_variables *)ALIGN_UP((unsigned long)locals, KERNEL_STACK_SIZE);
|
||||||
|
|
||||||
/* clear struct process, struct process_vm, struct thread_info area */
|
/* clear struct process, struct process_vm, struct thread_info area */
|
||||||
|
|||||||
@@ -14,9 +14,7 @@
|
|||||||
#include <context.h>
|
#include <context.h>
|
||||||
#include <kmalloc.h>
|
#include <kmalloc.h>
|
||||||
#include <vdso.h>
|
#include <vdso.h>
|
||||||
|
#include <debug.h>
|
||||||
#define dkprintf(...) do { if (0) kprintf(__VA_ARGS__); } while (0)
|
|
||||||
#define ekprintf(...) kprintf(__VA_ARGS__)
|
|
||||||
|
|
||||||
#define NOT_IMPLEMENTED() do { kprintf("%s is not implemented\n", __func__); while(1);} while(0)
|
#define NOT_IMPLEMENTED() do { kprintf("%s is not implemented\n", __func__); while(1);} while(0)
|
||||||
|
|
||||||
@@ -1760,6 +1758,12 @@ int visit_pte_range(page_table_t pt, void *start0, void *end0, int pgshift,
|
|||||||
return initial_lookup.walk(tt, 0, start, end, initial_lookup.callback, &args);
|
return initial_lookup.walk(tt, 0, start, end, initial_lookup.callback, &args);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int visit_pte_range_safe(page_table_t pt, void *start0, void *end0, int pgshift,
|
||||||
|
enum visit_pte_flag flags, pte_visitor_t *funcp, void *arg)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
struct clear_range_args {
|
struct clear_range_args {
|
||||||
int free_physical;
|
int free_physical;
|
||||||
struct memobj *memobj;
|
struct memobj *memobj;
|
||||||
@@ -1801,7 +1805,6 @@ static int clear_range_l1(void *args0, pte_t *ptep, uint64_t base,
|
|||||||
ihk_mc_free_pages_user(phys_to_virt(phys), npages);
|
ihk_mc_free_pages_user(phys_to_virt(phys), npages);
|
||||||
dkprintf("%s: freeing regular page at 0x%lx\n", __FUNCTION__, base);
|
dkprintf("%s: freeing regular page at 0x%lx\n", __FUNCTION__, base);
|
||||||
}
|
}
|
||||||
args->vm->currss -= PTL1_SIZE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@@ -1881,7 +1884,6 @@ static int clear_range_middle(void *args0, pte_t *ptep, uint64_t base,
|
|||||||
ihk_mc_free_pages_user(phys_to_virt(phys), npages);
|
ihk_mc_free_pages_user(phys_to_virt(phys), npages);
|
||||||
dkprintf("%s(level=%d): freeing large page at 0x%lx\n", __FUNCTION__, level, base);
|
dkprintf("%s(level=%d): freeing large page at 0x%lx\n", __FUNCTION__, level, base);
|
||||||
}
|
}
|
||||||
args->vm->currss -= tbl.pgsize;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@@ -2920,17 +2922,12 @@ int read_process_vm(struct process_vm *vm, void *kdst, const void *usrc, size_t
|
|||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef POSTK_DEBUG_TEMP_FIX_52 /* NUMA support(memory area determination) */
|
if (!is_mckernel_memory(pa, pa + cpsize)) {
|
||||||
if (!is_mckernel_memory(pa)) {
|
|
||||||
#else
|
|
||||||
if (pa < ihk_mc_get_memory_address(IHK_MC_GMA_MAP_START, 0) ||
|
|
||||||
pa >= ihk_mc_get_memory_address(IHK_MC_GMA_MAP_END, 0)) {
|
|
||||||
#endif /* POSTK_DEBUG_TEMP_FIX_52 */
|
|
||||||
dkprintf("%s: pa is outside of LWK memory, to: %p, pa: %p,"
|
dkprintf("%s: pa is outside of LWK memory, to: %p, pa: %p,"
|
||||||
"cpsize: %d\n", __FUNCTION__, to, pa, cpsize);
|
"cpsize: %d\n", __FUNCTION__, to, pa, cpsize);
|
||||||
va = ihk_mc_map_virtual(pa, 1, PTATTR_ACTIVE);
|
va = ihk_mc_map_virtual(pa, 1, PTATTR_ACTIVE);
|
||||||
memcpy(to, va, cpsize);
|
memcpy(to, va, cpsize);
|
||||||
ihk_mc_unmap_virtual(va, 1, 1);
|
ihk_mc_unmap_virtual(va, 1);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
va = phys_to_virt(pa);
|
va = phys_to_virt(pa);
|
||||||
@@ -3003,17 +3000,12 @@ int write_process_vm(struct process_vm *vm, void *udst, const void *ksrc, size_t
|
|||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef POSTK_DEBUG_TEMP_FIX_52 /* NUMA support(memory area determination) */
|
if (!is_mckernel_memory(pa, pa + cpsize)) {
|
||||||
if (!is_mckernel_memory(pa)) {
|
|
||||||
#else
|
|
||||||
if (pa < ihk_mc_get_memory_address(IHK_MC_GMA_MAP_START, 0) ||
|
|
||||||
pa >= ihk_mc_get_memory_address(IHK_MC_GMA_MAP_END, 0)) {
|
|
||||||
#endif /* POSTK_DEBUG_TEMP_FIX_52 */
|
|
||||||
dkprintf("%s: pa is outside of LWK memory, from: %p,"
|
dkprintf("%s: pa is outside of LWK memory, from: %p,"
|
||||||
"pa: %p, cpsize: %d\n", __FUNCTION__, from, pa, cpsize);
|
"pa: %p, cpsize: %d\n", __FUNCTION__, from, pa, cpsize);
|
||||||
va = ihk_mc_map_virtual(pa, 1, PTATTR_WRITABLE|PTATTR_ACTIVE);
|
va = ihk_mc_map_virtual(pa, 1, PTATTR_WRITABLE|PTATTR_ACTIVE);
|
||||||
memcpy(va, from, cpsize);
|
memcpy(va, from, cpsize);
|
||||||
ihk_mc_unmap_virtual(va, 1, 1);
|
ihk_mc_unmap_virtual(va, 1);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
va = phys_to_virt(pa);
|
va = phys_to_virt(pa);
|
||||||
@@ -3074,17 +3066,12 @@ int patch_process_vm(struct process_vm *vm, void *udst, const void *ksrc, size_t
|
|||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef POSTK_DEBUG_TEMP_FIX_52 /* NUMA support(memory area determination) */
|
if (!is_mckernel_memory(pa, pa + cpsize)) {
|
||||||
if (!is_mckernel_memory(pa)) {
|
|
||||||
#else
|
|
||||||
if (pa < ihk_mc_get_memory_address(IHK_MC_GMA_MAP_START, 0) ||
|
|
||||||
pa >= ihk_mc_get_memory_address(IHK_MC_GMA_MAP_END, 0)) {
|
|
||||||
#endif /* POSTK_DEBUG_TEMP_FIX_52 */
|
|
||||||
dkprintf("%s: pa is outside of LWK memory, from: %p,"
|
dkprintf("%s: pa is outside of LWK memory, from: %p,"
|
||||||
"pa: %p, cpsize: %d\n", __FUNCTION__, from, pa, cpsize);
|
"pa: %p, cpsize: %d\n", __FUNCTION__, from, pa, cpsize);
|
||||||
va = ihk_mc_map_virtual(pa, 1, PTATTR_WRITABLE|PTATTR_ACTIVE);
|
va = ihk_mc_map_virtual(pa, 1, PTATTR_WRITABLE|PTATTR_ACTIVE);
|
||||||
memcpy(va, from, cpsize);
|
memcpy(va, from, cpsize);
|
||||||
ihk_mc_unmap_virtual(va, 1, 1);
|
ihk_mc_unmap_virtual(va, 1);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
va = phys_to_virt(pa);
|
va = phys_to_virt(pa);
|
||||||
|
|||||||
@@ -93,21 +93,50 @@ int ihk_mc_perfctr_init(int counter, uint64_t config, int mode)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ihk_mc_perfctr_start(int counter)
|
int ihk_mc_perfctr_start(unsigned long counter_mask)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret = 0;
|
||||||
ret = cpu_pmu.enable_counter(counter);
|
int counter;
|
||||||
return ret;
|
unsigned long counter_bit;
|
||||||
|
|
||||||
|
for (counter = 0, counter_bit = 1;
|
||||||
|
counter_bit < counter_mask;
|
||||||
|
counter++, counter_bit <<= 1) {
|
||||||
|
if (!(counter_mask & counter_bit))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
ret = cpu_pmu.enable_counter(counter_mask);
|
||||||
|
if (ret < 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret < 0 ? ret : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ihk_mc_perfctr_stop(int counter)
|
int ihk_mc_perfctr_stop(unsigned long counter_mask)
|
||||||
{
|
{
|
||||||
cpu_pmu.disable_counter(counter);
|
int ret = 0;
|
||||||
|
int counter;
|
||||||
|
unsigned long counter_bit;
|
||||||
|
|
||||||
// ihk_mc_perfctr_startが呼ばれるときには、
|
for (counter = 0, counter_bit = 1;
|
||||||
// init系関数が呼ばれるのでdisableにする。
|
counter_bit < counter_mask;
|
||||||
cpu_pmu.disable_intens(counter);
|
counter++, counter_bit <<= 1) {
|
||||||
return 0;
|
if (!(counter_mask & counter_bit))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
ret = cpu_pmu.disable_counter(counter);
|
||||||
|
if (ret < 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
// ihk_mc_perfctr_startが呼ばれるときには、
|
||||||
|
// init系関数が呼ばれるのでdisableにする。
|
||||||
|
ret = cpu_pmu.disable_intens(counter);
|
||||||
|
if (ret < 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret < 0 ? ret : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ihk_mc_perfctr_reset(int counter)
|
int ihk_mc_perfctr_reset(int counter)
|
||||||
|
|||||||
@@ -4,16 +4,14 @@
|
|||||||
#include <ihk/perfctr.h>
|
#include <ihk/perfctr.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <ihk/debug.h>
|
#include <ihk/debug.h>
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
#define BIT(nr) (1UL << (nr))
|
#define BIT(nr) (1UL << (nr))
|
||||||
|
|
||||||
//#define DEBUG_PRINT_PMU
|
//#define DEBUG_PRINT_PMU
|
||||||
#ifdef DEBUG_PRINT_PMU
|
#ifdef DEBUG_PRINT_PMU
|
||||||
#define dkprintf(...) kprintf(__VA_ARGS__)
|
#undef DDEBUG_DEFAULT
|
||||||
#define ekprintf(...) kprintf(__VA_ARGS__)
|
#define DDEBUG_DEFAULT DDEBUG_PRINT
|
||||||
#else
|
|
||||||
#define dkprintf(...) do { if (0) kprintf(__VA_ARGS__); } while (0)
|
|
||||||
#define ekprintf(...) kprintf(__VA_ARGS__)
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -21,15 +21,13 @@
|
|||||||
#include <ihk/debug.h>
|
#include <ihk/debug.h>
|
||||||
#include <compiler.h>
|
#include <compiler.h>
|
||||||
#include <lwk/compiler.h>
|
#include <lwk/compiler.h>
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
//#define DEBUG_PRINT_PSCI
|
//#define DEBUG_PRINT_PSCI
|
||||||
|
|
||||||
#ifdef DEBUG_PRINT_PSCI
|
#ifdef DEBUG_PRINT_PSCI
|
||||||
#define dkprintf(...) kprintf(__VA_ARGS__)
|
#undef DDEBUG_DEFAULT
|
||||||
#define ekprintf(...) kprintf(__VA_ARGS__)
|
#define DDEBUG_DEFAULT DDEBUG_PRINT
|
||||||
#else
|
|
||||||
#define dkprintf(...) do { if (0) kprintf(__VA_ARGS__); } while (0)
|
|
||||||
#define ekprintf(...) kprintf(__VA_ARGS__)
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define PSCI_POWER_STATE_TYPE_POWER_DOWN 1
|
#define PSCI_POWER_STATE_TYPE_POWER_DOWN 1
|
||||||
|
|||||||
@@ -11,22 +11,17 @@
|
|||||||
#include <hwcap.h>
|
#include <hwcap.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <thread_info.h>
|
#include <thread_info.h>
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
//#define DEBUG_PRINT_SC
|
//#define DEBUG_PRINT_SC
|
||||||
|
|
||||||
#ifdef DEBUG_PRINT_SC
|
#ifdef DEBUG_PRINT_SC
|
||||||
#define dkprintf kprintf
|
#undef DDEBUG_DEFAULT
|
||||||
#define ekprintf(...) do { if (0) kprintf(__VA_ARGS__); } while (0)
|
#define DDEBUG_DEFAULT DDEBUG_PRINT
|
||||||
#else
|
|
||||||
#define dkprintf(...) do { if (0) kprintf(__VA_ARGS__); } while (0)
|
|
||||||
#define ekprintf(...) do { if (0) kprintf(__VA_ARGS__); } while (0)
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define NOT_IMPLEMENTED() do { kprintf("%s is not implemented\n", __func__); while(1);} while(0)
|
#define NOT_IMPLEMENTED() do { kprintf("%s is not implemented\n", __func__); while(1);} while(0)
|
||||||
|
|
||||||
#define BUG_ON(condition) do { if (condition) { kprintf("PANIC: %s: %s(line:%d)\n",\
|
|
||||||
__FILE__, __FUNCTION__, __LINE__); panic(""); } } while(0)
|
|
||||||
|
|
||||||
extern void save_debugreg(unsigned long *debugreg);
|
extern void save_debugreg(unsigned long *debugreg);
|
||||||
extern unsigned long do_kill(struct thread *thread, int pid, int tid, int sig, struct siginfo *info, int ptracecont);
|
extern unsigned long do_kill(struct thread *thread, int pid, int tid, int sig, struct siginfo *info, int ptracecont);
|
||||||
extern int interrupt_from_user(void *);
|
extern int interrupt_from_user(void *);
|
||||||
@@ -959,13 +954,9 @@ void ptrace_report_signal(struct thread *thread, int sig)
|
|||||||
}
|
}
|
||||||
thread->exit_status = sig;
|
thread->exit_status = sig;
|
||||||
/* Transition thread state */
|
/* Transition thread state */
|
||||||
#ifdef POSTK_DEBUG_TEMP_FIX_41 /* early to wait4() wakeup for ptrace, fix. */
|
|
||||||
proc->status = PS_DELAY_TRACED;
|
proc->status = PS_DELAY_TRACED;
|
||||||
#else /* POSTK_DEBUG_TEMP_FIX_41 */
|
|
||||||
proc->status = PS_TRACED;
|
|
||||||
#endif /* POSTK_DEBUG_TEMP_FIX_41 */
|
|
||||||
thread->status = PS_TRACED;
|
thread->status = PS_TRACED;
|
||||||
proc->ptrace &= ~PT_TRACE_SYSCALL_MASK;
|
proc->ptrace &= ~PT_TRACE_SYSCALL;
|
||||||
if (sig == SIGSTOP || sig == SIGTSTP ||
|
if (sig == SIGSTOP || sig == SIGTSTP ||
|
||||||
sig == SIGTTIN || sig == SIGTTOU) {
|
sig == SIGTTIN || sig == SIGTTOU) {
|
||||||
proc->signal_flags |= SIGNAL_STOP_STOPPED;
|
proc->signal_flags |= SIGNAL_STOP_STOPPED;
|
||||||
@@ -982,10 +973,6 @@ void ptrace_report_signal(struct thread *thread, int sig)
|
|||||||
info._sifields._sigchld.si_pid = thread->tid;
|
info._sifields._sigchld.si_pid = thread->tid;
|
||||||
info._sifields._sigchld.si_status = thread->exit_status;
|
info._sifields._sigchld.si_status = thread->exit_status;
|
||||||
do_kill(cpu_local_var(current), parent_pid, -1, SIGCHLD, &info, 0);
|
do_kill(cpu_local_var(current), parent_pid, -1, SIGCHLD, &info, 0);
|
||||||
#ifndef POSTK_DEBUG_TEMP_FIX_41 /* early to wait4() wakeup for ptrace, fix. */
|
|
||||||
/* Wake parent (if sleeping in wait4()) */
|
|
||||||
waitq_wakeup(&proc->parent->waitpid_q);
|
|
||||||
#endif /* !POSTK_DEBUG_TEMP_FIX_41 */
|
|
||||||
|
|
||||||
dkprintf("ptrace_report_signal,sleeping\n");
|
dkprintf("ptrace_report_signal,sleeping\n");
|
||||||
/* Sleep */
|
/* Sleep */
|
||||||
|
|||||||
@@ -12,6 +12,10 @@
|
|||||||
#include <lwk/compiler.h>
|
#include <lwk/compiler.h>
|
||||||
#include <hwcap.h>
|
#include <hwcap.h>
|
||||||
#include <prctl.h>
|
#include <prctl.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <syscall.h>
|
||||||
|
#include <uio.h>
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
extern void ptrace_report_signal(struct thread *thread, int sig);
|
extern void ptrace_report_signal(struct thread *thread, int sig);
|
||||||
extern void clear_single_step(struct thread *thread);
|
extern void clear_single_step(struct thread *thread);
|
||||||
@@ -25,18 +29,12 @@ static void __check_signal(unsigned long rc, void *regs, int num, int irq_disabl
|
|||||||
//#define DEBUG_PRINT_SC
|
//#define DEBUG_PRINT_SC
|
||||||
|
|
||||||
#ifdef DEBUG_PRINT_SC
|
#ifdef DEBUG_PRINT_SC
|
||||||
#define dkprintf kprintf
|
#undef DDEBUG_DEFAULT
|
||||||
#define ekprintf(...) do { if (0) kprintf(__VA_ARGS__); } while (0)
|
#define DDEBUG_DEFAULT DDEBUG_PRINT
|
||||||
#else
|
|
||||||
#define dkprintf(...) do { if (0) kprintf(__VA_ARGS__); } while (0)
|
|
||||||
#define ekprintf(...) do { if (0) kprintf(__VA_ARGS__); } while (0)
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define NOT_IMPLEMENTED() do { kprintf("%s is not implemented\n", __func__); while(1);} while(0)
|
#define NOT_IMPLEMENTED() do { kprintf("%s is not implemented\n", __func__); while(1);} while(0)
|
||||||
|
|
||||||
#define BUG_ON(condition) do { if (condition) { kprintf("PANIC: %s: %s(line:%d)\n",\
|
|
||||||
__FILE__, __FUNCTION__, __LINE__); panic(""); } } while(0)
|
|
||||||
|
|
||||||
uintptr_t debug_constants[] = {
|
uintptr_t debug_constants[] = {
|
||||||
sizeof(struct cpu_local_var),
|
sizeof(struct cpu_local_var),
|
||||||
offsetof(struct cpu_local_var, current),
|
offsetof(struct cpu_local_var, current),
|
||||||
@@ -57,7 +55,7 @@ static int cpuid_head = 1;
|
|||||||
|
|
||||||
extern int num_processors;
|
extern int num_processors;
|
||||||
|
|
||||||
int obtain_clone_cpuid(cpu_set_t *cpu_set) {
|
int obtain_clone_cpuid(cpu_set_t *cpu_set, int use_last) {
|
||||||
int min_queue_len = -1;
|
int min_queue_len = -1;
|
||||||
int i, min_cpu = -1;
|
int i, min_cpu = -1;
|
||||||
|
|
||||||
@@ -1175,19 +1173,10 @@ do_signal(unsigned long rc, void *regs0, struct thread *thread, struct sig_pendi
|
|||||||
/* Reap and set new signal_flags */
|
/* Reap and set new signal_flags */
|
||||||
proc->signal_flags = SIGNAL_STOP_STOPPED;
|
proc->signal_flags = SIGNAL_STOP_STOPPED;
|
||||||
|
|
||||||
#ifdef POSTK_DEBUG_TEMP_FIX_41 /* early to wait4() wakeup for ptrace, fix. */
|
|
||||||
proc->status = PS_DELAY_STOPPED;
|
proc->status = PS_DELAY_STOPPED;
|
||||||
#else /* POSTK_DEBUG_TEMP_FIX_41 */
|
|
||||||
proc->status = PS_STOPPED;
|
|
||||||
#endif /* POSTK_DEBUG_TEMP_FIX_41 */
|
|
||||||
thread->status = PS_STOPPED;
|
thread->status = PS_STOPPED;
|
||||||
mcs_rwlock_writer_unlock(&proc->update_lock, &lock);
|
mcs_rwlock_writer_unlock(&proc->update_lock, &lock);
|
||||||
|
|
||||||
#ifndef POSTK_DEBUG_TEMP_FIX_41 /* early to wait4() wakeup for ptrace, fix. */
|
|
||||||
/* Wake up the parent who tried wait4 and sleeping */
|
|
||||||
waitq_wakeup(&proc->parent->waitpid_q);
|
|
||||||
#endif /* !POSTK_DEBUG_TEMP_FIX_41 */
|
|
||||||
|
|
||||||
dkprintf("do_signal(): pid: %d, tid: %d SIGSTOP, sleeping\n",
|
dkprintf("do_signal(): pid: %d, tid: %d SIGSTOP, sleeping\n",
|
||||||
proc->pid, thread->tid);
|
proc->pid, thread->tid);
|
||||||
/* Sleep */
|
/* Sleep */
|
||||||
@@ -1204,19 +1193,10 @@ do_signal(unsigned long rc, void *regs0, struct thread *thread, struct sig_pendi
|
|||||||
/* Update thread state in fork tree */
|
/* Update thread state in fork tree */
|
||||||
mcs_rwlock_writer_lock(&proc->update_lock, &lock);
|
mcs_rwlock_writer_lock(&proc->update_lock, &lock);
|
||||||
thread->exit_status = SIGTRAP;
|
thread->exit_status = SIGTRAP;
|
||||||
#ifdef POSTK_DEBUG_TEMP_FIX_41 /* early to wait4() wakeup for ptrace, fix. */
|
|
||||||
proc->status = PS_DELAY_TRACED;
|
proc->status = PS_DELAY_TRACED;
|
||||||
#else /* POSTK_DEBUG_TEMP_FIX_41 */
|
|
||||||
proc->status = PS_TRACED;
|
|
||||||
#endif /* POSTK_DEBUG_TEMP_FIX_41 */
|
|
||||||
thread->status = PS_TRACED;
|
thread->status = PS_TRACED;
|
||||||
mcs_rwlock_writer_unlock(&proc->update_lock, &lock);
|
mcs_rwlock_writer_unlock(&proc->update_lock, &lock);
|
||||||
|
|
||||||
#ifndef POSTK_DEBUG_TEMP_FIX_41 /* early to wait4() wakeup for ptrace, fix. */
|
|
||||||
/* Wake up the parent who tried wait4 and sleeping */
|
|
||||||
waitq_wakeup(&thread->proc->parent->waitpid_q);
|
|
||||||
#endif /* !POSTK_DEBUG_TEMP_FIX_41 */
|
|
||||||
|
|
||||||
/* Sleep */
|
/* Sleep */
|
||||||
dkprintf("do_signal,SIGTRAP,sleeping\n");
|
dkprintf("do_signal,SIGTRAP,sleeping\n");
|
||||||
|
|
||||||
@@ -1321,6 +1301,17 @@ interrupt_from_user(void *regs0)
|
|||||||
return((regs->pstate & PSR_MODE_MASK) == PSR_MODE_EL0t);
|
return((regs->pstate & PSR_MODE_MASK) == PSR_MODE_EL0t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void save_syscall_return_value(int num, unsigned long rc)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Save syscall return value.
|
||||||
|
*/
|
||||||
|
if (cpu_local_var(current) && cpu_local_var(current)->uctx &&
|
||||||
|
num != __NR_rt_sigsuspend) {
|
||||||
|
ihk_mc_syscall_arg0(cpu_local_var(current)->uctx) = rc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
check_signal(unsigned long rc, void *regs0, int num)
|
check_signal(unsigned long rc, void *regs0, int num)
|
||||||
{
|
{
|
||||||
@@ -1345,16 +1336,6 @@ __check_signal(unsigned long rc, void *regs0, int num, int irq_disabled)
|
|||||||
return;
|
return;
|
||||||
thread = cpu_local_var(current);
|
thread = cpu_local_var(current);
|
||||||
|
|
||||||
/**
|
|
||||||
* If check_signal is called from syscall(),
|
|
||||||
* then save syscall return value.
|
|
||||||
*/
|
|
||||||
if((regs == NULL)&&(num != __NR_rt_sigsuspend)){ /* It's call from syscall! */
|
|
||||||
// Get user context through current thread
|
|
||||||
// and update syscall return.
|
|
||||||
ihk_mc_syscall_arg0(thread->uctx) = rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(thread == NULL || thread->proc->pid == 0){
|
if(thread == NULL || thread->proc->pid == 0){
|
||||||
struct thread *t;
|
struct thread *t;
|
||||||
irqstate = ihk_mc_spinlock_lock(&(cpu_local_var(runq_lock)));
|
irqstate = ihk_mc_spinlock_lock(&(cpu_local_var(runq_lock)));
|
||||||
@@ -1591,7 +1572,7 @@ done:
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tthread->thread_offloaded) {
|
if (tthread->uti_state == UTI_STATE_RUNNING_IN_LINUX) {
|
||||||
interrupt_syscall(tthread, sig);
|
interrupt_syscall(tthread, sig);
|
||||||
release_thread(tthread);
|
release_thread(tthread);
|
||||||
return 0;
|
return 0;
|
||||||
@@ -1726,7 +1707,7 @@ SYSCALL_DECLARE(mmap)
|
|||||||
| MAP_NONBLOCK // 0x10000
|
| MAP_NONBLOCK // 0x10000
|
||||||
;
|
;
|
||||||
|
|
||||||
const intptr_t addr0 = ihk_mc_syscall_arg0(ctx);
|
const uintptr_t addr0 = ihk_mc_syscall_arg0(ctx);
|
||||||
const size_t len0 = ihk_mc_syscall_arg1(ctx);
|
const size_t len0 = ihk_mc_syscall_arg1(ctx);
|
||||||
const int prot = ihk_mc_syscall_arg2(ctx);
|
const int prot = ihk_mc_syscall_arg2(ctx);
|
||||||
const int flags0 = ihk_mc_syscall_arg3(ctx);
|
const int flags0 = ihk_mc_syscall_arg3(ctx);
|
||||||
@@ -1735,7 +1716,7 @@ SYSCALL_DECLARE(mmap)
|
|||||||
struct thread *thread = cpu_local_var(current);
|
struct thread *thread = cpu_local_var(current);
|
||||||
struct vm_regions *region = &thread->vm->region;
|
struct vm_regions *region = &thread->vm->region;
|
||||||
int error;
|
int error;
|
||||||
intptr_t addr = 0;
|
uintptr_t addr = 0;
|
||||||
size_t len;
|
size_t len;
|
||||||
int flags = flags0;
|
int flags = flags0;
|
||||||
size_t pgsize;
|
size_t pgsize;
|
||||||
@@ -1798,8 +1779,9 @@ SYSCALL_DECLARE(mmap)
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((flags & MAP_FIXED) && ((addr < region->user_start)
|
if (addr < region->user_start
|
||||||
|| (region->user_end <= addr))) {
|
|| region->user_end <= addr
|
||||||
|
|| len > (region->user_end - region->user_start)) {
|
||||||
ekprintf("sys_mmap(%lx,%lx,%x,%x,%x,%lx):ENOMEM\n",
|
ekprintf("sys_mmap(%lx,%lx,%x,%x,%x,%lx):ENOMEM\n",
|
||||||
addr0, len0, prot, flags0, fd, off0);
|
addr0, len0, prot, flags0, fd, off0);
|
||||||
error = -ENOMEM;
|
error = -ENOMEM;
|
||||||
@@ -1866,4 +1848,645 @@ save_uctx(void *uctx, struct pt_regs *regs)
|
|||||||
/* TODO: skeleton for UTI */
|
/* TODO: skeleton for UTI */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int do_process_vm_read_writev(int pid,
|
||||||
|
const struct iovec *local_iov,
|
||||||
|
unsigned long liovcnt,
|
||||||
|
const struct iovec *remote_iov,
|
||||||
|
unsigned long riovcnt,
|
||||||
|
unsigned long flags,
|
||||||
|
int op)
|
||||||
|
{
|
||||||
|
int ret = -EINVAL;
|
||||||
|
int li, ri;
|
||||||
|
int pli, pri;
|
||||||
|
off_t loff, roff;
|
||||||
|
size_t llen = 0, rlen = 0;
|
||||||
|
size_t copied = 0;
|
||||||
|
size_t to_copy;
|
||||||
|
struct thread *lthread = cpu_local_var(current);
|
||||||
|
struct process *rproc;
|
||||||
|
struct process *lproc = lthread->proc;
|
||||||
|
struct process_vm *rvm = NULL;
|
||||||
|
unsigned long rphys;
|
||||||
|
unsigned long rpage_left;
|
||||||
|
unsigned long psize;
|
||||||
|
void *rva;
|
||||||
|
struct vm_range *range;
|
||||||
|
struct mcs_rwlock_node_irqsave lock;
|
||||||
|
struct mcs_rwlock_node update_lock;
|
||||||
|
|
||||||
|
/* Sanity checks */
|
||||||
|
if (flags) {
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (liovcnt > IOV_MAX || riovcnt > IOV_MAX) {
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check if parameters are okay */
|
||||||
|
ihk_mc_spinlock_lock_noirq(<hread->vm->memory_range_lock);
|
||||||
|
|
||||||
|
range = lookup_process_memory_range(lthread->vm,
|
||||||
|
(uintptr_t)local_iov,
|
||||||
|
(uintptr_t)(local_iov + liovcnt * sizeof(struct iovec)));
|
||||||
|
|
||||||
|
if (!range) {
|
||||||
|
ret = -EFAULT;
|
||||||
|
goto arg_out;
|
||||||
|
}
|
||||||
|
|
||||||
|
range = lookup_process_memory_range(lthread->vm,
|
||||||
|
(uintptr_t)remote_iov,
|
||||||
|
(uintptr_t)(remote_iov + riovcnt * sizeof(struct iovec)));
|
||||||
|
|
||||||
|
if (!range) {
|
||||||
|
ret = -EFAULT;
|
||||||
|
goto arg_out;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = 0;
|
||||||
|
arg_out:
|
||||||
|
ihk_mc_spinlock_unlock_noirq(<hread->vm->memory_range_lock);
|
||||||
|
|
||||||
|
if (ret != 0) {
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (li = 0; li < liovcnt; ++li) {
|
||||||
|
llen += local_iov[li].iov_len;
|
||||||
|
dkprintf("local_iov[%d].iov_base: 0x%lx, len: %lu\n",
|
||||||
|
li, local_iov[li].iov_base, local_iov[li].iov_len);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (ri = 0; ri < riovcnt; ++ri) {
|
||||||
|
rlen += remote_iov[ri].iov_len;
|
||||||
|
dkprintf("remote_iov[%d].iov_base: 0x%lx, len: %lu\n",
|
||||||
|
ri, remote_iov[ri].iov_base, remote_iov[ri].iov_len);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (llen != rlen) {
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Find remote process */
|
||||||
|
rproc = find_process(pid, &lock);
|
||||||
|
if (!rproc) {
|
||||||
|
ret = -ESRCH;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
mcs_rwlock_reader_lock_noirq(&rproc->update_lock, &update_lock);
|
||||||
|
if(rproc->status == PS_EXITED ||
|
||||||
|
rproc->status == PS_ZOMBIE){
|
||||||
|
mcs_rwlock_reader_unlock_noirq(&rproc->update_lock, &update_lock);
|
||||||
|
process_unlock(rproc, &lock);
|
||||||
|
ret = -ESRCH;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
rvm = rproc->vm;
|
||||||
|
hold_process_vm(rvm);
|
||||||
|
mcs_rwlock_reader_unlock_noirq(&rproc->update_lock, &update_lock);
|
||||||
|
process_unlock(rproc, &lock);
|
||||||
|
|
||||||
|
if (lproc->euid != 0 &&
|
||||||
|
(lproc->ruid != rproc->ruid ||
|
||||||
|
lproc->ruid != rproc->euid ||
|
||||||
|
lproc->ruid != rproc->suid ||
|
||||||
|
lproc->rgid != rproc->rgid ||
|
||||||
|
lproc->rgid != rproc->egid ||
|
||||||
|
lproc->rgid != rproc->sgid)) {
|
||||||
|
ret = -EPERM;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
dkprintf("pid %d found, doing %s: liovcnt: %d, riovcnt: %d \n", pid,
|
||||||
|
(op == PROCESS_VM_READ) ? "PROCESS_VM_READ" : "PROCESS_VM_WRITE",
|
||||||
|
liovcnt, riovcnt);
|
||||||
|
|
||||||
|
pli = pri = -1; /* Previous indeces in iovecs */
|
||||||
|
li = ri = 0; /* Current indeces in iovecs */
|
||||||
|
loff = roff = 0; /* Offsets in current iovec */
|
||||||
|
|
||||||
|
/* Now iterate and do the copy */
|
||||||
|
while (copied < llen) {
|
||||||
|
int faulted = 0;
|
||||||
|
|
||||||
|
/* New local vector? */
|
||||||
|
if (pli != li) {
|
||||||
|
struct vm_range *range;
|
||||||
|
|
||||||
|
ihk_mc_spinlock_lock_noirq(<hread->vm->memory_range_lock);
|
||||||
|
|
||||||
|
/* Is base valid? */
|
||||||
|
range = lookup_process_memory_range(lthread->vm,
|
||||||
|
(uintptr_t)local_iov[li].iov_base,
|
||||||
|
(uintptr_t)(local_iov[li].iov_base + 1));
|
||||||
|
|
||||||
|
if (!range) {
|
||||||
|
ret = -EFAULT;
|
||||||
|
goto pli_out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Is range valid? */
|
||||||
|
range = lookup_process_memory_range(lthread->vm,
|
||||||
|
(uintptr_t)local_iov[li].iov_base,
|
||||||
|
(uintptr_t)(local_iov[li].iov_base + local_iov[li].iov_len));
|
||||||
|
|
||||||
|
if (range == NULL) {
|
||||||
|
ret = -EINVAL;
|
||||||
|
goto pli_out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(range->flag & ((op == PROCESS_VM_READ) ?
|
||||||
|
VR_PROT_WRITE : VR_PROT_READ))) {
|
||||||
|
ret = -EFAULT;
|
||||||
|
goto pli_out;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = 0;
|
||||||
|
pli_out:
|
||||||
|
ihk_mc_spinlock_unlock_noirq(<hread->vm->memory_range_lock);
|
||||||
|
|
||||||
|
if (ret != 0) {
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
pli = li;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* New remote vector? */
|
||||||
|
if (pri != ri) {
|
||||||
|
struct vm_range *range;
|
||||||
|
|
||||||
|
ihk_mc_spinlock_lock_noirq(&rvm->memory_range_lock);
|
||||||
|
|
||||||
|
/* Is base valid? */
|
||||||
|
range = lookup_process_memory_range(rvm,
|
||||||
|
(uintptr_t)remote_iov[li].iov_base,
|
||||||
|
(uintptr_t)(remote_iov[li].iov_base + 1));
|
||||||
|
|
||||||
|
if (range == NULL) {
|
||||||
|
ret = -EFAULT;
|
||||||
|
goto pri_out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Is range valid? */
|
||||||
|
range = lookup_process_memory_range(rvm,
|
||||||
|
(uintptr_t)remote_iov[li].iov_base,
|
||||||
|
(uintptr_t)(remote_iov[li].iov_base + remote_iov[li].iov_len));
|
||||||
|
|
||||||
|
if (range == NULL) {
|
||||||
|
ret = -EINVAL;
|
||||||
|
goto pri_out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(range->flag & ((op == PROCESS_VM_READ) ?
|
||||||
|
VR_PROT_READ : VR_PROT_WRITE))) {
|
||||||
|
ret = -EFAULT;
|
||||||
|
goto pri_out;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = 0;
|
||||||
|
pri_out:
|
||||||
|
ihk_mc_spinlock_unlock_noirq(&rvm->memory_range_lock);
|
||||||
|
|
||||||
|
if (ret != 0) {
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
pri = ri;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Figure out how much we can copy at most in this iteration */
|
||||||
|
to_copy = (local_iov[li].iov_len - loff);
|
||||||
|
if ((remote_iov[ri].iov_len - roff) < to_copy) {
|
||||||
|
to_copy = remote_iov[ri].iov_len - roff;
|
||||||
|
}
|
||||||
|
|
||||||
|
retry_lookup:
|
||||||
|
/* TODO: remember page and do this only if necessary */
|
||||||
|
ret = ihk_mc_pt_virt_to_phys_size(rvm->address_space->page_table,
|
||||||
|
remote_iov[ri].iov_base + roff, &rphys, &psize);
|
||||||
|
|
||||||
|
if (ret) {
|
||||||
|
uint64_t reason = PF_POPULATE | PF_WRITE | PF_USER;
|
||||||
|
void *addr;
|
||||||
|
|
||||||
|
if (faulted) {
|
||||||
|
ret = -EFAULT;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Fault in pages */
|
||||||
|
for (addr = (void *)
|
||||||
|
(((unsigned long)remote_iov[ri].iov_base + roff)
|
||||||
|
& PAGE_MASK);
|
||||||
|
addr < (remote_iov[ri].iov_base + roff + to_copy);
|
||||||
|
addr += PAGE_SIZE) {
|
||||||
|
|
||||||
|
ret = page_fault_process_vm(rvm, addr, reason);
|
||||||
|
if (ret) {
|
||||||
|
ret = -EFAULT;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
faulted = 1;
|
||||||
|
goto retry_lookup;
|
||||||
|
}
|
||||||
|
|
||||||
|
rpage_left = ((((unsigned long)remote_iov[ri].iov_base + roff +
|
||||||
|
psize) & ~(psize - 1)) -
|
||||||
|
((unsigned long)remote_iov[ri].iov_base + roff));
|
||||||
|
if (rpage_left < to_copy) {
|
||||||
|
to_copy = rpage_left;
|
||||||
|
}
|
||||||
|
|
||||||
|
rva = phys_to_virt(rphys);
|
||||||
|
|
||||||
|
fast_memcpy(
|
||||||
|
(op == PROCESS_VM_READ) ? local_iov[li].iov_base + loff : rva,
|
||||||
|
(op == PROCESS_VM_READ) ? rva : local_iov[li].iov_base + loff,
|
||||||
|
to_copy);
|
||||||
|
|
||||||
|
copied += to_copy;
|
||||||
|
dkprintf("local_iov[%d]: 0x%lx %s remote_iov[%d]: 0x%lx, %lu copied, psize: %lu, rpage_left: %lu\n",
|
||||||
|
li, local_iov[li].iov_base + loff,
|
||||||
|
(op == PROCESS_VM_READ) ? "<-" : "->",
|
||||||
|
ri, remote_iov[ri].iov_base + roff, to_copy,
|
||||||
|
psize, rpage_left);
|
||||||
|
|
||||||
|
loff += to_copy;
|
||||||
|
roff += to_copy;
|
||||||
|
|
||||||
|
if (loff == local_iov[li].iov_len) {
|
||||||
|
li++;
|
||||||
|
loff = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (roff == remote_iov[ri].iov_len) {
|
||||||
|
ri++;
|
||||||
|
roff = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
release_process_vm(rvm);
|
||||||
|
|
||||||
|
return copied;
|
||||||
|
|
||||||
|
out:
|
||||||
|
if(rvm)
|
||||||
|
release_process_vm(rvm);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int move_pages_smp_handler(int cpu_index, int nr_cpus, void *arg)
|
||||||
|
{
|
||||||
|
int i, i_s, i_e, phase = 1;
|
||||||
|
struct move_pages_smp_req *mpsr =
|
||||||
|
(struct move_pages_smp_req *)arg;
|
||||||
|
struct process_vm *vm = mpsr->proc->vm;
|
||||||
|
int count = mpsr->count;
|
||||||
|
struct page_table *save_pt;
|
||||||
|
extern struct page_table *get_init_page_table(void);
|
||||||
|
|
||||||
|
i_s = (count / nr_cpus) * cpu_index;
|
||||||
|
i_e = i_s + (count / nr_cpus);
|
||||||
|
if (cpu_index == (nr_cpus - 1)) {
|
||||||
|
i_e = count;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Load target process' PT so that we can access user-space */
|
||||||
|
save_pt = cpu_local_var(current) == &cpu_local_var(idle) ?
|
||||||
|
get_init_page_table() :
|
||||||
|
cpu_local_var(current)->vm->address_space->page_table;
|
||||||
|
|
||||||
|
if (save_pt != vm->address_space->page_table) {
|
||||||
|
ihk_mc_load_page_table(vm->address_space->page_table);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
save_pt = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nr_cpus == 1) {
|
||||||
|
switch (cpu_index) {
|
||||||
|
case 0:
|
||||||
|
memcpy(mpsr->virt_addr, mpsr->user_virt_addr,
|
||||||
|
sizeof(void *) * count);
|
||||||
|
memcpy(mpsr->status, mpsr->user_status,
|
||||||
|
sizeof(int) * count);
|
||||||
|
memcpy(mpsr->nodes, mpsr->user_nodes,
|
||||||
|
sizeof(int) * count);
|
||||||
|
memset(mpsr->ptep, 0, sizeof(pte_t) * count);
|
||||||
|
memset(mpsr->status, 0, sizeof(int) * count);
|
||||||
|
memset(mpsr->nr_pages, 0, sizeof(int) * count);
|
||||||
|
memset(mpsr->dst_phys, 0,
|
||||||
|
sizeof(unsigned long) * count);
|
||||||
|
mpsr->nodes_ready = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (nr_cpus > 1 && nr_cpus < 4) {
|
||||||
|
switch (cpu_index) {
|
||||||
|
case 0:
|
||||||
|
memcpy(mpsr->virt_addr, mpsr->user_virt_addr,
|
||||||
|
sizeof(void *) * count);
|
||||||
|
memcpy(mpsr->status, mpsr->user_status,
|
||||||
|
sizeof(int) * count);
|
||||||
|
case 1:
|
||||||
|
memcpy(mpsr->nodes, mpsr->user_nodes,
|
||||||
|
sizeof(int) * count);
|
||||||
|
memset(mpsr->ptep, 0, sizeof(pte_t) * count);
|
||||||
|
memset(mpsr->status, 0, sizeof(int) * count);
|
||||||
|
memset(mpsr->nr_pages, 0, sizeof(int) * count);
|
||||||
|
memset(mpsr->dst_phys, 0,
|
||||||
|
sizeof(unsigned long) * count);
|
||||||
|
mpsr->nodes_ready = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (nr_cpus >= 4 && nr_cpus < 8) {
|
||||||
|
switch (cpu_index) {
|
||||||
|
case 0:
|
||||||
|
memcpy(mpsr->virt_addr, mpsr->user_virt_addr,
|
||||||
|
sizeof(void *) * count);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
memcpy(mpsr->status, mpsr->user_status,
|
||||||
|
sizeof(int) * count);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
memcpy(mpsr->nodes, mpsr->user_nodes,
|
||||||
|
sizeof(int) * count);
|
||||||
|
mpsr->nodes_ready = 1;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
memset(mpsr->ptep, 0, sizeof(pte_t) * count);
|
||||||
|
memset(mpsr->status, 0, sizeof(int) * count);
|
||||||
|
memset(mpsr->nr_pages, 0, sizeof(int) * count);
|
||||||
|
memset(mpsr->dst_phys, 0,
|
||||||
|
sizeof(unsigned long) * count);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (nr_cpus >= 8) {
|
||||||
|
switch (cpu_index) {
|
||||||
|
case 0:
|
||||||
|
memcpy(mpsr->virt_addr, mpsr->user_virt_addr,
|
||||||
|
sizeof(void *) * (count / 2));
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
memcpy(mpsr->virt_addr + (count / 2),
|
||||||
|
mpsr->user_virt_addr + (count / 2),
|
||||||
|
sizeof(void *) * (count / 2));
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
memcpy(mpsr->status, mpsr->user_status,
|
||||||
|
sizeof(int) * count);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
memcpy(mpsr->nodes, mpsr->user_nodes,
|
||||||
|
sizeof(int) * count);
|
||||||
|
mpsr->nodes_ready = 1;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
memset(mpsr->ptep, 0, sizeof(pte_t) * count);
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
memset(mpsr->status, 0, sizeof(int) * count);
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
memset(mpsr->nr_pages, 0, sizeof(int) * count);
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
memset(mpsr->dst_phys, 0,
|
||||||
|
sizeof(unsigned long) * count);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
while (!(volatile int)mpsr->nodes_ready) {
|
||||||
|
cpu_pause();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* NUMA verification in parallel */
|
||||||
|
for (i = i_s; i < i_e; i++) {
|
||||||
|
if (mpsr->nodes[i] < 0 ||
|
||||||
|
mpsr->nodes[i] >= ihk_mc_get_nr_numa_nodes() ||
|
||||||
|
!test_bit(mpsr->nodes[i],
|
||||||
|
mpsr->proc->vm->numa_mask)) {
|
||||||
|
mpsr->phase_ret = -EINVAL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Barrier */
|
||||||
|
ihk_atomic_inc(&mpsr->phase_done);
|
||||||
|
while (ihk_atomic_read(&mpsr->phase_done) <
|
||||||
|
(phase * nr_cpus)) {
|
||||||
|
cpu_pause();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mpsr->phase_ret != 0) {
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
dkprintf("%s: phase %d done\n", __FUNCTION__, phase);
|
||||||
|
++phase;
|
||||||
|
|
||||||
|
/* PTE lookup in parallel */
|
||||||
|
for (i = i_s; i < i_e; i++) {
|
||||||
|
void *phys;
|
||||||
|
size_t pgsize;
|
||||||
|
int p2align;
|
||||||
|
/*
|
||||||
|
* XXX: No page structures for anonymous mappings.
|
||||||
|
* Look up physical addresses by scanning page tables.
|
||||||
|
*/
|
||||||
|
mpsr->ptep[i] = ihk_mc_pt_lookup_pte(vm->address_space->page_table,
|
||||||
|
(void *)mpsr->virt_addr[i], 0, &phys, &pgsize, &p2align);
|
||||||
|
|
||||||
|
/* PTE valid? */
|
||||||
|
if (!mpsr->ptep[i] || !pte_is_present(mpsr->ptep[i])) {
|
||||||
|
mpsr->status[i] = -ENOENT;
|
||||||
|
mpsr->ptep[i] = NULL;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* PTE is file? */
|
||||||
|
if (pte_is_fileoff(mpsr->ptep[i], PAGE_SIZE)) {
|
||||||
|
mpsr->status[i] = -EINVAL;
|
||||||
|
mpsr->ptep[i] = NULL;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
dkprintf("%s: virt 0x%lx:%lu requested to be moved to node %d\n",
|
||||||
|
__FUNCTION__, mpsr->virt_addr[i], pgsize, mpsr->nodes[i]);
|
||||||
|
|
||||||
|
/* Large page? */
|
||||||
|
if (pgsize > PAGE_SIZE) {
|
||||||
|
int nr_sub_pages = (pgsize / PAGE_SIZE);
|
||||||
|
int j;
|
||||||
|
|
||||||
|
if (i + nr_sub_pages > count) {
|
||||||
|
kprintf("%s: ERROR: page at index %d exceeds the region\n",
|
||||||
|
__FUNCTION__, i);
|
||||||
|
mpsr->status[i] = -EINVAL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Is it contiguous across nr_sub_pages and all
|
||||||
|
* requested to be moved to the same target node? */
|
||||||
|
for (j = 0; j < nr_sub_pages; ++j) {
|
||||||
|
if (mpsr->virt_addr[i + j] !=
|
||||||
|
(mpsr->virt_addr[i] + (j * PAGE_SIZE)) ||
|
||||||
|
mpsr->nodes[i] != mpsr->nodes[i + j]) {
|
||||||
|
kprintf("%s: ERROR: virt address or node at index %d"
|
||||||
|
" is inconsistent\n",
|
||||||
|
__FUNCTION__, i + j);
|
||||||
|
mpsr->phase_ret = -EINVAL;
|
||||||
|
goto pte_out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mpsr->nr_pages[i] = nr_sub_pages;
|
||||||
|
i += (nr_sub_pages - 1);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
mpsr->nr_pages[i] = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pte_out:
|
||||||
|
/* Barrier */
|
||||||
|
ihk_atomic_inc(&mpsr->phase_done);
|
||||||
|
while (ihk_atomic_read(&mpsr->phase_done) <
|
||||||
|
(phase * nr_cpus)) {
|
||||||
|
cpu_pause();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mpsr->phase_ret != 0) {
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
dkprintf("%s: phase %d done\n", __FUNCTION__, phase);
|
||||||
|
++phase;
|
||||||
|
|
||||||
|
if (cpu_index == 0) {
|
||||||
|
/* Allocate new pages on target NUMA nodes */
|
||||||
|
for (i = 0; i < count; i++) {
|
||||||
|
int pgalign = 0;
|
||||||
|
int j;
|
||||||
|
void *dst;
|
||||||
|
|
||||||
|
if (!mpsr->ptep[i] || mpsr->status[i] < 0 || !mpsr->nr_pages[i])
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* TODO: store pgalign info in an array as well? */
|
||||||
|
if (mpsr->nr_pages[i] > 1) {
|
||||||
|
if (mpsr->nr_pages[i] * PAGE_SIZE == PTL2_SIZE)
|
||||||
|
pgalign = PTL2_SHIFT - PTL1_SHIFT;
|
||||||
|
}
|
||||||
|
|
||||||
|
dst = ihk_mc_alloc_aligned_pages_node(mpsr->nr_pages[i],
|
||||||
|
pgalign, IHK_MC_AP_USER, mpsr->nodes[i]);
|
||||||
|
|
||||||
|
if (!dst) {
|
||||||
|
mpsr->status[i] = -ENOMEM;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (j = i; j < (i + mpsr->nr_pages[i]); ++j) {
|
||||||
|
mpsr->status[j] = mpsr->nodes[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
mpsr->dst_phys[i] = virt_to_phys(dst);
|
||||||
|
|
||||||
|
dkprintf("%s: virt 0x%lx:%lu to node %d, pgalign: %d,"
|
||||||
|
" allocated phys: 0x%lx\n",
|
||||||
|
__FUNCTION__, mpsr->virt_addr[i],
|
||||||
|
mpsr->nr_pages[i] * PAGE_SIZE,
|
||||||
|
mpsr->nodes[i], pgalign, mpsr->dst_phys[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Barrier */
|
||||||
|
ihk_atomic_inc(&mpsr->phase_done);
|
||||||
|
while (ihk_atomic_read(&mpsr->phase_done) <
|
||||||
|
(phase * nr_cpus)) {
|
||||||
|
cpu_pause();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mpsr->phase_ret != 0) {
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
dkprintf("%s: phase %d done\n", __FUNCTION__, phase);
|
||||||
|
++phase;
|
||||||
|
|
||||||
|
/* Copy, PTE update, memfree in parallel */
|
||||||
|
for (i = i_s; i < i_e; ++i) {
|
||||||
|
if (!mpsr->dst_phys[i])
|
||||||
|
continue;
|
||||||
|
|
||||||
|
fast_memcpy(phys_to_virt(mpsr->dst_phys[i]),
|
||||||
|
phys_to_virt(pte_get_phys(mpsr->ptep[i])),
|
||||||
|
mpsr->nr_pages[i] * PAGE_SIZE);
|
||||||
|
|
||||||
|
ihk_mc_free_pages(
|
||||||
|
phys_to_virt(pte_get_phys(mpsr->ptep[i])),
|
||||||
|
mpsr->nr_pages[i]);
|
||||||
|
|
||||||
|
pte_update_phys(mpsr->ptep[i], mpsr->dst_phys[i]);
|
||||||
|
|
||||||
|
dkprintf("%s: virt 0x%lx:%lu copied and remapped to phys: 0x%lu\n",
|
||||||
|
__FUNCTION__, mpsr->virt_addr[i],
|
||||||
|
mpsr->nr_pages[i] * PAGE_SIZE,
|
||||||
|
mpsr->dst_phys[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* XXX: do a separate SMP call with only CPUs running threads
|
||||||
|
* of this process? */
|
||||||
|
if (cpu_local_var(current)->proc == mpsr->proc) {
|
||||||
|
/* Invalidate all TLBs */
|
||||||
|
for (i = 0; i < mpsr->count; i++) {
|
||||||
|
if (!mpsr->dst_phys[i])
|
||||||
|
continue;
|
||||||
|
|
||||||
|
flush_tlb_single((unsigned long)mpsr->virt_addr[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
|
if (save_pt) {
|
||||||
|
ihk_mc_load_page_table(save_pt);
|
||||||
|
}
|
||||||
|
|
||||||
|
return mpsr->phase_ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
time_t time(void) {
|
||||||
|
struct timespec ats;
|
||||||
|
|
||||||
|
if (gettime_local_support) {
|
||||||
|
calculate_time_from_tsc(&ats);
|
||||||
|
return ats.tv_sec;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (time_t)0;
|
||||||
|
}
|
||||||
|
|
||||||
/*** End of File ***/
|
/*** End of File ***/
|
||||||
|
|||||||
@@ -14,15 +14,13 @@
|
|||||||
#include <ihk/debug.h>
|
#include <ihk/debug.h>
|
||||||
#include <ikc/queue.h>
|
#include <ikc/queue.h>
|
||||||
#include <vdso.h>
|
#include <vdso.h>
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
//#define DEBUG_PRINT_VDSO
|
//#define DEBUG_PRINT_VDSO
|
||||||
|
|
||||||
#ifdef DEBUG_PRINT_VDSO
|
#ifdef DEBUG_PRINT_VDSO
|
||||||
#define dkprintf(...) kprintf(__VA_ARGS__)
|
#undef DDEBUG_DEFAULT
|
||||||
#define ekprintf(...) kprintf(__VA_ARGS__)
|
#define DDEBUG_DEFAULT DDEBUG_PRINT
|
||||||
#else
|
|
||||||
#define dkprintf(...) do { if (0) kprintf(__VA_ARGS__); } while (0)
|
|
||||||
#define ekprintf(...) kprintf(__VA_ARGS__)
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef POSTK_DEBUG_ARCH_DEP_52
|
#ifdef POSTK_DEBUG_ARCH_DEP_52
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
/* gettimeofday.c COPYRIGHT FUJITSU LIMITED 2016 */
|
/* gettimeofday.c COPYRIGHT FUJITSU LIMITED 2016 */
|
||||||
|
|
||||||
|
#include <affinity.h>
|
||||||
|
#include <arch-memory.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <syscall.h>
|
#include <syscall.h>
|
||||||
#include <registers.h>
|
#include <registers.h>
|
||||||
|
|||||||
@@ -1,37 +0,0 @@
|
|||||||
ENTRY(_start)
|
|
||||||
|
|
||||||
PHDRS
|
|
||||||
{
|
|
||||||
text PT_LOAD;
|
|
||||||
data PT_LOAD;
|
|
||||||
}
|
|
||||||
|
|
||||||
SECTIONS
|
|
||||||
{
|
|
||||||
. = SIZEOF_HEADERS;
|
|
||||||
. = ALIGN(4096);
|
|
||||||
.text : {
|
|
||||||
*(.text)
|
|
||||||
} :text
|
|
||||||
.data : {
|
|
||||||
*(.data)
|
|
||||||
*(.data.*)
|
|
||||||
} :data
|
|
||||||
.rodata : {
|
|
||||||
*(.rodata .rodata.*)
|
|
||||||
} :data
|
|
||||||
|
|
||||||
. = ALIGN(8);
|
|
||||||
.bss : {
|
|
||||||
_bss_start = .;
|
|
||||||
*(.bss .bss.*)
|
|
||||||
_bss_end = .;
|
|
||||||
. = ALIGN(4096);
|
|
||||||
_stack_end = .;
|
|
||||||
} :data
|
|
||||||
|
|
||||||
/DISCARD/ : {
|
|
||||||
*(.eh_frame)
|
|
||||||
*(.note.gnu.build-id)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
IHK_OBJS += cpu.o interrupt.o memory.o trampoline.o local.o context.o
|
|
||||||
IHK_OBJS += perfctr.o syscall.o vsyscall.o
|
|
||||||
# POSTK_DEBUG_ARCH_DEP_18 coredump arch separation.
|
|
||||||
# IHK_OBJS added coredump.o
|
|
||||||
ifeq ($(ARCH), arm64)
|
|
||||||
IHK_OBJS += coredump.o
|
|
||||||
endif
|
|
||||||
37
arch/x86_64/elfboot/raw.lds
Normal file
37
arch/x86_64/elfboot/raw.lds
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
ENTRY(_start)
|
||||||
|
|
||||||
|
PHDRS
|
||||||
|
{
|
||||||
|
text PT_LOAD;
|
||||||
|
data PT_LOAD;
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
. = SIZEOF_HEADERS;
|
||||||
|
. = ALIGN(4096);
|
||||||
|
.text : {
|
||||||
|
*(.text)
|
||||||
|
} :text
|
||||||
|
.data : {
|
||||||
|
*(.data)
|
||||||
|
*(.data.*)
|
||||||
|
} :data
|
||||||
|
.rodata : {
|
||||||
|
*(.rodata .rodata.*)
|
||||||
|
} :data
|
||||||
|
|
||||||
|
. = ALIGN(8);
|
||||||
|
.bss : {
|
||||||
|
_bss_start = .;
|
||||||
|
*(.bss .bss.*)
|
||||||
|
_bss_end = .;
|
||||||
|
. = ALIGN(4096);
|
||||||
|
_stack_end = .;
|
||||||
|
} :data
|
||||||
|
|
||||||
|
/DISCARD/ : {
|
||||||
|
*(.eh_frame)
|
||||||
|
*(.note.gnu.build-id)
|
||||||
|
}
|
||||||
|
}
|
||||||
2
arch/x86_64/kernel/Makefile.arch.in
Normal file
2
arch/x86_64/kernel/Makefile.arch.in
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
IHK_OBJS += cpu.o interrupt.o memory.o trampoline.o local.o context.o
|
||||||
|
IHK_OBJS += perfctr.o syscall.o vsyscall.o
|
||||||
@@ -31,6 +31,7 @@
|
|||||||
#include <prctl.h>
|
#include <prctl.h>
|
||||||
#include <page.h>
|
#include <page.h>
|
||||||
#include <kmalloc.h>
|
#include <kmalloc.h>
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
#define LAPIC_ID 0x020
|
#define LAPIC_ID 0x020
|
||||||
#define LAPIC_TIMER 0x320
|
#define LAPIC_TIMER 0x320
|
||||||
@@ -69,11 +70,8 @@
|
|||||||
//#define DEBUG_PRINT_CPU
|
//#define DEBUG_PRINT_CPU
|
||||||
|
|
||||||
#ifdef DEBUG_PRINT_CPU
|
#ifdef DEBUG_PRINT_CPU
|
||||||
#define dkprintf kprintf
|
#undef DDEBUG_DEFAULT
|
||||||
#define ekprintf kprintf
|
#define DDEBUG_DEFAULT DDEBUG_PRINT
|
||||||
#else
|
|
||||||
#define dkprintf(...) do { if (0) kprintf(__VA_ARGS__); } while (0)
|
|
||||||
#define ekprintf kprintf
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void *lapic_vp;
|
static void *lapic_vp;
|
||||||
@@ -96,6 +94,8 @@ int gettime_local_support = 0;
|
|||||||
extern int ihk_mc_pt_print_pte(struct page_table *pt, void *virt);
|
extern int ihk_mc_pt_print_pte(struct page_table *pt, void *virt);
|
||||||
extern int kprintf(const char *format, ...);
|
extern int kprintf(const char *format, ...);
|
||||||
extern int interrupt_from_user(void *);
|
extern int interrupt_from_user(void *);
|
||||||
|
extern void perf_start(struct mc_perf_event *event);
|
||||||
|
extern void perf_reset(struct mc_perf_event *event);
|
||||||
|
|
||||||
static struct idt_entry{
|
static struct idt_entry{
|
||||||
uint32_t desc[4];
|
uint32_t desc[4];
|
||||||
@@ -847,8 +847,6 @@ void setup_x86_ap(void (*next_func)(void))
|
|||||||
}
|
}
|
||||||
|
|
||||||
void arch_show_interrupt_context(const void *reg);
|
void arch_show_interrupt_context(const void *reg);
|
||||||
void set_signal(int sig, void *regs, struct siginfo *info);
|
|
||||||
void check_signal(unsigned long, void *, int);
|
|
||||||
extern void tlb_flush_handler(int vector);
|
extern void tlb_flush_handler(int vector);
|
||||||
|
|
||||||
void __show_stack(uintptr_t *sp) {
|
void __show_stack(uintptr_t *sp) {
|
||||||
@@ -870,6 +868,19 @@ void show_context_stack(uintptr_t *rbp) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void interrupt_exit(struct x86_user_context *regs)
|
||||||
|
{
|
||||||
|
if (interrupt_from_user(regs)) {
|
||||||
|
cpu_enable_interrupt();
|
||||||
|
check_sig_pending();
|
||||||
|
check_need_resched();
|
||||||
|
check_signal(0, regs, -1);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
check_sig_pending();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void handle_interrupt(int vector, struct x86_user_context *regs)
|
void handle_interrupt(int vector, struct x86_user_context *regs)
|
||||||
{
|
{
|
||||||
struct ihk_mc_interrupt_handler *h;
|
struct ihk_mc_interrupt_handler *h;
|
||||||
@@ -992,14 +1003,16 @@ void handle_interrupt(int vector, struct x86_user_context *regs)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(interrupt_from_user(regs)){
|
interrupt_exit(regs);
|
||||||
cpu_enable_interrupt();
|
set_cputime(interrupt_from_user(regs)? 0: 1);
|
||||||
check_signal(0, regs, 0);
|
|
||||||
check_need_resched();
|
|
||||||
}
|
|
||||||
set_cputime(0);
|
|
||||||
|
|
||||||
--v->in_interrupt;
|
--v->in_interrupt;
|
||||||
|
|
||||||
|
/* for migration by IPI */
|
||||||
|
if (v->flags & CPU_FLAG_NEED_MIGRATE) {
|
||||||
|
schedule();
|
||||||
|
check_signal(0, regs, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void gpe_handler(struct x86_user_context *regs)
|
void gpe_handler(struct x86_user_context *regs)
|
||||||
@@ -1012,13 +1025,9 @@ void gpe_handler(struct x86_user_context *regs)
|
|||||||
panic("gpe_handler");
|
panic("gpe_handler");
|
||||||
}
|
}
|
||||||
set_signal(SIGSEGV, regs, NULL);
|
set_signal(SIGSEGV, regs, NULL);
|
||||||
if(interrupt_from_user(regs)){
|
interrupt_exit(regs);
|
||||||
cpu_enable_interrupt();
|
set_cputime(interrupt_from_user(regs)? 0: 1);
|
||||||
check_signal(0, regs, 0);
|
panic("GPF");
|
||||||
check_need_resched();
|
|
||||||
}
|
|
||||||
set_cputime(0);
|
|
||||||
// panic("GPF");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void debug_handler(struct x86_user_context *regs)
|
void debug_handler(struct x86_user_context *regs)
|
||||||
@@ -1045,12 +1054,8 @@ void debug_handler(struct x86_user_context *regs)
|
|||||||
memset(&info, '\0', sizeof info);
|
memset(&info, '\0', sizeof info);
|
||||||
info.si_code = si_code;
|
info.si_code = si_code;
|
||||||
set_signal(SIGTRAP, regs, &info);
|
set_signal(SIGTRAP, regs, &info);
|
||||||
if(interrupt_from_user(regs)){
|
interrupt_exit(regs);
|
||||||
cpu_enable_interrupt();
|
set_cputime(interrupt_from_user(regs)? 0: 1);
|
||||||
check_signal(0, regs, 0);
|
|
||||||
check_need_resched();
|
|
||||||
}
|
|
||||||
set_cputime(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void int3_handler(struct x86_user_context *regs)
|
void int3_handler(struct x86_user_context *regs)
|
||||||
@@ -1067,12 +1072,8 @@ void int3_handler(struct x86_user_context *regs)
|
|||||||
memset(&info, '\0', sizeof info);
|
memset(&info, '\0', sizeof info);
|
||||||
info.si_code = TRAP_BRKPT;
|
info.si_code = TRAP_BRKPT;
|
||||||
set_signal(SIGTRAP, regs, &info);
|
set_signal(SIGTRAP, regs, &info);
|
||||||
if(interrupt_from_user(regs)){
|
interrupt_exit(regs);
|
||||||
cpu_enable_interrupt();
|
set_cputime(interrupt_from_user(regs)? 0: 1);
|
||||||
check_signal(0, regs, 0);
|
|
||||||
check_need_resched();
|
|
||||||
}
|
|
||||||
set_cputime(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -1081,7 +1082,6 @@ unhandled_page_fault(struct thread *thread, void *fault_addr, void *regs)
|
|||||||
const uintptr_t address = (uintptr_t)fault_addr;
|
const uintptr_t address = (uintptr_t)fault_addr;
|
||||||
struct process_vm *vm = thread->vm;
|
struct process_vm *vm = thread->vm;
|
||||||
struct vm_range *range;
|
struct vm_range *range;
|
||||||
char found;
|
|
||||||
unsigned long irqflags;
|
unsigned long irqflags;
|
||||||
unsigned long error = ((struct x86_user_context *)regs)->gpr.error;
|
unsigned long error = ((struct x86_user_context *)regs)->gpr.error;
|
||||||
|
|
||||||
@@ -1095,17 +1095,12 @@ unhandled_page_fault(struct thread *thread, void *fault_addr, void *regs)
|
|||||||
(error & PF_RSVD ? "was" : "wasn't"),
|
(error & PF_RSVD ? "was" : "wasn't"),
|
||||||
(error & PF_INSTR ? "was" : "wasn't"));
|
(error & PF_INSTR ? "was" : "wasn't"));
|
||||||
|
|
||||||
found = 0;
|
range = lookup_process_memory_range(vm, address, address+1);
|
||||||
list_for_each_entry(range, &vm->vm_range_list, list) {
|
if (range) {
|
||||||
if (range->start <= address && range->end > address) {
|
__kprintf("address is in range, flag: 0x%lx\n",
|
||||||
found = 1;
|
range->flag);
|
||||||
__kprintf("address is in range, flag: 0x%lx\n",
|
ihk_mc_pt_print_pte(vm->address_space->page_table, (void*)address);
|
||||||
range->flag);
|
} else {
|
||||||
ihk_mc_pt_print_pte(vm->address_space->page_table, (void*)address);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!found) {
|
|
||||||
__kprintf("address is out of range! \n");
|
__kprintf("address is out of range! \n");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1473,29 +1468,91 @@ void ihk_mc_delay_us(int us)
|
|||||||
arch_delay(us);
|
arch_delay(us);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define EXTENDED_ARCH_SHOW_CONTEXT
|
|
||||||
#ifdef EXTENDED_ARCH_SHOW_CONTEXT
|
|
||||||
void arch_show_extended_context(void)
|
void arch_show_extended_context(void)
|
||||||
{
|
{
|
||||||
unsigned long cr0, cr4, msr, xcr0;
|
unsigned long cr0, cr4, msr, xcr0 = 0;
|
||||||
|
|
||||||
/* Read and print CRs, MSR_EFER, XCR0 */
|
/* Read and print CRs, MSR_EFER, XCR0 */
|
||||||
asm volatile("movq %%cr0, %0" : "=r"(cr0));
|
asm volatile("movq %%cr0, %0" : "=r"(cr0));
|
||||||
asm volatile("movq %%cr4, %0" : "=r"(cr4));
|
asm volatile("movq %%cr4, %0" : "=r"(cr4));
|
||||||
msr = rdmsr(MSR_EFER);
|
msr = rdmsr(MSR_EFER);
|
||||||
xcr0 = xgetbv(0);
|
if (xsave_available) {
|
||||||
|
xcr0 = xgetbv(0);
|
||||||
|
}
|
||||||
__kprintf("\n CR0 CR4\n");
|
__kprintf("\n CR0 CR4\n");
|
||||||
__kprintf("%016lX %016lX\n", cr0, cr4);
|
__kprintf("%016lX %016lX\n", cr0, cr4);
|
||||||
|
|
||||||
__kprintf(" MSR_EFER\n");
|
__kprintf(" MSR_EFER\n");
|
||||||
__kprintf("%016lX\n", msr);
|
__kprintf("%016lX\n", msr);
|
||||||
|
|
||||||
__kprintf(" XCR0\n");
|
if (xsave_available) {
|
||||||
__kprintf("%016lX\n", xcr0);
|
__kprintf(" XCR0\n");
|
||||||
|
__kprintf("%016lX\n", xcr0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct stack {
|
||||||
|
struct stack *rbp;
|
||||||
|
unsigned long eip;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* KPRINTF_LOCAL_BUF_LEN is 1024, useless to go further */
|
||||||
|
#define STACK_BUF_LEN (1024-sizeof("[ 0]: "))
|
||||||
|
static void __print_stack(struct stack *rbp, unsigned long first) {
|
||||||
|
char buf[STACK_BUF_LEN];
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
/* Build string in buffer to output a single line */
|
||||||
|
len = snprintf(buf, STACK_BUF_LEN,
|
||||||
|
"addr2line -e smp-x86/kernel/mckernel.img -fpia");
|
||||||
|
|
||||||
|
if (first)
|
||||||
|
len += snprintf(buf + len, STACK_BUF_LEN - len,
|
||||||
|
" %#16lx", first);
|
||||||
|
|
||||||
|
while ((unsigned long)rbp > 0xffff880000000000 &&
|
||||||
|
STACK_BUF_LEN - len > sizeof(" 0x0123456789abcdef")) {
|
||||||
|
len += snprintf(buf + len, STACK_BUF_LEN - len,
|
||||||
|
" %#16lx", rbp->eip);
|
||||||
|
rbp = rbp->rbp;
|
||||||
|
}
|
||||||
|
__kprintf("%s\n", buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
void arch_print_pre_interrupt_stack(const struct x86_basic_regs *regs) {
|
||||||
|
struct stack *rbp;
|
||||||
|
|
||||||
|
/* only for kernel stack */
|
||||||
|
if (regs->error & PF_USER)
|
||||||
|
return;
|
||||||
|
|
||||||
|
__kprintf("Pre-interrupt stack trace:\n");
|
||||||
|
|
||||||
|
/* interrupt stack heuristics:
|
||||||
|
* - the first entry looks like it is always garbage, so skip.
|
||||||
|
* (that is done by taking regs->rsp instead of ®s->rsp)
|
||||||
|
* - that still looks sometimes wrong. For now, if it is not
|
||||||
|
* within 64k of itself, look for the next entry that matches.
|
||||||
|
*/
|
||||||
|
|
||||||
|
rbp = (struct stack*)regs->rsp;
|
||||||
|
|
||||||
|
while ((uintptr_t)rbp > (uintptr_t)rbp->rbp
|
||||||
|
|| (uintptr_t)rbp + 0x10000 < (uintptr_t)rbp->rbp)
|
||||||
|
rbp = (struct stack *)(((uintptr_t *)rbp) + 1);
|
||||||
|
|
||||||
|
__print_stack(rbp, regs->rip);
|
||||||
|
}
|
||||||
|
|
||||||
|
void arch_print_stack() {
|
||||||
|
struct stack *rbp;
|
||||||
|
|
||||||
|
__kprintf("Approximative stack trace:\n");
|
||||||
|
|
||||||
|
asm("mov %%rbp, %0" : "=r"(rbp) );
|
||||||
|
|
||||||
|
__print_stack(rbp, 0);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
/*@
|
/*@
|
||||||
@ requires \valid(reg);
|
@ requires \valid(reg);
|
||||||
@@ -1526,9 +1583,11 @@ void arch_show_interrupt_context(const void *reg)
|
|||||||
__kprintf("%16lx %16lx %16lx %16lx\n",
|
__kprintf("%16lx %16lx %16lx %16lx\n",
|
||||||
regs->cs, regs->ss, regs->rflags, regs->error);
|
regs->cs, regs->ss, regs->rflags, regs->error);
|
||||||
|
|
||||||
#ifdef EXTENDED_ARCH_SHOW_CONTEXT
|
kprintf_unlock(irqflags);
|
||||||
arch_show_extended_context();
|
return;
|
||||||
#endif
|
arch_show_extended_context();
|
||||||
|
|
||||||
|
arch_print_pre_interrupt_stack(regs);
|
||||||
|
|
||||||
kprintf_unlock(irqflags);
|
kprintf_unlock(irqflags);
|
||||||
}
|
}
|
||||||
@@ -1588,12 +1647,10 @@ int ihk_mc_interrupt_cpu(int cpu, int vector)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef POSTK_DEBUG_ARCH_DEP_22
|
|
||||||
extern void perf_start(struct mc_perf_event *event);
|
|
||||||
extern void perf_reset(struct mc_perf_event *event);
|
|
||||||
struct thread *arch_switch_context(struct thread *prev, struct thread *next)
|
struct thread *arch_switch_context(struct thread *prev, struct thread *next)
|
||||||
{
|
{
|
||||||
struct thread *last;
|
struct thread *last;
|
||||||
|
struct mcs_rwlock_node_irqsave lock;
|
||||||
|
|
||||||
dkprintf("[%d] schedule: tlsblock_base: 0x%lX\n",
|
dkprintf("[%d] schedule: tlsblock_base: 0x%lX\n",
|
||||||
ihk_mc_get_processor_id(), next->tlsblock_base);
|
ihk_mc_get_processor_id(), next->tlsblock_base);
|
||||||
@@ -1612,7 +1669,7 @@ struct thread *arch_switch_context(struct thread *prev, struct thread *next)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef PROFILE_ENABLE
|
#ifdef PROFILE_ENABLE
|
||||||
if (prev->profile && prev->profile_start_ts != 0) {
|
if (prev && prev->profile && prev->profile_start_ts != 0) {
|
||||||
prev->profile_elapsed_ts +=
|
prev->profile_elapsed_ts +=
|
||||||
(rdtsc() - prev->profile_start_ts);
|
(rdtsc() - prev->profile_start_ts);
|
||||||
prev->profile_start_ts = 0;
|
prev->profile_start_ts = 0;
|
||||||
@@ -1624,6 +1681,28 @@ struct thread *arch_switch_context(struct thread *prev, struct thread *next)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (prev) {
|
if (prev) {
|
||||||
|
mcs_rwlock_writer_lock(&prev->proc->update_lock, &lock);
|
||||||
|
if (prev->proc->status & (PS_DELAY_STOPPED | PS_DELAY_TRACED)) {
|
||||||
|
switch (prev->proc->status) {
|
||||||
|
case PS_DELAY_STOPPED:
|
||||||
|
prev->proc->status = PS_STOPPED;
|
||||||
|
break;
|
||||||
|
case PS_DELAY_TRACED:
|
||||||
|
prev->proc->status = PS_TRACED;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
mcs_rwlock_writer_unlock(&prev->proc->update_lock,
|
||||||
|
&lock);
|
||||||
|
|
||||||
|
/* Wake up the parent who tried wait4 and sleeping */
|
||||||
|
waitq_wakeup(&prev->proc->parent->waitpid_q);
|
||||||
|
} else {
|
||||||
|
mcs_rwlock_writer_unlock(&prev->proc->update_lock,
|
||||||
|
&lock);
|
||||||
|
}
|
||||||
|
|
||||||
last = ihk_mc_switch_context(&prev->ctx, &next->ctx, prev);
|
last = ihk_mc_switch_context(&prev->ctx, &next->ctx, prev);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -1631,7 +1710,6 @@ struct thread *arch_switch_context(struct thread *prev, struct thread *next)
|
|||||||
}
|
}
|
||||||
return last;
|
return last;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
/*@
|
/*@
|
||||||
@ requires \valid(thread);
|
@ requires \valid(thread);
|
||||||
@@ -1651,13 +1729,11 @@ release_fp_regs(struct thread *thread)
|
|||||||
thread->fp_regs = NULL;
|
thread->fp_regs = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*@
|
static int
|
||||||
@ requires \valid(thread);
|
check_and_allocate_fp_regs(struct thread *thread)
|
||||||
@*/
|
|
||||||
void
|
|
||||||
save_fp_regs(struct thread *thread)
|
|
||||||
{
|
{
|
||||||
int pages;
|
int pages;
|
||||||
|
int result = 0;
|
||||||
|
|
||||||
if (!thread->fp_regs) {
|
if (!thread->fp_regs) {
|
||||||
pages = (xsave_size + (PAGE_SIZE - 1)) >> PAGE_SHIFT;
|
pages = (xsave_size + (PAGE_SIZE - 1)) >> PAGE_SHIFT;
|
||||||
@@ -1666,12 +1742,26 @@ save_fp_regs(struct thread *thread)
|
|||||||
|
|
||||||
if (!thread->fp_regs) {
|
if (!thread->fp_regs) {
|
||||||
kprintf("error: allocating fp_regs pages\n");
|
kprintf("error: allocating fp_regs pages\n");
|
||||||
return;
|
result = 1;
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(thread->fp_regs, 0, sizeof(fp_regs_struct));
|
|
||||||
memset(thread->fp_regs, 0, pages * PAGE_SIZE);
|
memset(thread->fp_regs, 0, pages * PAGE_SIZE);
|
||||||
}
|
}
|
||||||
|
out:
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*@
|
||||||
|
@ requires \valid(thread);
|
||||||
|
@*/
|
||||||
|
void
|
||||||
|
save_fp_regs(struct thread *thread)
|
||||||
|
{
|
||||||
|
if (check_and_allocate_fp_regs(thread) != 0) {
|
||||||
|
// alloc error
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (xsave_available) {
|
if (xsave_available) {
|
||||||
unsigned int low, high;
|
unsigned int low, high;
|
||||||
@@ -1687,13 +1777,12 @@ save_fp_regs(struct thread *thread)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef POSTK_DEBUG_TEMP_FIX_19
|
void copy_fp_regs(struct thread *from, struct thread *to)
|
||||||
void
|
|
||||||
clear_fp_regs(struct thread *thread)
|
|
||||||
{
|
{
|
||||||
return;
|
if ((from->fp_regs != NULL) && (check_and_allocate_fp_regs(to) == 0)) {
|
||||||
|
memcpy(to->fp_regs, from->fp_regs, sizeof(fp_regs_struct));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif /* POSTK_DEBUG_TEMP_FIX_19 */
|
|
||||||
|
|
||||||
/*@
|
/*@
|
||||||
@ requires \valid(thread);
|
@ requires \valid(thread);
|
||||||
@@ -1702,8 +1791,11 @@ clear_fp_regs(struct thread *thread)
|
|||||||
void
|
void
|
||||||
restore_fp_regs(struct thread *thread)
|
restore_fp_regs(struct thread *thread)
|
||||||
{
|
{
|
||||||
if (!thread->fp_regs)
|
if (!thread->fp_regs) {
|
||||||
|
// only clear fpregs.
|
||||||
|
clear_fp_regs();
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (xsave_available) {
|
if (xsave_available) {
|
||||||
unsigned int low, high;
|
unsigned int low, high;
|
||||||
@@ -1722,6 +1814,13 @@ restore_fp_regs(struct thread *thread)
|
|||||||
//release_fp_regs(thread);
|
//release_fp_regs(thread);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void clear_fp_regs(void)
|
||||||
|
{
|
||||||
|
struct cpu_local_var *v = get_this_cpu_local_var();
|
||||||
|
|
||||||
|
restore_fp_regs(&v->idle);
|
||||||
|
}
|
||||||
|
|
||||||
ihk_mc_user_context_t *lookup_user_context(struct thread *thread)
|
ihk_mc_user_context_t *lookup_user_context(struct thread *thread)
|
||||||
{
|
{
|
||||||
ihk_mc_user_context_t *uctx = thread->uctx;
|
ihk_mc_user_context_t *uctx = thread->uctx;
|
||||||
@@ -6,6 +6,7 @@
|
|||||||
#include <process.h>
|
#include <process.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <elfcore.h>
|
#include <elfcore.h>
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
#define align32(x) ((((x) + 3) / 4) * 4)
|
#define align32(x) ((((x) + 3) / 4) * 4)
|
||||||
#define alignpage(x) ((((x) + (PAGE_SIZE) - 1) / (PAGE_SIZE)) * (PAGE_SIZE))
|
#define alignpage(x) ((((x) + (PAGE_SIZE) - 1) / (PAGE_SIZE)) * (PAGE_SIZE))
|
||||||
@@ -13,13 +14,16 @@
|
|||||||
//#define DEBUG_PRINT_GENCORE
|
//#define DEBUG_PRINT_GENCORE
|
||||||
|
|
||||||
#ifdef DEBUG_PRINT_GENCORE
|
#ifdef DEBUG_PRINT_GENCORE
|
||||||
#define dkprintf(...) kprintf(__VA_ARGS__)
|
#undef DDEBUG_DEFAULT
|
||||||
#define ekprintf(...) kprintf(__VA_ARGS__)
|
#define DDEBUG_DEFAULT DDEBUG_PRINT
|
||||||
#else
|
|
||||||
#define dkprintf(...) do { if (0) kprintf(__VA_ARGS__); } while (0)
|
|
||||||
#define ekprintf(...) kprintf(__VA_ARGS__)
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Exclude reserved (mckernel's internal use), device file,
|
||||||
|
* hole created by mprotect
|
||||||
|
*/
|
||||||
|
#define GENCORE_RANGE_IS_INACCESSIBLE(range) \
|
||||||
|
((range->flag & (VR_RESERVED | VR_MEMTYPE_UC | VR_DONTDUMP)))
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Generate a core file image, which consists of many chunks.
|
* Generate a core file image, which consists of many chunks.
|
||||||
* Returns an allocated table, an etnry of which is a pair of the address
|
* Returns an allocated table, an etnry of which is a pair of the address
|
||||||
@@ -289,7 +293,7 @@ int gencore(struct thread *thread, void *regs,
|
|||||||
Elf64_Ehdr eh;
|
Elf64_Ehdr eh;
|
||||||
Elf64_Phdr *ph = NULL;
|
Elf64_Phdr *ph = NULL;
|
||||||
void *note = NULL;
|
void *note = NULL;
|
||||||
struct vm_range *range;
|
struct vm_range *range, *next;
|
||||||
struct process_vm *vm = thread->vm;
|
struct process_vm *vm = thread->vm;
|
||||||
int segs = 1; /* the first one is for NOTE */
|
int segs = 1; /* the first one is for NOTE */
|
||||||
int notesize, phsize, alignednotesize;
|
int notesize, phsize, alignednotesize;
|
||||||
@@ -303,13 +307,16 @@ int gencore(struct thread *thread, void *regs,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
list_for_each_entry(range, &vm->vm_range_list, list) {
|
next = lookup_process_memory_range(vm, 0, -1);
|
||||||
|
while ((range = next)) {
|
||||||
|
next = next_process_memory_range(vm, range);
|
||||||
|
|
||||||
dkprintf("start:%lx end:%lx flag:%lx objoff:%lx\n",
|
dkprintf("start:%lx end:%lx flag:%lx objoff:%lx\n",
|
||||||
range->start, range->end, range->flag, range->objoff);
|
range->start, range->end, range->flag, range->objoff);
|
||||||
/* We omit reserved areas because they are only for
|
|
||||||
mckernel's internal use. */
|
if (GENCORE_RANGE_IS_INACCESSIBLE(range)) {
|
||||||
if (range->flag & VR_RESERVED)
|
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
/* We need a chunk for each page for a demand paging area.
|
/* We need a chunk for each page for a demand paging area.
|
||||||
This can be optimized for spacial complexity but we would
|
This can be optimized for spacial complexity but we would
|
||||||
lose simplicity instead. */
|
lose simplicity instead. */
|
||||||
@@ -391,12 +398,16 @@ int gencore(struct thread *thread, void *regs,
|
|||||||
|
|
||||||
/* program header for each memory chunk */
|
/* program header for each memory chunk */
|
||||||
i = 1;
|
i = 1;
|
||||||
list_for_each_entry(range, &vm->vm_range_list, list) {
|
next = lookup_process_memory_range(vm, 0, -1);
|
||||||
|
while ((range = next)) {
|
||||||
|
next = next_process_memory_range(vm, range);
|
||||||
|
|
||||||
unsigned long flag = range->flag;
|
unsigned long flag = range->flag;
|
||||||
unsigned long size = range->end - range->start;
|
unsigned long size = range->end - range->start;
|
||||||
|
|
||||||
if (range->flag & VR_RESERVED)
|
if (GENCORE_RANGE_IS_INACCESSIBLE(range)) {
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
ph[i].p_type = PT_LOAD;
|
ph[i].p_type = PT_LOAD;
|
||||||
ph[i].p_flags = ((flag & VR_PROT_READ) ? PF_R : 0)
|
ph[i].p_flags = ((flag & VR_PROT_READ) ? PF_R : 0)
|
||||||
@@ -432,11 +443,15 @@ int gencore(struct thread *thread, void *regs,
|
|||||||
dkprintf("coretable[2]: %lx@%lx(%lx)\n", ct[2].len, ct[2].addr, note);
|
dkprintf("coretable[2]: %lx@%lx(%lx)\n", ct[2].len, ct[2].addr, note);
|
||||||
|
|
||||||
i = 3; /* memory segments */
|
i = 3; /* memory segments */
|
||||||
list_for_each_entry(range, &vm->vm_range_list, list) {
|
next = lookup_process_memory_range(vm, 0, -1);
|
||||||
|
while ((range = next)) {
|
||||||
|
next = next_process_memory_range(vm, range);
|
||||||
|
|
||||||
unsigned long phys;
|
unsigned long phys;
|
||||||
|
|
||||||
if (range->flag & VR_RESERVED)
|
if (GENCORE_RANGE_IS_INACCESSIBLE(range)) {
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
if (range->flag & VR_DEMAND_PAGING) {
|
if (range->flag & VR_DEMAND_PAGING) {
|
||||||
/* Just an ad hoc kluge. */
|
/* Just an ad hoc kluge. */
|
||||||
unsigned long p, start, phys;
|
unsigned long p, start, phys;
|
||||||
@@ -64,13 +64,13 @@ static inline int futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval,
|
|||||||
return oldval;
|
return oldval;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef POSTK_DEBUG_ARCH_DEP_8 /* arch depend hide */
|
static inline int futex_atomic_op_inuser(int encoded_op,
|
||||||
static inline int futex_atomic_op_inuser(int encoded_op, int __user *uaddr)
|
int __user *uaddr)
|
||||||
{
|
{
|
||||||
int op = (encoded_op >> 28) & 7;
|
int op = (encoded_op >> 28) & 7;
|
||||||
int cmp = (encoded_op >> 24) & 15;
|
int cmp = (encoded_op >> 24) & 15;
|
||||||
int oparg = (encoded_op << 8) >> 20;
|
int oparg = (encoded_op & 0x00fff000) >> 12;
|
||||||
int cmparg = (encoded_op << 20) >> 20;
|
int cmparg = encoded_op & 0xfff;
|
||||||
int oldval = 0, ret, tem;
|
int oldval = 0, ret, tem;
|
||||||
|
|
||||||
if (encoded_op & (FUTEX_OP_OPARG_SHIFT << 28))
|
if (encoded_op & (FUTEX_OP_OPARG_SHIFT << 28))
|
||||||
@@ -128,6 +128,13 @@ static inline int futex_atomic_op_inuser(int encoded_op, int __user *uaddr)
|
|||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
#endif /* !POSTK_DEBUG_ARCH_DEP_8 */
|
|
||||||
|
static inline int get_futex_value_locked(uint32_t *dest, uint32_t *from)
|
||||||
|
{
|
||||||
|
|
||||||
|
*dest = *(volatile uint32_t *)from;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
#include <ihk/cpu.h>
|
#include <ihk/cpu.h>
|
||||||
#include <ihk/atomic.h>
|
#include <ihk/atomic.h>
|
||||||
|
#include <lwk/compiler.h>
|
||||||
|
|
||||||
//#define DEBUG_SPINLOCK
|
//#define DEBUG_SPINLOCK
|
||||||
//#define DEBUG_MCS_RWLOCK
|
//#define DEBUG_MCS_RWLOCK
|
||||||
@@ -14,7 +15,17 @@
|
|||||||
int __kprintf(const char *format, ...);
|
int __kprintf(const char *format, ...);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef int ihk_spinlock_t;
|
typedef unsigned short __ticket_t;
|
||||||
|
typedef unsigned int __ticketpair_t;
|
||||||
|
|
||||||
|
typedef struct ihk_spinlock {
|
||||||
|
union {
|
||||||
|
__ticketpair_t head_tail;
|
||||||
|
struct __raw_tickets {
|
||||||
|
__ticket_t head, tail;
|
||||||
|
} tickets;
|
||||||
|
};
|
||||||
|
} ihk_spinlock_t;
|
||||||
|
|
||||||
extern void preempt_enable(void);
|
extern void preempt_enable(void);
|
||||||
extern void preempt_disable(void);
|
extern void preempt_disable(void);
|
||||||
@@ -23,9 +34,61 @@ extern void preempt_disable(void);
|
|||||||
|
|
||||||
static void ihk_mc_spinlock_init(ihk_spinlock_t *lock)
|
static void ihk_mc_spinlock_init(ihk_spinlock_t *lock)
|
||||||
{
|
{
|
||||||
*lock = 0;
|
lock->head_tail = 0;
|
||||||
|
}
|
||||||
|
#define SPIN_LOCK_UNLOCKED { .head_tail = 0 }
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef DEBUG_SPINLOCK
|
||||||
|
#define ihk_mc_spinlock_trylock_noirq(l) { int rc; \
|
||||||
|
__kprintf("[%d] call ihk_mc_spinlock_trylock_noirq %p %s:%d\n", ihk_mc_get_processor_id(), (l), __FILE__, __LINE__); \
|
||||||
|
rc = __ihk_mc_spinlock_trylock_noirq(l); \
|
||||||
|
__kprintf("[%d] ret ihk_mc_spinlock_trylock_noirq\n", ihk_mc_get_processor_id()); rc; \
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#define ihk_mc_spinlock_trylock_noirq __ihk_mc_spinlock_trylock_noirq
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static int __ihk_mc_spinlock_trylock_noirq(ihk_spinlock_t *lock)
|
||||||
|
{
|
||||||
|
ihk_spinlock_t cur = { .head_tail = lock->head_tail };
|
||||||
|
ihk_spinlock_t next = { .tickets.head = cur.tickets.head, .tickets.tail = cur.tickets.tail + 2 };
|
||||||
|
int success;
|
||||||
|
|
||||||
|
if (cur.tickets.head != cur.tickets.tail) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
preempt_disable();
|
||||||
|
|
||||||
|
/* Use the same increment amount as other functions! */
|
||||||
|
success = __sync_bool_compare_and_swap((__ticketpair_t*)lock, cur.head_tail, next.head_tail);
|
||||||
|
|
||||||
|
if (!success) {
|
||||||
|
preempt_enable();
|
||||||
|
}
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef DEBUG_SPINLOCK
|
||||||
|
#define ihk_mc_spinlock_trylock(l, result) ({ unsigned long rc; \
|
||||||
|
__kprintf("[%d] call ihk_mc_spinlock_trylock %p %s:%d\n", ihk_mc_get_processor_id(), (l), __FILE__, __LINE__); \
|
||||||
|
rc = __ihk_mc_spinlock_trylock(l, result); \
|
||||||
|
__kprintf("[%d] ret ihk_mc_spinlock_trylock\n", ihk_mc_get_processor_id()); rc;\
|
||||||
|
})
|
||||||
|
#else
|
||||||
|
#define ihk_mc_spinlock_trylock __ihk_mc_spinlock_trylock
|
||||||
|
#endif
|
||||||
|
static unsigned long __ihk_mc_spinlock_trylock(ihk_spinlock_t *lock, int *result)
|
||||||
|
{
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
|
flags = cpu_disable_interrupt_save();
|
||||||
|
|
||||||
|
*result = __ihk_mc_spinlock_trylock_noirq(lock);
|
||||||
|
|
||||||
|
return flags;
|
||||||
}
|
}
|
||||||
#define SPIN_LOCK_UNLOCKED 0
|
|
||||||
|
|
||||||
#ifdef DEBUG_SPINLOCK
|
#ifdef DEBUG_SPINLOCK
|
||||||
#define ihk_mc_spinlock_lock_noirq(l) { \
|
#define ihk_mc_spinlock_lock_noirq(l) { \
|
||||||
@@ -39,40 +102,24 @@ __kprintf("[%d] ret ihk_mc_spinlock_lock_noirq\n", ihk_mc_get_processor_id()); \
|
|||||||
|
|
||||||
static void __ihk_mc_spinlock_lock_noirq(ihk_spinlock_t *lock)
|
static void __ihk_mc_spinlock_lock_noirq(ihk_spinlock_t *lock)
|
||||||
{
|
{
|
||||||
int inc = 0x00010000;
|
register struct __raw_tickets inc = { .tail = 0x0002 };
|
||||||
int tmp;
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
asm volatile("lock ; xaddl %0, %1\n"
|
|
||||||
"movzwl %w0, %2\n\t"
|
|
||||||
"shrl $16, %0\n\t"
|
|
||||||
"1:\t"
|
|
||||||
"cmpl %0, %2\n\t"
|
|
||||||
"je 2f\n\t"
|
|
||||||
"rep ; nop\n\t"
|
|
||||||
"movzwl %1, %2\n\t"
|
|
||||||
"jmp 1b\n"
|
|
||||||
"2:"
|
|
||||||
: "+Q" (inc), "+m" (*lock), "=r" (tmp) : : "memory", "cc");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
preempt_disable();
|
preempt_disable();
|
||||||
|
|
||||||
asm volatile("lock; xaddl %0, %1\n"
|
asm volatile ("lock xaddl %0, %1\n"
|
||||||
"movzwl %w0, %2\n\t"
|
: "+r" (inc), "+m" (*(lock)) : : "memory", "cc");
|
||||||
"shrl $16, %0\n\t"
|
|
||||||
"1:\t"
|
|
||||||
"cmpl %0, %2\n\t"
|
|
||||||
"je 2f\n\t"
|
|
||||||
"rep ; nop\n\t"
|
|
||||||
"movzwl %1, %2\n\t"
|
|
||||||
/* don't need lfence here, because loads are in-order */
|
|
||||||
"jmp 1b\n"
|
|
||||||
"2:"
|
|
||||||
: "+r" (inc), "+m" (*lock), "=&r" (tmp)
|
|
||||||
:
|
|
||||||
: "memory", "cc");
|
|
||||||
|
|
||||||
|
if (inc.head == inc.tail)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
if (*((volatile __ticket_t *)&lock->tickets.head) == inc.tail)
|
||||||
|
goto out;
|
||||||
|
cpu_pause();
|
||||||
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
|
barrier(); /* make sure nothing creeps before the lock is taken */
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DEBUG_SPINLOCK
|
#ifdef DEBUG_SPINLOCK
|
||||||
@@ -106,7 +153,10 @@ __kprintf("[%d] ret ihk_mc_spinlock_unlock_noirq\n", ihk_mc_get_processor_id());
|
|||||||
#endif
|
#endif
|
||||||
static void __ihk_mc_spinlock_unlock_noirq(ihk_spinlock_t *lock)
|
static void __ihk_mc_spinlock_unlock_noirq(ihk_spinlock_t *lock)
|
||||||
{
|
{
|
||||||
asm volatile ("lock incw %0" : "+m"(*lock) : : "memory", "cc");
|
__ticket_t inc = 0x0002;
|
||||||
|
|
||||||
|
asm volatile ("lock addw %1, %0\n"
|
||||||
|
: "+m" (lock->tickets.head) : "ri" (inc) : "memory", "cc");
|
||||||
|
|
||||||
preempt_enable();
|
preempt_enable();
|
||||||
}
|
}
|
||||||
@@ -134,6 +184,8 @@ typedef struct mcs_lock_node {
|
|||||||
unsigned long irqsave;
|
unsigned long irqsave;
|
||||||
} __attribute__((aligned(64))) mcs_lock_node_t;
|
} __attribute__((aligned(64))) mcs_lock_node_t;
|
||||||
|
|
||||||
|
typedef mcs_lock_node_t mcs_lock_t;
|
||||||
|
|
||||||
static void mcs_lock_init(struct mcs_lock_node *node)
|
static void mcs_lock_init(struct mcs_lock_node *node)
|
||||||
{
|
{
|
||||||
node->locked = 0;
|
node->locked = 0;
|
||||||
@@ -600,4 +652,9 @@ __mcs_rwlock_reader_unlock(struct mcs_rwlock_lock *lock, struct mcs_rwlock_node_
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int irqflags_can_interrupt(unsigned long flags)
|
||||||
|
{
|
||||||
|
return !!(flags & 0x200);
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -42,16 +42,34 @@
|
|||||||
|
|
||||||
#define USER_END 0x0000800000000000UL
|
#define USER_END 0x0000800000000000UL
|
||||||
#define TASK_UNMAPPED_BASE 0x00002AAAAAA00000UL
|
#define TASK_UNMAPPED_BASE 0x00002AAAAAA00000UL
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Canonical negative addresses (i.e., the smallest kernel virtual address)
|
||||||
|
* on x86 64 bit mode (in its most restricted 48 bit format) starts from
|
||||||
|
* 0xffff800000000000, but Linux starts mapping physical memory at 0xffff880000000000.
|
||||||
|
* The 0x80000000000 long gap (8TBs, i.e., 16 PGD level entries in the page tables)
|
||||||
|
* is used for Xen hyervisor (see arch/x86/include/asm/page.h) and that is
|
||||||
|
* what we utilize for McKernel.
|
||||||
|
* This gives us the benefit of being able to use Linux kernel virtual
|
||||||
|
* addresses identically as in Linux.
|
||||||
|
*
|
||||||
|
* NOTE: update these also in eclair.c when modified!
|
||||||
|
*/
|
||||||
#define MAP_ST_START 0xffff800000000000UL
|
#define MAP_ST_START 0xffff800000000000UL
|
||||||
#define MAP_VMAP_START 0xfffff00000000000UL
|
#define MAP_VMAP_START 0xffff850000000000UL
|
||||||
#define MAP_FIXED_START 0xffffffff70000000UL
|
#define MAP_FIXED_START 0xffff860000000000UL
|
||||||
#define MAP_KERNEL_START 0xffffffff80000000UL
|
#define LINUX_PAGE_OFFSET 0xffff880000000000UL
|
||||||
|
/*
|
||||||
|
* MAP_KERNEL_START is 8MB below MODULES_END in Linux.
|
||||||
|
* Placing the LWK image in the virtual address space at the end of
|
||||||
|
* the Linux modules section enables us to map the LWK TEXT in Linux
|
||||||
|
* as well, so that Linux can also call into LWK text.
|
||||||
|
*/
|
||||||
|
#define MAP_KERNEL_START 0xFFFFFFFFFE800000UL
|
||||||
#define STACK_TOP(region) ((region)->user_end)
|
#define STACK_TOP(region) ((region)->user_end)
|
||||||
|
|
||||||
#define MAP_VMAP_SIZE 0x0000000100000000UL
|
#define MAP_VMAP_SIZE 0x0000000100000000UL
|
||||||
|
|
||||||
#define KERNEL_PHYS_OFFSET MAP_ST_START
|
|
||||||
|
|
||||||
#define PTL4_SHIFT 39
|
#define PTL4_SHIFT 39
|
||||||
#define PTL4_SIZE (1UL << PTL4_SHIFT)
|
#define PTL4_SIZE (1UL << PTL4_SHIFT)
|
||||||
#define PTL3_SHIFT 30
|
#define PTL3_SHIFT 30
|
||||||
@@ -13,16 +13,16 @@
|
|||||||
#ifndef ARCH_CPU_H
|
#ifndef ARCH_CPU_H
|
||||||
#define ARCH_CPU_H
|
#define ARCH_CPU_H
|
||||||
|
|
||||||
#include <ihk/cpu.h>
|
#define arch_barrier() asm volatile("" : : : "memory")
|
||||||
|
|
||||||
static inline void rmb(void)
|
static inline void rmb(void)
|
||||||
{
|
{
|
||||||
barrier();
|
arch_barrier();
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void wmb(void)
|
static inline void wmb(void)
|
||||||
{
|
{
|
||||||
barrier();
|
arch_barrier();
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned long read_tsc(void)
|
static unsigned long read_tsc(void)
|
||||||
@@ -49,6 +49,7 @@ typedef struct x86_user_context ihk_mc_user_context_t;
|
|||||||
#define ihk_mc_syscall_arg5(uc) (uc)->gpr.r9
|
#define ihk_mc_syscall_arg5(uc) (uc)->gpr.r9
|
||||||
|
|
||||||
#define ihk_mc_syscall_ret(uc) (uc)->gpr.rax
|
#define ihk_mc_syscall_ret(uc) (uc)->gpr.rax
|
||||||
|
#define ihk_mc_syscall_number(uc) (uc)->gpr.orig_rax
|
||||||
|
|
||||||
#define ihk_mc_syscall_pc(uc) (uc)->gpr.rip
|
#define ihk_mc_syscall_pc(uc) (uc)->gpr.rip
|
||||||
#define ihk_mc_syscall_sp(uc) (uc)->gpr.rsp
|
#define ihk_mc_syscall_sp(uc) (uc)->gpr.rsp
|
||||||
@@ -189,9 +189,30 @@ struct tss64 {
|
|||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
|
|
||||||
struct x86_basic_regs {
|
struct x86_basic_regs {
|
||||||
unsigned long r15, r14, r13, r12, rbp, rbx, r11, r10;
|
unsigned long r15;
|
||||||
unsigned long r9, r8, rax, rcx, rdx, rsi, rdi, error;
|
unsigned long r14;
|
||||||
unsigned long rip, cs, rflags, rsp, ss;
|
unsigned long r13;
|
||||||
|
unsigned long r12;
|
||||||
|
unsigned long rbp;
|
||||||
|
unsigned long rbx;
|
||||||
|
unsigned long r11;
|
||||||
|
unsigned long r10;
|
||||||
|
unsigned long r9;
|
||||||
|
unsigned long r8;
|
||||||
|
unsigned long rax;
|
||||||
|
unsigned long rcx;
|
||||||
|
unsigned long rdx;
|
||||||
|
unsigned long rsi;
|
||||||
|
unsigned long rdi;
|
||||||
|
union {
|
||||||
|
unsigned long orig_rax; /* syscall */
|
||||||
|
unsigned long error; /* interrupts */
|
||||||
|
};
|
||||||
|
unsigned long rip;
|
||||||
|
unsigned long cs;
|
||||||
|
unsigned long rflags;
|
||||||
|
unsigned long rsp;
|
||||||
|
unsigned long ss;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct x86_sregs {
|
struct x86_sregs {
|
||||||
@@ -18,6 +18,11 @@
|
|||||||
#define _NSIG_BPW 64
|
#define _NSIG_BPW 64
|
||||||
#define _NSIG_WORDS (_NSIG / _NSIG_BPW)
|
#define _NSIG_WORDS (_NSIG / _NSIG_BPW)
|
||||||
|
|
||||||
|
static inline int valid_signal(unsigned long sig)
|
||||||
|
{
|
||||||
|
return sig <= _NSIG ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
typedef unsigned long int __sigset_t;
|
typedef unsigned long int __sigset_t;
|
||||||
#define __sigmask(sig) (((__sigset_t) 1) << ((sig) - 1))
|
#define __sigmask(sig) (((__sigset_t) 1) << ((sig) - 1))
|
||||||
|
|
||||||
@@ -56,7 +56,7 @@ SYSCALL_HANDLED(36, getitimer)
|
|||||||
SYSCALL_HANDLED(38, setitimer)
|
SYSCALL_HANDLED(38, setitimer)
|
||||||
SYSCALL_HANDLED(39, getpid)
|
SYSCALL_HANDLED(39, getpid)
|
||||||
SYSCALL_HANDLED(56, clone)
|
SYSCALL_HANDLED(56, clone)
|
||||||
SYSCALL_DELEGATED(57, fork)
|
SYSCALL_HANDLED(57, fork)
|
||||||
SYSCALL_HANDLED(58, vfork)
|
SYSCALL_HANDLED(58, vfork)
|
||||||
SYSCALL_HANDLED(59, execve)
|
SYSCALL_HANDLED(59, execve)
|
||||||
SYSCALL_HANDLED(60, exit)
|
SYSCALL_HANDLED(60, exit)
|
||||||
@@ -114,7 +114,7 @@ SYSCALL_HANDLED(160, setrlimit)
|
|||||||
SYSCALL_HANDLED(164, settimeofday)
|
SYSCALL_HANDLED(164, settimeofday)
|
||||||
SYSCALL_HANDLED(186, gettid)
|
SYSCALL_HANDLED(186, gettid)
|
||||||
SYSCALL_HANDLED(200, tkill)
|
SYSCALL_HANDLED(200, tkill)
|
||||||
SYSCALL_DELEGATED(201, time)
|
SYSCALL_HANDLED(201, time)
|
||||||
SYSCALL_HANDLED(202, futex)
|
SYSCALL_HANDLED(202, futex)
|
||||||
SYSCALL_HANDLED(203, sched_setaffinity)
|
SYSCALL_HANDLED(203, sched_setaffinity)
|
||||||
SYSCALL_HANDLED(204, sched_getaffinity)
|
SYSCALL_HANDLED(204, sched_getaffinity)
|
||||||
@@ -161,6 +161,7 @@ SYSCALL_HANDLED(__NR_profile, profile)
|
|||||||
SYSCALL_HANDLED(730, util_migrate_inter_kernel)
|
SYSCALL_HANDLED(730, util_migrate_inter_kernel)
|
||||||
SYSCALL_HANDLED(731, util_indicate_clone)
|
SYSCALL_HANDLED(731, util_indicate_clone)
|
||||||
SYSCALL_HANDLED(732, get_system)
|
SYSCALL_HANDLED(732, get_system)
|
||||||
|
SYSCALL_HANDLED(733, util_register_desc)
|
||||||
|
|
||||||
/* McKernel Specific */
|
/* McKernel Specific */
|
||||||
SYSCALL_HANDLED(801, swapout)
|
SYSCALL_HANDLED(801, swapout)
|
||||||
@@ -145,6 +145,8 @@ nmi:
|
|||||||
movq %rsp,%gs:PANIC_REGS+0x08
|
movq %rsp,%gs:PANIC_REGS+0x08
|
||||||
|
|
||||||
movl nmi_mode(%rip),%eax
|
movl nmi_mode(%rip),%eax
|
||||||
|
cmp $3,%rax
|
||||||
|
je 4f
|
||||||
cmp $1,%rax
|
cmp $1,%rax
|
||||||
je 1f
|
je 1f
|
||||||
cmp $2,%rax
|
cmp $2,%rax
|
||||||
@@ -199,9 +201,9 @@ nmi:
|
|||||||
movl %eax,%gs:PANIC_REGS+0xA0
|
movl %eax,%gs:PANIC_REGS+0xA0
|
||||||
movq $1,%gs:PANICED
|
movq $1,%gs:PANICED
|
||||||
call ihk_mc_query_mem_areas
|
call ihk_mc_query_mem_areas
|
||||||
1:
|
4:
|
||||||
hlt
|
hlt
|
||||||
jmp 1b
|
jmp 4b
|
||||||
|
|
||||||
.globl x86_syscall
|
.globl x86_syscall
|
||||||
x86_syscall:
|
x86_syscall:
|
||||||
@@ -107,9 +107,17 @@ void init_boot_processor_local(void)
|
|||||||
@ ensures \result == %gs;
|
@ ensures \result == %gs;
|
||||||
@ assigns \nothing;
|
@ assigns \nothing;
|
||||||
*/
|
*/
|
||||||
|
extern int num_processors;
|
||||||
int ihk_mc_get_processor_id(void)
|
int ihk_mc_get_processor_id(void)
|
||||||
{
|
{
|
||||||
int id;
|
int id;
|
||||||
|
void *gs;
|
||||||
|
|
||||||
|
gs = (void *)rdmsr(MSR_GS_BASE);
|
||||||
|
if (gs < (void *)locals ||
|
||||||
|
gs > ((void *)locals + LOCALS_SPAN * num_processors)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
asm volatile("movl %%gs:0, %0" : "=r"(id));
|
asm volatile("movl %%gs:0, %0" : "=r"(id));
|
||||||
|
|
||||||
@@ -25,15 +25,13 @@
|
|||||||
#include <cls.h>
|
#include <cls.h>
|
||||||
#include <kmalloc.h>
|
#include <kmalloc.h>
|
||||||
#include <rusage_private.h>
|
#include <rusage_private.h>
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
//#define DEBUG
|
//#define DEBUG
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
#define dkprintf(...) do { kprintf(__VA_ARGS__); } while (0)
|
#undef DDEBUG_DEFAULT
|
||||||
#define ekprintf(...) do { kprintf(__VA_ARGS__); } while (0)
|
#define DDEBUG_DEFAULT DDEBUG_PRINT
|
||||||
#else
|
|
||||||
#define dkprintf(...) do { } while (0)
|
|
||||||
#define ekprintf(...) do { kprintf(__VA_ARGS__); } while (0)
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static char *last_page;
|
static char *last_page;
|
||||||
@@ -41,6 +39,8 @@ extern char _head[], _end[];
|
|||||||
|
|
||||||
extern unsigned long x86_kernel_phys_base;
|
extern unsigned long x86_kernel_phys_base;
|
||||||
|
|
||||||
|
int safe_kernel_map = 0;
|
||||||
|
|
||||||
/* Arch specific early allocation routine */
|
/* Arch specific early allocation routine */
|
||||||
void *early_alloc_pages(int nr_pages)
|
void *early_alloc_pages(int nr_pages)
|
||||||
{
|
{
|
||||||
@@ -109,6 +109,7 @@ struct page_table {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static struct page_table *init_pt;
|
static struct page_table *init_pt;
|
||||||
|
static int init_pt_loaded = 0;
|
||||||
static ihk_spinlock_t init_pt_lock;
|
static ihk_spinlock_t init_pt_lock;
|
||||||
|
|
||||||
static int use_1gb_page = 0;
|
static int use_1gb_page = 0;
|
||||||
@@ -167,30 +168,6 @@ static unsigned long setup_l3(struct page_table *pt,
|
|||||||
return virt_to_phys(pt);
|
return virt_to_phys(pt);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void init_normal_area(struct page_table *pt)
|
|
||||||
{
|
|
||||||
unsigned long map_start, map_end, phys, pt_phys;
|
|
||||||
int ident_index, virt_index;
|
|
||||||
|
|
||||||
map_start = ihk_mc_get_memory_address(IHK_MC_GMA_MAP_START, 0);
|
|
||||||
map_end = ihk_mc_get_memory_address(IHK_MC_GMA_MAP_END, 0);
|
|
||||||
|
|
||||||
kprintf("map_start = %lx, map_end = %lx\n", map_start, map_end);
|
|
||||||
ident_index = map_start >> PTL4_SHIFT;
|
|
||||||
virt_index = (MAP_ST_START >> PTL4_SHIFT) & (PT_ENTRIES - 1);
|
|
||||||
|
|
||||||
memset(pt, 0, sizeof(struct page_table));
|
|
||||||
|
|
||||||
for (phys = (map_start & ~(PTL4_SIZE - 1)); phys < map_end;
|
|
||||||
phys += PTL4_SIZE) {
|
|
||||||
pt_phys = setup_l3(ihk_mc_alloc_pages(1, IHK_MC_AP_CRITICAL), phys,
|
|
||||||
map_start, map_end);
|
|
||||||
|
|
||||||
pt->entry[ident_index++] = pt_phys | PFL4_PDIR_ATTR;
|
|
||||||
pt->entry[virt_index++] = pt_phys | PFL4_PDIR_ATTR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct page_table *__alloc_new_pt(ihk_mc_ap_flag ap_flag)
|
static struct page_table *__alloc_new_pt(ihk_mc_ap_flag ap_flag)
|
||||||
{
|
{
|
||||||
struct page_table *newpt = ihk_mc_alloc_pages(1, ap_flag);
|
struct page_table *newpt = ihk_mc_alloc_pages(1, ap_flag);
|
||||||
@@ -258,6 +235,11 @@ static unsigned long attr_to_l1attr(enum ihk_mc_pt_attribute attr)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define PTLX_SHIFT(index) PTL ## index ## _SHIFT
|
||||||
|
|
||||||
|
#define GET_VIRT_INDEX(virt, index, dest) \
|
||||||
|
dest = ((virt) >> PTLX_SHIFT(index)) & (PT_ENTRIES - 1)
|
||||||
|
|
||||||
#define GET_VIRT_INDICES(virt, l4i, l3i, l2i, l1i) \
|
#define GET_VIRT_INDICES(virt, l4i, l3i, l2i, l1i) \
|
||||||
l4i = ((virt) >> PTL4_SHIFT) & (PT_ENTRIES - 1); \
|
l4i = ((virt) >> PTL4_SHIFT) & (PT_ENTRIES - 1); \
|
||||||
l3i = ((virt) >> PTL3_SHIFT) & (PT_ENTRIES - 1); \
|
l3i = ((virt) >> PTL3_SHIFT) & (PT_ENTRIES - 1); \
|
||||||
@@ -493,7 +475,7 @@ uint64_t ihk_mc_pt_virt_to_pagemap(struct page_table *pt, unsigned long virt)
|
|||||||
|
|
||||||
error = ihk_mc_pt_virt_to_phys(pt, (void *)virt, &phys);
|
error = ihk_mc_pt_virt_to_phys(pt, (void *)virt, &phys);
|
||||||
if (error) {
|
if (error) {
|
||||||
return 0;
|
return PM_PSHIFT(PAGE_SHIFT);
|
||||||
}
|
}
|
||||||
|
|
||||||
pagemap = PM_PFRAME(phys >> PAGE_SHIFT);
|
pagemap = PM_PFRAME(phys >> PAGE_SHIFT);
|
||||||
@@ -1518,12 +1500,12 @@ static int clear_range_l1(void *args0, pte_t *ptep, uint64_t base,
|
|||||||
if (page) {
|
if (page) {
|
||||||
dkprintf("%s: page=%p,is_in_memobj=%d,(old & PFL1_DIRTY)=%lx,memobj=%p,args->memobj->flags=%x\n", __FUNCTION__, page, page_is_in_memobj(page), (old & PFL1_DIRTY), args->memobj, args->memobj ? args->memobj->flags : -1);
|
dkprintf("%s: page=%p,is_in_memobj=%d,(old & PFL1_DIRTY)=%lx,memobj=%p,args->memobj->flags=%x\n", __FUNCTION__, page, page_is_in_memobj(page), (old & PFL1_DIRTY), args->memobj, args->memobj ? args->memobj->flags : -1);
|
||||||
}
|
}
|
||||||
if (page && page_is_in_memobj(page) && (old & PFL1_DIRTY) && (args->memobj) &&
|
if (page && page_is_in_memobj(page) && pte_is_dirty(&old, PTL1_SIZE) &&
|
||||||
!(args->memobj->flags & MF_ZEROFILL)) {
|
args->memobj && !(args->memobj->flags & MF_ZEROFILL)) {
|
||||||
memobj_flush_page(args->memobj, phys, PTL1_SIZE);
|
memobj_flush_page(args->memobj, phys, PTL1_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(old & PFL1_FILEOFF)) {
|
if (!pte_is_fileoff(&old, PTL1_SIZE)) {
|
||||||
if(args->free_physical) {
|
if(args->free_physical) {
|
||||||
if (!page) {
|
if (!page) {
|
||||||
/* Anonymous || !XPMEM attach */
|
/* Anonymous || !XPMEM attach */
|
||||||
@@ -1542,7 +1524,6 @@ static int clear_range_l1(void *args0, pte_t *ptep, uint64_t base,
|
|||||||
dkprintf("%lx-,%s: calling memory_stat_rss_sub(),phys=%lx,size=%ld,pgsize=%ld\n", pte_get_phys(&old), __FUNCTION__, pte_get_phys(&old), PTL1_SIZE, PTL1_SIZE);
|
dkprintf("%lx-,%s: calling memory_stat_rss_sub(),phys=%lx,size=%ld,pgsize=%ld\n", pte_get_phys(&old), __FUNCTION__, pte_get_phys(&old), PTL1_SIZE, PTL1_SIZE);
|
||||||
rusage_memory_stat_sub(args->memobj, PTL1_SIZE, PTL1_SIZE);
|
rusage_memory_stat_sub(args->memobj, PTL1_SIZE, PTL1_SIZE);
|
||||||
}
|
}
|
||||||
args->vm->currss -= PTL1_SIZE;
|
|
||||||
} else {
|
} else {
|
||||||
dkprintf("%s: !calling memory_stat_rss_sub(),virt=%lx,phys=%lx\n", __FUNCTION__, base, pte_get_phys(&old));
|
dkprintf("%s: !calling memory_stat_rss_sub(),virt=%lx,phys=%lx\n", __FUNCTION__, base, pte_get_phys(&old));
|
||||||
}
|
}
|
||||||
@@ -1586,11 +1567,11 @@ static int clear_range_l2(void *args0, pte_t *ptep, uint64_t base,
|
|||||||
page = phys_to_page(phys);
|
page = phys_to_page(phys);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (page && page_is_in_memobj(page) && (old & PFL2_DIRTY)) {
|
if (page && page_is_in_memobj(page) && pte_is_dirty(&old, PTL2_SIZE)) {
|
||||||
memobj_flush_page(args->memobj, phys, PTL2_SIZE);
|
memobj_flush_page(args->memobj, phys, PTL2_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(old & PFL2_FILEOFF)) {
|
if (!pte_is_fileoff(&old, PTL2_SIZE)) {
|
||||||
if(args->free_physical) {
|
if(args->free_physical) {
|
||||||
if (!page) {
|
if (!page) {
|
||||||
/* Anonymous || !XPMEM attach */
|
/* Anonymous || !XPMEM attach */
|
||||||
@@ -1611,7 +1592,6 @@ static int clear_range_l2(void *args0, pte_t *ptep, uint64_t base,
|
|||||||
dkprintf("%lx-,%s: calling memory_stat_rss_sub(),phys=%lx,size=%ld,pgsize=%ld\n", pte_get_phys(&old), __FUNCTION__, pte_get_phys(&old), PTL2_SIZE, PTL2_SIZE);
|
dkprintf("%lx-,%s: calling memory_stat_rss_sub(),phys=%lx,size=%ld,pgsize=%ld\n", pte_get_phys(&old), __FUNCTION__, pte_get_phys(&old), PTL2_SIZE, PTL2_SIZE);
|
||||||
rusage_memory_stat_sub(args->memobj, PTL2_SIZE, PTL2_SIZE);
|
rusage_memory_stat_sub(args->memobj, PTL2_SIZE, PTL2_SIZE);
|
||||||
}
|
}
|
||||||
args->vm->currss -= PTL2_SIZE;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1668,13 +1648,13 @@ static int clear_range_l3(void *args0, pte_t *ptep, uint64_t base,
|
|||||||
page = phys_to_page(phys);
|
page = phys_to_page(phys);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (page && page_is_in_memobj(page) && (old & PFL3_DIRTY)) {
|
if (page && page_is_in_memobj(page) && pte_is_dirty(&old, PTL3_SIZE)) {
|
||||||
memobj_flush_page(args->memobj, phys, PTL3_SIZE);
|
memobj_flush_page(args->memobj, phys, PTL3_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
dkprintf("%s: phys=%ld, pte_get_phys(&old),PTL3_SIZE\n", __FUNCTION__, pte_get_phys(&old));
|
dkprintf("%s: phys=%ld, pte_get_phys(&old),PTL3_SIZE\n", __FUNCTION__, pte_get_phys(&old));
|
||||||
|
|
||||||
if (!(old & PFL3_FILEOFF)) {
|
if (!pte_is_fileoff(&old, PTL3_SIZE)) {
|
||||||
if(args->free_physical) {
|
if(args->free_physical) {
|
||||||
if (!page) {
|
if (!page) {
|
||||||
/* Anonymous || !XPMEM attach */
|
/* Anonymous || !XPMEM attach */
|
||||||
@@ -1693,7 +1673,6 @@ static int clear_range_l3(void *args0, pte_t *ptep, uint64_t base,
|
|||||||
dkprintf("%lx-,%s: calling memory_stat_rss_sub(),phys=%lx,size=%ld,pgsize=%ld\n", pte_get_phys(&old), __FUNCTION__, pte_get_phys(&old), PTL3_SIZE, PTL3_SIZE);
|
dkprintf("%lx-,%s: calling memory_stat_rss_sub(),phys=%lx,size=%ld,pgsize=%ld\n", pte_get_phys(&old), __FUNCTION__, pte_get_phys(&old), PTL3_SIZE, PTL3_SIZE);
|
||||||
rusage_memory_stat_sub(args->memobj, PTL3_SIZE, PTL3_SIZE);
|
rusage_memory_stat_sub(args->memobj, PTL3_SIZE, PTL3_SIZE);
|
||||||
}
|
}
|
||||||
args->vm->currss -= PTL3_SIZE;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2543,6 +2522,82 @@ static void init_fixed_area(struct page_table *pt)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void init_normal_area(struct page_table *pt)
|
||||||
|
{
|
||||||
|
unsigned long map_start, map_end, phys;
|
||||||
|
void *virt;
|
||||||
|
|
||||||
|
map_start = ihk_mc_get_memory_address(IHK_MC_GMA_MAP_START, 0);
|
||||||
|
map_end = ihk_mc_get_memory_address(IHK_MC_GMA_MAP_END, 0);
|
||||||
|
virt = (void *)MAP_ST_START + map_start;
|
||||||
|
|
||||||
|
kprintf("map_start = %lx, map_end = %lx, virt %lx\n",
|
||||||
|
map_start, map_end, virt);
|
||||||
|
|
||||||
|
for (phys = map_start; phys < map_end; phys += LARGE_PAGE_SIZE) {
|
||||||
|
if (set_pt_large_page(pt, virt, phys, PTATTR_WRITABLE) != 0) {
|
||||||
|
kprintf("%s: error setting mapping for 0x%lx\n",
|
||||||
|
__func__, virt);
|
||||||
|
}
|
||||||
|
virt += LARGE_PAGE_SIZE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void init_linux_kernel_mapping(struct page_table *pt)
|
||||||
|
{
|
||||||
|
unsigned long map_start, map_end, phys;
|
||||||
|
void *virt;
|
||||||
|
int nr_memory_chunks, chunk_id, numa_id;
|
||||||
|
|
||||||
|
/* In case of safe_kernel_map option (safe_kernel_map == 1),
|
||||||
|
* processing to prevent destruction of the memory area on Linux side
|
||||||
|
* is executed */
|
||||||
|
if (safe_kernel_map == 0) {
|
||||||
|
kprintf("Straight-map entire physical memory\n");
|
||||||
|
|
||||||
|
/* Map 2 TB for now */
|
||||||
|
map_start = 0;
|
||||||
|
map_end = 0x20000000000;
|
||||||
|
|
||||||
|
virt = (void *)LINUX_PAGE_OFFSET;
|
||||||
|
|
||||||
|
kprintf("Linux kernel virtual: 0x%lx - 0x%lx -> 0x%lx - 0x%lx\n",
|
||||||
|
LINUX_PAGE_OFFSET, LINUX_PAGE_OFFSET + map_end, 0, map_end);
|
||||||
|
|
||||||
|
for (phys = map_start; phys < map_end; phys += LARGE_PAGE_SIZE) {
|
||||||
|
if (set_pt_large_page(pt, virt, phys, PTATTR_WRITABLE) != 0) {
|
||||||
|
kprintf("%s: error setting mapping for 0x%lx\n", __FUNCTION__, virt);
|
||||||
|
}
|
||||||
|
virt += LARGE_PAGE_SIZE;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
kprintf("Straight-map physical memory areas allocated to McKernel\n");
|
||||||
|
|
||||||
|
nr_memory_chunks = ihk_mc_get_nr_memory_chunks();
|
||||||
|
if (nr_memory_chunks == 0) {
|
||||||
|
kprintf("%s: ERROR: No memory chunk available.\n", __FUNCTION__);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (chunk_id = 0; chunk_id < nr_memory_chunks; chunk_id++) {
|
||||||
|
if (ihk_mc_get_memory_chunk(chunk_id, &map_start, &map_end, &numa_id)) {
|
||||||
|
kprintf("%s: ERROR: Memory chunk id (%d) out of range.\n", __FUNCTION__, chunk_id);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
dkprintf("Linux kernel virtual: 0x%lx - 0x%lx -> 0x%lx - 0x%lx\n",
|
||||||
|
LINUX_PAGE_OFFSET + map_start, LINUX_PAGE_OFFSET + map_end, map_start, map_end);
|
||||||
|
|
||||||
|
virt = (void *)(LINUX_PAGE_OFFSET + map_start);
|
||||||
|
for (phys = map_start; phys < map_end; phys += LARGE_PAGE_SIZE, virt += LARGE_PAGE_SIZE) {
|
||||||
|
if (set_pt_large_page(pt, virt, phys, PTATTR_WRITABLE) != 0) {
|
||||||
|
kprintf("%s: set_pt_large_page() failed for 0x%lx\n", __FUNCTION__, virt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void init_text_area(struct page_table *pt)
|
void init_text_area(struct page_table *pt)
|
||||||
{
|
{
|
||||||
unsigned long __end, phys, virt;
|
unsigned long __end, phys, virt;
|
||||||
@@ -2627,17 +2682,19 @@ void init_page_table(void)
|
|||||||
init_pt = ihk_mc_alloc_pages(1, IHK_MC_AP_CRITICAL);
|
init_pt = ihk_mc_alloc_pages(1, IHK_MC_AP_CRITICAL);
|
||||||
ihk_mc_spinlock_init(&init_pt_lock);
|
ihk_mc_spinlock_init(&init_pt_lock);
|
||||||
|
|
||||||
memset(init_pt, 0, sizeof(PAGE_SIZE));
|
memset(init_pt, 0, sizeof(*init_pt));
|
||||||
|
|
||||||
/* Normal memory area */
|
/* Normal memory area */
|
||||||
init_normal_area(init_pt);
|
init_normal_area(init_pt);
|
||||||
|
init_linux_kernel_mapping(init_pt);
|
||||||
init_fixed_area(init_pt);
|
init_fixed_area(init_pt);
|
||||||
init_low_area(init_pt);
|
init_low_area(init_pt);
|
||||||
init_text_area(init_pt);
|
init_text_area(init_pt);
|
||||||
init_vsyscall_area(init_pt);
|
init_vsyscall_area(init_pt);
|
||||||
|
|
||||||
load_page_table(init_pt);
|
load_page_table(init_pt);
|
||||||
kprintf("Page table is now at %p\n", init_pt);
|
init_pt_loaded = 1;
|
||||||
|
kprintf("Page table is now at 0x%lx\n", init_pt);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern void __reserve_arch_pages(unsigned long, unsigned long,
|
extern void __reserve_arch_pages(unsigned long, unsigned long,
|
||||||
@@ -2667,15 +2724,31 @@ unsigned long virt_to_phys(void *v)
|
|||||||
unsigned long va = (unsigned long)v;
|
unsigned long va = (unsigned long)v;
|
||||||
|
|
||||||
if (va >= MAP_KERNEL_START) {
|
if (va >= MAP_KERNEL_START) {
|
||||||
|
dkprintf("%s: MAP_KERNEL_START <= 0x%lx <= LINUX_PAGE_OFFSET\n",
|
||||||
|
__FUNCTION__, va);
|
||||||
return va - MAP_KERNEL_START + x86_kernel_phys_base;
|
return va - MAP_KERNEL_START + x86_kernel_phys_base;
|
||||||
} else {
|
}
|
||||||
|
else if (va >= LINUX_PAGE_OFFSET) {
|
||||||
|
return va - LINUX_PAGE_OFFSET;
|
||||||
|
}
|
||||||
|
else if (va >= MAP_FIXED_START) {
|
||||||
|
return va - MAP_FIXED_START;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
dkprintf("%s: MAP_ST_START <= 0x%lx <= MAP_FIXED_START\n",
|
||||||
|
__FUNCTION__, va);
|
||||||
return va - MAP_ST_START;
|
return va - MAP_ST_START;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void *phys_to_virt(unsigned long p)
|
void *phys_to_virt(unsigned long p)
|
||||||
{
|
{
|
||||||
return (void *)(p + MAP_ST_START);
|
/* Before loading our own PT use straight mapping */
|
||||||
|
if (!init_pt_loaded) {
|
||||||
|
return (void *)(p + MAP_ST_START);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (void *)(p + LINUX_PAGE_OFFSET);
|
||||||
}
|
}
|
||||||
|
|
||||||
int copy_from_user(void *dst, const void *src, size_t siz)
|
int copy_from_user(void *dst, const void *src, size_t siz)
|
||||||
@@ -2843,17 +2916,12 @@ int read_process_vm(struct process_vm *vm, void *kdst, const void *usrc, size_t
|
|||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef POSTK_DEBUG_TEMP_FIX_52 /* NUMA support(memory area determination) */
|
if (!is_mckernel_memory(pa, pa + cpsize)) {
|
||||||
if (!is_mckernel_memory(pa)) {
|
|
||||||
#else
|
|
||||||
if (pa < ihk_mc_get_memory_address(IHK_MC_GMA_MAP_START, 0) ||
|
|
||||||
pa >= ihk_mc_get_memory_address(IHK_MC_GMA_MAP_END, 0)) {
|
|
||||||
#endif /* POSTK_DEBUG_TEMP_FIX_52 */
|
|
||||||
dkprintf("%s: pa is outside of LWK memory, to: %p, pa: %p,"
|
dkprintf("%s: pa is outside of LWK memory, to: %p, pa: %p,"
|
||||||
"cpsize: %d\n", __FUNCTION__, to, pa, cpsize);
|
"cpsize: %d\n", __FUNCTION__, to, pa, cpsize);
|
||||||
va = ihk_mc_map_virtual(pa, 1, PTATTR_ACTIVE);
|
va = ihk_mc_map_virtual(pa, 1, PTATTR_ACTIVE);
|
||||||
memcpy(to, va, cpsize);
|
memcpy(to, va, cpsize);
|
||||||
ihk_mc_unmap_virtual(va, 1, 1);
|
ihk_mc_unmap_virtual(va, 1);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
va = phys_to_virt(pa);
|
va = phys_to_virt(pa);
|
||||||
@@ -2927,17 +2995,12 @@ int write_process_vm(struct process_vm *vm, void *udst, const void *ksrc, size_t
|
|||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef POSTK_DEBUG_TEMP_FIX_52 /* NUMA support(memory area determination) */
|
if (!is_mckernel_memory(pa, pa + cpsize)) {
|
||||||
if (!is_mckernel_memory(pa)) {
|
|
||||||
#else
|
|
||||||
if (pa < ihk_mc_get_memory_address(IHK_MC_GMA_MAP_START, 0) ||
|
|
||||||
pa >= ihk_mc_get_memory_address(IHK_MC_GMA_MAP_END, 0)) {
|
|
||||||
#endif /* POSTK_DEBUG_TEMP_FIX_52 */
|
|
||||||
dkprintf("%s: pa is outside of LWK memory, from: %p,"
|
dkprintf("%s: pa is outside of LWK memory, from: %p,"
|
||||||
"pa: %p, cpsize: %d\n", __FUNCTION__, from, pa, cpsize);
|
"pa: %p, cpsize: %d\n", __FUNCTION__, from, pa, cpsize);
|
||||||
va = ihk_mc_map_virtual(pa, 1, PTATTR_ACTIVE);
|
va = ihk_mc_map_virtual(pa, 1, PTATTR_ACTIVE);
|
||||||
memcpy(va, from, cpsize);
|
memcpy(va, from, cpsize);
|
||||||
ihk_mc_unmap_virtual(va, 1, 1);
|
ihk_mc_unmap_virtual(va, 1);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
va = phys_to_virt(pa);
|
va = phys_to_virt(pa);
|
||||||
@@ -2998,17 +3061,12 @@ int patch_process_vm(struct process_vm *vm, void *udst, const void *ksrc, size_t
|
|||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef POSTK_DEBUG_TEMP_FIX_52 /* NUMA support(memory area determination) */
|
if (!is_mckernel_memory(pa, pa + cpsize)) {
|
||||||
if (!is_mckernel_memory(pa)) {
|
|
||||||
#else
|
|
||||||
if (pa < ihk_mc_get_memory_address(IHK_MC_GMA_MAP_START, 0) ||
|
|
||||||
pa >= ihk_mc_get_memory_address(IHK_MC_GMA_MAP_END, 0)) {
|
|
||||||
#endif /* POSTK_DEBUG_TEMP_FIX_52 */
|
|
||||||
dkprintf("%s: pa is outside of LWK memory, from: %p,"
|
dkprintf("%s: pa is outside of LWK memory, from: %p,"
|
||||||
"pa: %p, cpsize: %d\n", __FUNCTION__, from, pa, cpsize);
|
"pa: %p, cpsize: %d\n", __FUNCTION__, from, pa, cpsize);
|
||||||
va = ihk_mc_map_virtual(pa, 1, PTATTR_ACTIVE);
|
va = ihk_mc_map_virtual(pa, 1, PTATTR_ACTIVE);
|
||||||
memcpy(va, from, cpsize);
|
memcpy(va, from, cpsize);
|
||||||
ihk_mc_unmap_virtual(va, 1, 1);
|
ihk_mc_unmap_virtual(va, 1);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
va = phys_to_virt(pa);
|
va = phys_to_virt(pa);
|
||||||
@@ -30,7 +30,7 @@ int ihk_mc_ikc_init_first_local(struct ihk_ikc_channel_desc *channel,
|
|||||||
|
|
||||||
memset(channel, 0, sizeof(struct ihk_ikc_channel_desc));
|
memset(channel, 0, sizeof(struct ihk_ikc_channel_desc));
|
||||||
|
|
||||||
mikc_queue_pages = ((2 * num_processors * MASTER_IKCQ_PKTSIZE)
|
mikc_queue_pages = ((4 * num_processors * MASTER_IKCQ_PKTSIZE)
|
||||||
+ (PAGE_SIZE - 1)) / PAGE_SIZE;
|
+ (PAGE_SIZE - 1)) / PAGE_SIZE;
|
||||||
|
|
||||||
/* Place both sides in this side */
|
/* Place both sides in this side */
|
||||||
@@ -10,23 +10,22 @@
|
|||||||
#include <ihk/perfctr.h>
|
#include <ihk/perfctr.h>
|
||||||
#include <march.h>
|
#include <march.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <cls.h>
|
||||||
#include <ihk/debug.h>
|
#include <ihk/debug.h>
|
||||||
|
#include <ihk/cpu.h>
|
||||||
#include <registers.h>
|
#include <registers.h>
|
||||||
#include <mc_perf_event.h>
|
#include <mc_perf_event.h>
|
||||||
|
#include <config.h>
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
extern unsigned int *x86_march_perfmap;
|
extern unsigned int *x86_march_perfmap;
|
||||||
extern int running_on_kvm(void);
|
extern int running_on_kvm(void);
|
||||||
#ifdef POSTK_DEBUG_TEMP_FIX_31
|
|
||||||
int ihk_mc_perfctr_fixed_init(int counter, int mode);
|
int ihk_mc_perfctr_fixed_init(int counter, int mode);
|
||||||
#endif/*POSTK_DEBUG_TEMP_FIX_31*/
|
|
||||||
|
|
||||||
//#define PERFCTR_DEBUG
|
//#define PERFCTR_DEBUG
|
||||||
#ifdef PERFCTR_DEBUG
|
#ifdef PERFCTR_DEBUG
|
||||||
#define dkprintf(...) do { kprintf(__VA_ARGS__); } while (0)
|
#undef DDEBUG_DEFAULT
|
||||||
#define ekprintf(...) do { kprintf(__VA_ARGS__); } while (0)
|
#define DDEBUG_DEFAULT DDEBUG_PRINT
|
||||||
#else
|
|
||||||
#define dkprintf(...) do { } while (0)
|
|
||||||
#define ekprintf(...) do { kprintf(__VA_ARGS__); } while (0)
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define X86_CR4_PCE 0x00000100
|
#define X86_CR4_PCE 0x00000100
|
||||||
@@ -40,11 +39,11 @@ int ihk_mc_perfctr_fixed_init(int counter, int mode);
|
|||||||
} \
|
} \
|
||||||
} while(0)
|
} while(0)
|
||||||
|
|
||||||
int perf_counters_discovered = 0;
|
int perf_counters_discovered;
|
||||||
int X86_IA32_NUM_PERF_COUNTERS = 0;
|
int NUM_PERF_COUNTERS;
|
||||||
unsigned long X86_IA32_PERF_COUNTERS_MASK = 0;
|
unsigned long PERF_COUNTERS_MASK;
|
||||||
int X86_IA32_NUM_FIXED_PERF_COUNTERS = 0;
|
int NUM_FIXED_PERF_COUNTERS;
|
||||||
unsigned long X86_IA32_FIXED_PERF_COUNTERS_MASK = 0;
|
unsigned long FIXED_PERF_COUNTERS_MASK;
|
||||||
|
|
||||||
void x86_init_perfctr(void)
|
void x86_init_perfctr(void)
|
||||||
{
|
{
|
||||||
@@ -57,6 +56,10 @@ void x86_init_perfctr(void)
|
|||||||
uint64_t ecx;
|
uint64_t ecx;
|
||||||
uint64_t edx;
|
uint64_t edx;
|
||||||
|
|
||||||
|
#ifndef ENABLE_PERF
|
||||||
|
return;
|
||||||
|
#endif //ENABLE_PERF
|
||||||
|
|
||||||
/* Do not do it on KVM */
|
/* Do not do it on KVM */
|
||||||
if (running_on_kvm()) return;
|
if (running_on_kvm()) return;
|
||||||
|
|
||||||
@@ -71,17 +74,17 @@ void x86_init_perfctr(void)
|
|||||||
op = 0x0a;
|
op = 0x0a;
|
||||||
asm volatile("cpuid" : "=a"(eax),"=b"(ebx),"=c"(ecx),"=d"(edx):"a"(op));
|
asm volatile("cpuid" : "=a"(eax),"=b"(ebx),"=c"(ecx),"=d"(edx):"a"(op));
|
||||||
|
|
||||||
X86_IA32_NUM_PERF_COUNTERS = ((eax & 0xFF00) >> 8);
|
NUM_PERF_COUNTERS = ((eax & 0xFF00) >> 8);
|
||||||
X86_IA32_PERF_COUNTERS_MASK = (1 << X86_IA32_NUM_PERF_COUNTERS) - 1;
|
PERF_COUNTERS_MASK = (1 << NUM_PERF_COUNTERS) - 1;
|
||||||
|
|
||||||
X86_IA32_NUM_FIXED_PERF_COUNTERS = (edx & 0x0F);
|
NUM_FIXED_PERF_COUNTERS = (edx & 0x0F);
|
||||||
X86_IA32_FIXED_PERF_COUNTERS_MASK =
|
FIXED_PERF_COUNTERS_MASK =
|
||||||
((1UL << X86_IA32_NUM_FIXED_PERF_COUNTERS) - 1) <<
|
((1UL << NUM_FIXED_PERF_COUNTERS) - 1) <<
|
||||||
X86_IA32_BASE_FIXED_PERF_COUNTERS;
|
BASE_FIXED_PERF_COUNTERS;
|
||||||
|
|
||||||
perf_counters_discovered = 1;
|
perf_counters_discovered = 1;
|
||||||
kprintf("X86_IA32_NUM_PERF_COUNTERS: %d, X86_IA32_NUM_FIXED_PERF_COUNTERS: %d\n",
|
kprintf("NUM_PERF_COUNTERS: %d, NUM_FIXED_PERF_COUNTERS: %d\n",
|
||||||
X86_IA32_NUM_PERF_COUNTERS, X86_IA32_NUM_FIXED_PERF_COUNTERS);
|
NUM_PERF_COUNTERS, NUM_FIXED_PERF_COUNTERS);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Clear Fixed Counter Control */
|
/* Clear Fixed Counter Control */
|
||||||
@@ -90,20 +93,20 @@ void x86_init_perfctr(void)
|
|||||||
wrmsr(MSR_PERF_FIXED_CTRL, value);
|
wrmsr(MSR_PERF_FIXED_CTRL, value);
|
||||||
|
|
||||||
/* Clear Generic Counter Control */
|
/* Clear Generic Counter Control */
|
||||||
for(i = 0; i < X86_IA32_NUM_PERF_COUNTERS; i++) {
|
for (i = 0; i < NUM_PERF_COUNTERS; i++) {
|
||||||
wrmsr(MSR_IA32_PERFEVTSEL0 + i, 0);
|
wrmsr(MSR_IA32_PERFEVTSEL0 + i, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Enable PMC Control */
|
/* Enable PMC Control */
|
||||||
value = rdmsr(MSR_PERF_GLOBAL_CTRL);
|
value = rdmsr(MSR_PERF_GLOBAL_CTRL);
|
||||||
value |= X86_IA32_PERF_COUNTERS_MASK;
|
value |= PERF_COUNTERS_MASK;
|
||||||
value |= X86_IA32_FIXED_PERF_COUNTERS_MASK;
|
value |= FIXED_PERF_COUNTERS_MASK;
|
||||||
wrmsr(MSR_PERF_GLOBAL_CTRL, value);
|
wrmsr(MSR_PERF_GLOBAL_CTRL, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int set_perfctr_x86_direct(int counter, int mode, unsigned int value)
|
static int set_perfctr_x86_direct(int counter, int mode, unsigned int value)
|
||||||
{
|
{
|
||||||
if (counter < 0 || counter >= X86_IA32_NUM_PERF_COUNTERS) {
|
if (counter < 0 || counter >= NUM_PERF_COUNTERS) {
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -142,13 +145,14 @@ static int set_pmc_x86_direct(int counter, long val)
|
|||||||
val &= 0x000000ffffffffff; // 40bit Mask
|
val &= 0x000000ffffffffff; // 40bit Mask
|
||||||
|
|
||||||
cnt_bit = 1UL << counter;
|
cnt_bit = 1UL << counter;
|
||||||
if ( cnt_bit & X86_IA32_PERF_COUNTERS_MASK ) {
|
if (cnt_bit & PERF_COUNTERS_MASK) {
|
||||||
// set generic pmc
|
// set generic pmc
|
||||||
wrmsr(MSR_IA32_PMC0 + counter, val);
|
wrmsr(MSR_IA32_PMC0 + counter, val);
|
||||||
}
|
}
|
||||||
else if ( cnt_bit & X86_IA32_FIXED_PERF_COUNTERS_MASK ) {
|
else if (cnt_bit & FIXED_PERF_COUNTERS_MASK) {
|
||||||
// set fixed pmc
|
// set fixed pmc
|
||||||
wrmsr(MSR_IA32_FIXED_CTR0 + counter - X86_IA32_BASE_FIXED_PERF_COUNTERS, val);
|
wrmsr(MSR_IA32_FIXED_CTR0 +
|
||||||
|
counter - BASE_FIXED_PERF_COUNTERS, val);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
@@ -168,10 +172,10 @@ static int set_fixed_counter(int counter, int mode)
|
|||||||
{
|
{
|
||||||
unsigned long value = 0;
|
unsigned long value = 0;
|
||||||
unsigned int ctr_mask = 0xf;
|
unsigned int ctr_mask = 0xf;
|
||||||
int counter_idx = counter - X86_IA32_BASE_FIXED_PERF_COUNTERS ;
|
int counter_idx = counter - BASE_FIXED_PERF_COUNTERS;
|
||||||
unsigned int set_val = 0;
|
unsigned int set_val = 0;
|
||||||
|
|
||||||
if (counter_idx < 0 || counter_idx >= X86_IA32_NUM_FIXED_PERF_COUNTERS) {
|
if (counter_idx < 0 || counter_idx >= NUM_FIXED_PERF_COUNTERS) {
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -201,14 +205,13 @@ int ihk_mc_perfctr_init_raw(int counter, uint64_t config, int mode)
|
|||||||
int ihk_mc_perfctr_init_raw(int counter, unsigned int code, int mode)
|
int ihk_mc_perfctr_init_raw(int counter, unsigned int code, int mode)
|
||||||
#endif /*POSTK_DEBUG_TEMP_FIX_29*/
|
#endif /*POSTK_DEBUG_TEMP_FIX_29*/
|
||||||
{
|
{
|
||||||
#ifdef POSTK_DEBUG_TEMP_FIX_31
|
|
||||||
// PAPI_REF_CYC counted by fixed counter
|
// PAPI_REF_CYC counted by fixed counter
|
||||||
if (counter >= X86_IA32_BASE_FIXED_PERF_COUNTERS) {
|
if (counter >= BASE_FIXED_PERF_COUNTERS &&
|
||||||
|
counter < BASE_FIXED_PERF_COUNTERS + NUM_FIXED_PERF_COUNTERS) {
|
||||||
return ihk_mc_perfctr_fixed_init(counter, mode);
|
return ihk_mc_perfctr_fixed_init(counter, mode);
|
||||||
}
|
}
|
||||||
#endif /*POSTK_DEBUG_TEMP_FIX_31*/
|
|
||||||
|
|
||||||
if (counter < 0 || counter >= X86_IA32_NUM_PERF_COUNTERS) {
|
if (counter < 0 || counter >= NUM_PERF_COUNTERS) {
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -241,7 +244,7 @@ int ihk_mc_perfctr_init(int counter, enum ihk_perfctr_type type, int mode)
|
|||||||
}
|
}
|
||||||
#endif /*POSTK_DEBUG_TEMP_FIX_29*/
|
#endif /*POSTK_DEBUG_TEMP_FIX_29*/
|
||||||
|
|
||||||
if (counter < 0 || counter >= X86_IA32_NUM_PERF_COUNTERS) {
|
if (counter < 0 || counter >= NUM_PERF_COUNTERS) {
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
if (type < 0 || type >= PERFCTR_MAX_TYPE) {
|
if (type < 0 || type >= PERFCTR_MAX_TYPE) {
|
||||||
@@ -254,22 +257,50 @@ int ihk_mc_perfctr_init(int counter, enum ihk_perfctr_type type, int mode)
|
|||||||
return set_perfctr_x86_direct(counter, mode, x86_march_perfmap[type]);
|
return set_perfctr_x86_direct(counter, mode, x86_march_perfmap[type]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ihk_mc_perfctr_set_extra(struct mc_perf_event *event)
|
||||||
|
{
|
||||||
|
struct thread *thread = cpu_local_var(current);
|
||||||
|
|
||||||
|
// allocate extra_reg
|
||||||
|
if (thread->extra_reg_alloc_map & (1UL << event->extra_reg.idx)) {
|
||||||
|
if (event->extra_reg.idx == EXTRA_REG_RSP_0) {
|
||||||
|
event->extra_reg.idx = EXTRA_REG_RSP_1;
|
||||||
|
}
|
||||||
|
else if (event->extra_reg.idx == EXTRA_REG_RSP_1) {
|
||||||
|
event->extra_reg.idx = EXTRA_REG_RSP_0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (thread->extra_reg_alloc_map & (1UL << event->extra_reg.idx)) {
|
||||||
|
// extra_regs are full
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event->extra_reg.idx == EXTRA_REG_RSP_0) {
|
||||||
|
event->hw_config &= ~0xffUL;
|
||||||
|
event->hw_config |= ihk_mc_get_extra_reg_event(EXTRA_REG_RSP_0);
|
||||||
|
event->extra_reg.reg = MSR_OFFCORE_RSP_0;
|
||||||
|
}
|
||||||
|
else if (event->extra_reg.idx == EXTRA_REG_RSP_1) {
|
||||||
|
event->hw_config &= ~0xffUL;
|
||||||
|
event->hw_config |= ihk_mc_get_extra_reg_event(EXTRA_REG_RSP_1);
|
||||||
|
event->extra_reg.reg = MSR_OFFCORE_RSP_1;
|
||||||
|
}
|
||||||
|
|
||||||
|
thread->extra_reg_alloc_map |= (1UL << event->extra_reg.idx);
|
||||||
|
wrmsr(event->extra_reg.reg, event->extra_reg.config);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef HAVE_MARCH_PERFCTR_START
|
#ifdef HAVE_MARCH_PERFCTR_START
|
||||||
extern void x86_march_perfctr_start(unsigned long counter_mask);
|
extern void x86_march_perfctr_start(unsigned long counter_mask);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef POSTK_DEBUG_TEMP_FIX_30
|
|
||||||
int ihk_mc_perfctr_start(int counter)
|
|
||||||
#else
|
|
||||||
int ihk_mc_perfctr_start(unsigned long counter_mask)
|
int ihk_mc_perfctr_start(unsigned long counter_mask)
|
||||||
#endif /*POSTK_DEBUG_TEMP_FIX_30*/
|
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
unsigned long value = 0;
|
unsigned long value = 0;
|
||||||
unsigned long mask = X86_IA32_PERF_COUNTERS_MASK | X86_IA32_FIXED_PERF_COUNTERS_MASK;
|
unsigned long mask = PERF_COUNTERS_MASK | FIXED_PERF_COUNTERS_MASK;
|
||||||
#ifdef POSTK_DEBUG_TEMP_FIX_30
|
|
||||||
unsigned long counter_mask = 1UL << counter;
|
|
||||||
#endif /*POSTK_DEBUG_TEMP_FIX_30*/
|
|
||||||
|
|
||||||
PERFCTR_CHKANDJUMP(counter_mask & ~mask, "counter_mask out of range", -EINVAL);
|
PERFCTR_CHKANDJUMP(counter_mask & ~mask, "counter_mask out of range", -EINVAL);
|
||||||
|
|
||||||
@@ -286,18 +317,11 @@ int ihk_mc_perfctr_start(unsigned long counter_mask)
|
|||||||
goto fn_exit;
|
goto fn_exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef POSTK_DEBUG_TEMP_FIX_30
|
|
||||||
int ihk_mc_perfctr_stop(int counter)
|
|
||||||
#else
|
|
||||||
int ihk_mc_perfctr_stop(unsigned long counter_mask)
|
int ihk_mc_perfctr_stop(unsigned long counter_mask)
|
||||||
#endif/*POSTK_DEBUG_TEMP_FIX_30*/
|
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
unsigned long value;
|
unsigned long value;
|
||||||
unsigned long mask = X86_IA32_PERF_COUNTERS_MASK | X86_IA32_FIXED_PERF_COUNTERS_MASK;
|
unsigned long mask = PERF_COUNTERS_MASK | FIXED_PERF_COUNTERS_MASK;
|
||||||
#ifdef POSTK_DEBUG_TEMP_FIX_30
|
|
||||||
unsigned long counter_mask = 1UL << counter;
|
|
||||||
#endif/*POSTK_DEBUG_TEMP_FIX_30*/
|
|
||||||
|
|
||||||
PERFCTR_CHKANDJUMP(counter_mask & ~mask, "counter_mask out of range", -EINVAL);
|
PERFCTR_CHKANDJUMP(counter_mask & ~mask, "counter_mask out of range", -EINVAL);
|
||||||
|
|
||||||
@@ -334,10 +358,10 @@ int ihk_mc_perfctr_fixed_init(int counter, int mode)
|
|||||||
{
|
{
|
||||||
unsigned long value = 0;
|
unsigned long value = 0;
|
||||||
unsigned int ctr_mask = 0xf;
|
unsigned int ctr_mask = 0xf;
|
||||||
int counter_idx = counter - X86_IA32_BASE_FIXED_PERF_COUNTERS ;
|
int counter_idx = counter - BASE_FIXED_PERF_COUNTERS;
|
||||||
unsigned int set_val = 0;
|
unsigned int set_val = 0;
|
||||||
|
|
||||||
if (counter_idx < 0 || counter_idx >= X86_IA32_NUM_FIXED_PERF_COUNTERS) {
|
if (counter_idx < 0 || counter_idx >= NUM_FIXED_PERF_COUNTERS) {
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -378,7 +402,7 @@ int ihk_mc_perfctr_read_mask(unsigned long counter_mask, unsigned long *value)
|
|||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
|
|
||||||
for (i = 0, j = 0; i < X86_IA32_NUM_PERF_COUNTERS && counter_mask;
|
for (i = 0, j = 0; i < NUM_PERF_COUNTERS && counter_mask;
|
||||||
i++, counter_mask >>= 1) {
|
i++, counter_mask >>= 1) {
|
||||||
if (counter_mask & 1) {
|
if (counter_mask & 1) {
|
||||||
value[j++] = rdpmc(i);
|
value[j++] = rdpmc(i);
|
||||||
@@ -398,13 +422,14 @@ unsigned long ihk_mc_perfctr_read(int counter)
|
|||||||
|
|
||||||
cnt_bit = 1UL << counter;
|
cnt_bit = 1UL << counter;
|
||||||
|
|
||||||
if ( cnt_bit & X86_IA32_PERF_COUNTERS_MASK ) {
|
if (cnt_bit & PERF_COUNTERS_MASK) {
|
||||||
// read generic pmc
|
// read generic pmc
|
||||||
retval = rdpmc(counter);
|
retval = rdpmc(counter);
|
||||||
}
|
}
|
||||||
else if ( cnt_bit & X86_IA32_FIXED_PERF_COUNTERS_MASK ) {
|
else if (cnt_bit & FIXED_PERF_COUNTERS_MASK) {
|
||||||
// read fixed pmc
|
// read fixed pmc
|
||||||
retval = rdpmc((1 << 30) + (counter - X86_IA32_BASE_FIXED_PERF_COUNTERS));
|
retval = rdpmc((1 << 30) +
|
||||||
|
(counter - BASE_FIXED_PERF_COUNTERS));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
retval = -EINVAL;
|
retval = -EINVAL;
|
||||||
@@ -426,12 +451,12 @@ unsigned long ihk_mc_perfctr_read_msr(int counter)
|
|||||||
|
|
||||||
cnt_bit = 1UL << counter;
|
cnt_bit = 1UL << counter;
|
||||||
|
|
||||||
if ( cnt_bit & X86_IA32_PERF_COUNTERS_MASK ) {
|
if (cnt_bit & PERF_COUNTERS_MASK) {
|
||||||
// read generic pmc
|
// read generic pmc
|
||||||
idx = MSR_IA32_PMC0 + counter;
|
idx = MSR_IA32_PMC0 + counter;
|
||||||
retval = (unsigned long) rdmsr(idx);
|
retval = (unsigned long) rdmsr(idx);
|
||||||
}
|
}
|
||||||
else if ( cnt_bit & X86_IA32_FIXED_PERF_COUNTERS_MASK ) {
|
else if (cnt_bit & FIXED_PERF_COUNTERS_MASK) {
|
||||||
// read fixed pmc
|
// read fixed pmc
|
||||||
idx = MSR_IA32_FIXED_CTR0 + counter;
|
idx = MSR_IA32_FIXED_CTR0 + counter;
|
||||||
retval = (unsigned long) rdmsr(idx);
|
retval = (unsigned long) rdmsr(idx);
|
||||||
@@ -464,8 +489,8 @@ int ihk_mc_perfctr_alloc_counter(unsigned int *type, unsigned long *config, unsi
|
|||||||
}
|
}
|
||||||
|
|
||||||
// find avail generic counter
|
// find avail generic counter
|
||||||
for(i = 0; i < X86_IA32_NUM_PERF_COUNTERS; i++) {
|
for (i = 0; i < NUM_PERF_COUNTERS; i++) {
|
||||||
if(!(pmc_status & (1 << i))) {
|
if (!(pmc_status & (1 << i))) {
|
||||||
ret = i;
|
ret = i;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -31,51 +31,6 @@ struct tod_data_s tod_data
|
|||||||
.version = IHK_ATOMIC64_INIT(0),
|
.version = IHK_ATOMIC64_INIT(0),
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline void cpu_pause_for_vsyscall(void)
|
|
||||||
{
|
|
||||||
asm volatile ("pause" ::: "memory");
|
|
||||||
return;
|
|
||||||
} /* cpu_pause_for_vsyscall() */
|
|
||||||
|
|
||||||
static inline void calculate_time_from_tsc(struct timespec *ts)
|
|
||||||
{
|
|
||||||
long ver;
|
|
||||||
unsigned long current_tsc;
|
|
||||||
__time_t sec_delta;
|
|
||||||
long ns_delta;
|
|
||||||
|
|
||||||
for (;;) {
|
|
||||||
while ((ver = ihk_atomic64_read(&tod_data.version)) & 1) {
|
|
||||||
/* settimeofday() is in progress */
|
|
||||||
cpu_pause_for_vsyscall();
|
|
||||||
}
|
|
||||||
rmb();
|
|
||||||
*ts = tod_data.origin;
|
|
||||||
rmb();
|
|
||||||
if (ver == ihk_atomic64_read(&tod_data.version)) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* settimeofday() has intervened */
|
|
||||||
cpu_pause_for_vsyscall();
|
|
||||||
}
|
|
||||||
|
|
||||||
current_tsc = rdtsc();
|
|
||||||
sec_delta = current_tsc / tod_data.clocks_per_sec;
|
|
||||||
ns_delta = NS_PER_SEC * (current_tsc % tod_data.clocks_per_sec)
|
|
||||||
/ tod_data.clocks_per_sec;
|
|
||||||
/* calc. of ns_delta overflows if clocks_per_sec exceeds 18.44 GHz */
|
|
||||||
|
|
||||||
ts->tv_sec += sec_delta;
|
|
||||||
ts->tv_nsec += ns_delta;
|
|
||||||
if (ts->tv_nsec >= NS_PER_SEC) {
|
|
||||||
ts->tv_nsec -= NS_PER_SEC;
|
|
||||||
++ts->tv_sec;
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
} /* calculate_time_from_tsc() */
|
|
||||||
|
|
||||||
int vsyscall_gettimeofday(struct timeval *tv, void *tz)
|
int vsyscall_gettimeofday(struct timeval *tv, void *tz)
|
||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
@@ -102,7 +57,7 @@ int vsyscall_gettimeofday(struct timeval *tv, void *tz)
|
|||||||
: "%rcx", "%r11", "memory");
|
: "%rcx", "%r11", "memory");
|
||||||
|
|
||||||
if (error) {
|
if (error) {
|
||||||
*(int *)0 = 0; /* i.e. raise(SIGSEGV) */
|
*(volatile int *)0 = 0; /* i.e. raise(SIGSEGV) */
|
||||||
}
|
}
|
||||||
return error;
|
return error;
|
||||||
} /* vsyscall_gettimeofday() */
|
} /* vsyscall_gettimeofday() */
|
||||||
@@ -43,9 +43,9 @@ error_exit() {
|
|||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
exit 1
|
# Retun -EINVAL
|
||||||
|
exit -22
|
||||||
}
|
}
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ ! -e /tmp/mcos ]; then
|
if [ ! -e /tmp/mcos ]; then
|
||||||
@@ -145,3 +145,5 @@ for cpuid in `find /sys/bus/cpu/devices/* -maxdepth 0 -name "cpu[0123456789]*" -
|
|||||||
rm -rf /tmp/mcos/mcos0_sys/bus/cpu/devices/$cpuid
|
rm -rf /tmp/mcos/mcos0_sys/bus/cpu/devices/$cpuid
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
|
exit 0
|
||||||
@@ -8,6 +8,9 @@ if grep mcoverlay /proc/modules &>/dev/null; then
|
|||||||
if [ -e /tmp/mcos ]; then rm -rf /tmp/mcos; fi
|
if [ -e /tmp/mcos ]; then rm -rf /tmp/mcos; fi
|
||||||
if ! rmmod mcoverlay 2>/dev/null; then
|
if ! rmmod mcoverlay 2>/dev/null; then
|
||||||
echo "error: removing mcoverlay" >&2
|
echo "error: removing mcoverlay" >&2
|
||||||
exit 1
|
# Return -EINVAL
|
||||||
|
exit -22
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
exit 0
|
||||||
@@ -12,6 +12,7 @@
|
|||||||
# the same set of resources as it used previously.
|
# the same set of resources as it used previously.
|
||||||
# Note that the script does not output anything unless an error occurs.
|
# Note that the script does not output anything unless an error occurs.
|
||||||
|
|
||||||
|
ret=1
|
||||||
prefix="@prefix@"
|
prefix="@prefix@"
|
||||||
BINDIR="${prefix}/bin"
|
BINDIR="${prefix}/bin"
|
||||||
SBINDIR="${prefix}/sbin"
|
SBINDIR="${prefix}/sbin"
|
||||||
@@ -19,6 +20,7 @@ ETCDIR=@ETCDIR@
|
|||||||
KMODDIR="${prefix}/kmod"
|
KMODDIR="${prefix}/kmod"
|
||||||
KERNDIR="${prefix}/@TARGET@/kernel"
|
KERNDIR="${prefix}/@TARGET@/kernel"
|
||||||
ENABLE_MCOVERLAYFS="@ENABLE_MCOVERLAYFS@"
|
ENABLE_MCOVERLAYFS="@ENABLE_MCOVERLAYFS@"
|
||||||
|
MCK_BUILDID=@BUILDID@
|
||||||
|
|
||||||
mem="512M@0"
|
mem="512M@0"
|
||||||
cpus=""
|
cpus=""
|
||||||
@@ -43,8 +45,12 @@ fi
|
|||||||
|
|
||||||
turbo=""
|
turbo=""
|
||||||
ihk_irq=""
|
ihk_irq=""
|
||||||
|
safe_kernel_map=""
|
||||||
|
umask_old=`umask`
|
||||||
|
idle_halt=""
|
||||||
|
allow_oversubscribe=""
|
||||||
|
|
||||||
while getopts :tk:c:m:o:f:r:q:i:d: OPT
|
while getopts stk:c:m:o:f:r:q:i:d:e:hO OPT
|
||||||
do
|
do
|
||||||
case ${OPT} in
|
case ${OPT} in
|
||||||
f) facility=${OPTARG}
|
f) facility=${OPTARG}
|
||||||
@@ -57,18 +63,26 @@ do
|
|||||||
;;
|
;;
|
||||||
m) mem=${OPTARG}
|
m) mem=${OPTARG}
|
||||||
;;
|
;;
|
||||||
|
s) safe_kernel_map="safe_kernel_map"
|
||||||
|
;;
|
||||||
r) ikc_map=${OPTARG}
|
r) ikc_map=${OPTARG}
|
||||||
;;
|
;;
|
||||||
q) ihk_irq=${OPTARG}
|
q) ihk_irq=${OPTARG}
|
||||||
;;
|
;;
|
||||||
t) turbo="turbo"
|
t) turbo="turbo"
|
||||||
;;
|
;;
|
||||||
|
e) extra_kopts=${OPTARG}
|
||||||
|
;;
|
||||||
d) DUMP_LEVEL=${OPTARG}
|
d) DUMP_LEVEL=${OPTARG}
|
||||||
;;
|
;;
|
||||||
i) mon_interval=${OPTARG}
|
i) mon_interval=${OPTARG}
|
||||||
;;
|
;;
|
||||||
*) echo "invalid option -${OPT}" >&2
|
h) idle_halt="idle_halt"
|
||||||
exit 1
|
;;
|
||||||
|
O) allow_oversubscribe="allow_oversubscribe"
|
||||||
|
;;
|
||||||
|
\?) exit 1
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
|
||||||
@@ -80,6 +94,16 @@ fi
|
|||||||
if [ "${redirect_kmsg}" != "0" -o "${mon_interval}" != "-1" ]; then
|
if [ "${redirect_kmsg}" != "0" -o "${mon_interval}" != "-1" ]; then
|
||||||
${SBINDIR}/ihkmond -f ${facility} -k ${redirect_kmsg} -i ${mon_interval}
|
${SBINDIR}/ihkmond -f ${facility} -k ${redirect_kmsg} -i ${mon_interval}
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
disable_irqbalance_mck() {
|
||||||
|
if [ -f /etc/systemd/system/irqbalance_mck.service ]; then
|
||||||
|
systemctl disable irqbalance_mck.service >/dev/null 2>/dev/null
|
||||||
|
|
||||||
|
# Invalid .service file persists so remove it
|
||||||
|
rm -f /etc/systemd/system/irqbalance_mck.service
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
#
|
#
|
||||||
# Revert any state that has been initialized before the error occured.
|
# Revert any state that has been initialized before the error occured.
|
||||||
#
|
#
|
||||||
@@ -87,6 +111,16 @@ error_exit() {
|
|||||||
local status=$1
|
local status=$1
|
||||||
|
|
||||||
case $status in
|
case $status in
|
||||||
|
irqbalance_mck_started)
|
||||||
|
if [ "${irqbalance_used}" == "yes" ]; then
|
||||||
|
if [ "`systemctl status irqbalance_mck.service 2> /dev/null |grep -E 'Active: active'`" != "" ]; then
|
||||||
|
if ! systemctl stop irqbalance_mck.service 2>/dev/null; then
|
||||||
|
echo "warning: failed to stop irqbalance_mck" >&2
|
||||||
|
fi
|
||||||
|
disable_irqbalance_mck
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
;&
|
||||||
mcos_sys_mounted)
|
mcos_sys_mounted)
|
||||||
if [ "$enable_mcoverlay" == "yes" ]; then
|
if [ "$enable_mcoverlay" == "yes" ]; then
|
||||||
umount /tmp/mcos/mcos0_sys
|
umount /tmp/mcos/mcos0_sys
|
||||||
@@ -148,25 +182,25 @@ error_exit() {
|
|||||||
fi
|
fi
|
||||||
;&
|
;&
|
||||||
ihk_smp_loaded)
|
ihk_smp_loaded)
|
||||||
rmmod ihk_smp_x86 2>/dev/null || echo "warning: failed to remove ihk_smp_x86" >&2
|
rmmod ihk_smp_@ARCH@ 2>/dev/null || echo "warning: failed to remove ihk_smp_@ARCH@" >&2
|
||||||
;&
|
;&
|
||||||
ihk_loaded)
|
ihk_loaded)
|
||||||
rmmod ihk 2>/dev/null || echo "warning: failed to remove ihk" >&2
|
rmmod ihk 2>/dev/null || echo "warning: failed to remove ihk" >&2
|
||||||
;&
|
;&
|
||||||
|
smp_affinity_modified)
|
||||||
|
umask $umask_old
|
||||||
|
if [ "${irqbalance_used}" == "yes" ]; then
|
||||||
|
if ! perl -e '$tmpdir="/tmp/mcreboot"; @files = grep { -f } glob "$tmpdir/proc/irq/*/smp_affinity"; foreach $file (@files) { $dest = substr($file, length($tmpdir)); if (0) {print "cp $file $dest\n";} system("cp $file $dest 2>/dev/null"); }'; then
|
||||||
|
echo "warning: failed to restore /proc/irq/*/smp_affinity" >&2
|
||||||
|
fi
|
||||||
|
if [ -e /tmp/mcreboot ]; then rm -rf /tmp/mcreboot; fi
|
||||||
|
fi
|
||||||
|
;&
|
||||||
irqbalance_stopped)
|
irqbalance_stopped)
|
||||||
if [ "`systemctl status irqbalance_mck.service 2> /dev/null |grep -E 'Active: active'`" != "" ]; then
|
if [ "${irqbalance_used}" == "yes" ]; then
|
||||||
if ! systemctl stop irqbalance_mck.service 2>/dev/null; then
|
if ! systemctl start irqbalance.service; then
|
||||||
echo "warning: failed to stop irqbalance_mck" >&2
|
echo "warning: failed to start irqbalance" >&2;
|
||||||
fi
|
fi
|
||||||
if ! systemctl disable irqbalance_mck.service >/dev/null 2>/dev/null; then
|
|
||||||
echo "warning: failed to disable irqbalance_mck" >&2
|
|
||||||
fi
|
|
||||||
if ! etcdir=@ETCDIR@ perl -e '$etcdir=$ENV{'etcdir'}; @files = grep { -f } glob "$etcdir/proc/irq/*/smp_affinity"; foreach $file (@files) { $dest = substr($file, length($etcdir)); if(0) {print "cp $file $dest\n";} system("cp $file $dest 2>/dev/null"); }'; then
|
|
||||||
echo "warning: failed to restore /proc/irq/*/smp_affinity" >&2
|
|
||||||
fi
|
|
||||||
if ! systemctl start irqbalance.service; then
|
|
||||||
echo "warning: failed to start irqbalance" >&2;
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
;&
|
;&
|
||||||
initial)
|
initial)
|
||||||
@@ -174,7 +208,8 @@ error_exit() {
|
|||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
exit 1
|
# Propagate exit status if any
|
||||||
|
exit $ret
|
||||||
}
|
}
|
||||||
|
|
||||||
ihk_ikc_irq_core=0
|
ihk_ikc_irq_core=0
|
||||||
@@ -200,7 +235,7 @@ if [ "${ENABLE_MCOVERLAYFS}" == "yes" ]; then
|
|||||||
enable_mcoverlay="yes"
|
enable_mcoverlay="yes"
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
if [ ${linux_version_code} -eq 199168 -a ${rhel_release} -ge 327 ]; then
|
if [ ${linux_version_code} -eq 199168 -a ${rhel_release} -ge 327 -a ${rhel_release} -le 862 ]; then
|
||||||
enable_mcoverlay="yes"
|
enable_mcoverlay="yes"
|
||||||
fi
|
fi
|
||||||
if [ ${linux_version_code} -ge 262144 -a ${linux_version_code} -lt 262400 ]; then
|
if [ ${linux_version_code} -ge 262144 -a ${linux_version_code} -lt 262400 ]; then
|
||||||
@@ -225,7 +260,11 @@ fi
|
|||||||
|
|
||||||
# Remove mcoverlay if loaded
|
# Remove mcoverlay if loaded
|
||||||
if [ "$enable_mcoverlay" == "yes" ]; then
|
if [ "$enable_mcoverlay" == "yes" ]; then
|
||||||
. ${SBINDIR}/mcoverlay-destroy.sh
|
${SBINDIR}/mcoverlay-destroy.sh
|
||||||
|
ret=$?
|
||||||
|
if [ $ret -ne 0 ]; then
|
||||||
|
error_exit "initial"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Stop irqbalance
|
# Stop irqbalance
|
||||||
@@ -236,9 +275,9 @@ if [ "${irqbalance_used}" == "yes" ]; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi;
|
fi;
|
||||||
|
|
||||||
if ! etcdir=@ETCDIR@ perl -e 'use File::Copy qw(copy); $etcdir=$ENV{'etcdir'}; @files = grep { -f } glob "/proc/irq/*/smp_affinity"; foreach $file (@files) { $rel = substr($file, 1); $dir=substr($rel, 0, length($rel)-length("/smp_affinity")); if(0) { print "cp $file $etcdir/$rel\n";} if(system("mkdir -p $etcdir/$dir")){ exit 1;} if(!copy($file,"$etcdir/$rel")){ exit 1;} }'; then
|
if ! perl -e 'use File::Copy qw(copy); $tmpdir="/tmp/mcreboot"; @files = grep { -f } glob "/proc/irq/*/smp_affinity"; foreach $file (@files) { $rel = substr($file, 1); $dir = substr($rel, 0, length($rel) - length("/smp_affinity")); if (system("mkdir -p $tmpdir/$dir")) { exit 1; } if (0) { print "cp $file $tmpdir/$rel\n"; } if (!copy($file,"$tmpdir/$rel")) { exit 1; } }'; then
|
||||||
echo "error: saving /proc/irq/*/smp_affinity" >&2
|
echo "error: saving /proc/irq/*/smp_affinity" >&2
|
||||||
error_exit "mcos_sys_mounted"
|
error_exit "irqbalance_stopped"
|
||||||
fi;
|
fi;
|
||||||
|
|
||||||
# Prevent /proc/irq/*/smp_affinity from getting zero after offlining
|
# Prevent /proc/irq/*/smp_affinity from getting zero after offlining
|
||||||
@@ -252,16 +291,20 @@ if [ "${irqbalance_used}" == "yes" ]; then
|
|||||||
|
|
||||||
if ! ncpus=$ncpus smp_affinity_mask=$smp_affinity_mask perl -e '@dirs = grep { -d } glob "/proc/irq/*"; foreach $dir (@dirs) { $hit = 0; $affinity_str = `cat $dir/smp_affinity`; chomp $affinity_str; @int32strs = split /,/, $affinity_str; @int32strs_mask=split /,/, $ENV{'smp_affinity_mask'}; for($i=0;$i <= $#int32strs_mask; $i++) { $int32strs_inv[$i] = sprintf("%08x",hex($int32strs_mask[$i])^0xffffffff); if($i == 0) { $len = int((($ENV{'ncpus'}%32)+3)/4); if($len != 0) { $int32strs_inv[$i] = substr($int32strs_inv[$i], -$len, $len); } } } $inv = join(",", @int32strs_inv); $nint32s = int(($ENV{'ncpus'}+31)/32); for($j = $nint32s - 1; $j >= 0; $j--) { if(hex($int32strs[$nint32s - 1 - $j]) & hex($int32strs_mask[$nint32s - 1 - $j])) { $hit = 1; }} if($hit == 1) { $cmd = "echo $inv > $dir/smp_affinity 2>/dev/null"; system $cmd;}}'; then
|
if ! ncpus=$ncpus smp_affinity_mask=$smp_affinity_mask perl -e '@dirs = grep { -d } glob "/proc/irq/*"; foreach $dir (@dirs) { $hit = 0; $affinity_str = `cat $dir/smp_affinity`; chomp $affinity_str; @int32strs = split /,/, $affinity_str; @int32strs_mask=split /,/, $ENV{'smp_affinity_mask'}; for($i=0;$i <= $#int32strs_mask; $i++) { $int32strs_inv[$i] = sprintf("%08x",hex($int32strs_mask[$i])^0xffffffff); if($i == 0) { $len = int((($ENV{'ncpus'}%32)+3)/4); if($len != 0) { $int32strs_inv[$i] = substr($int32strs_inv[$i], -$len, $len); } } } $inv = join(",", @int32strs_inv); $nint32s = int(($ENV{'ncpus'}+31)/32); for($j = $nint32s - 1; $j >= 0; $j--) { if(hex($int32strs[$nint32s - 1 - $j]) & hex($int32strs_mask[$nint32s - 1 - $j])) { $hit = 1; }} if($hit == 1) { $cmd = "echo $inv > $dir/smp_affinity 2>/dev/null"; system $cmd;}}'; then
|
||||||
echo "error: modifying /proc/irq/*/smp_affinity" >&2
|
echo "error: modifying /proc/irq/*/smp_affinity" >&2
|
||||||
error_exit "mcos_sys_mounted"
|
error_exit "irqbalance_stopped"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Set umask so that proc/sys files/directories created by
|
||||||
|
# mcctrl.ko and mcreboot.sh have appropriate permission bits
|
||||||
|
umask_dec=$(( 8#${umask_old} & 8#0002 ))
|
||||||
|
umask 0`printf "%o" ${umask_dec}`
|
||||||
|
|
||||||
# Load IHK if not loaded
|
# Load IHK if not loaded
|
||||||
if ! grep -E 'ihk\s' /proc/modules &>/dev/null; then
|
if ! grep -E 'ihk\s' /proc/modules &>/dev/null; then
|
||||||
if ! taskset -c 0 insmod ${KMODDIR}/ihk.ko 2>/dev/null; then
|
if ! taskset -c 0 insmod ${KMODDIR}/ihk.ko 2>/dev/null; then
|
||||||
echo "error: loading ihk" >&2
|
echo "error: loading ihk" >&2
|
||||||
error_exit "irqbalance_stopped"
|
error_exit "smp_affinity_modified"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -277,7 +320,7 @@ echo 1 > /proc/sys/vm/compact_memory 2>/dev/null
|
|||||||
sync
|
sync
|
||||||
|
|
||||||
# Load IHK-SMP if not loaded and reserve CPUs and memory
|
# Load IHK-SMP if not loaded and reserve CPUs and memory
|
||||||
if ! grep ihk_smp_x86 /proc/modules &>/dev/null; then
|
if ! grep ihk_smp_@ARCH@ /proc/modules &>/dev/null; then
|
||||||
if [ "$ihk_irq" == "" ]; then
|
if [ "$ihk_irq" == "" ]; then
|
||||||
for i in `seq 64 255`; do
|
for i in `seq 64 255`; do
|
||||||
if [ ! -d /proc/irq/$i ] && [ "`cat /proc/interrupts | grep ":" | awk '{print $1}' | grep -o '[0-9]*' | grep -e '^$i$'`" == "" ]; then
|
if [ ! -d /proc/irq/$i ] && [ "`cat /proc/interrupts | grep ":" | awk '{print $1}' | grep -o '[0-9]*' | grep -e '^$i$'`" == "" ]; then
|
||||||
@@ -290,12 +333,12 @@ if ! grep ihk_smp_x86 /proc/modules &>/dev/null; then
|
|||||||
error_exit "ihk_loaded"
|
error_exit "ihk_loaded"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
if ! taskset -c 0 insmod ${KMODDIR}/ihk-smp-x86.ko ihk_start_irq=$ihk_irq ihk_ikc_irq_core=$ihk_ikc_irq_core 2>/dev/null; then
|
if ! taskset -c 0 insmod ${KMODDIR}/ihk-smp-@ARCH@.ko ihk_start_irq=$ihk_irq ihk_ikc_irq_core=$ihk_ikc_irq_core 2>/dev/null; then
|
||||||
echo "error: loading ihk-smp-x86" >&2
|
echo "error: loading ihk-smp-@ARCH@" >&2
|
||||||
error_exit "ihk_loaded"
|
error_exit "ihk_loaded"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Offline-reonline RAM (special case for OFP SNC-4 mode)
|
# Offline-reonline RAM (special case for OFP SNC-4 flat mode)
|
||||||
if [ "`hostname | grep "c[0-9][0-9][0-9][0-9].ofp"`" != "" ] && [ "`cat /sys/devices/system/node/online`" == "0-7" ]; then
|
if [ "`hostname | grep "c[0-9][0-9][0-9][0-9].ofp"`" != "" ] && [ "`cat /sys/devices/system/node/online`" == "0-7" ]; then
|
||||||
for i in 0 1 2 3; do
|
for i in 0 1 2 3; do
|
||||||
find /sys/devices/system/node/node$i/memory*/ -name "online" | while read f; do
|
find /sys/devices/system/node/node$i/memory*/ -name "online" | while read f; do
|
||||||
@@ -309,6 +352,22 @@ if ! grep ihk_smp_x86 /proc/modules &>/dev/null; then
|
|||||||
find /sys/devices/system/node/node$i/memory*/ -name "online" | while read f; do
|
find /sys/devices/system/node/node$i/memory*/ -name "online" | while read f; do
|
||||||
echo 0 > $f 2>&1 > /dev/null;
|
echo 0 > $f 2>&1 > /dev/null;
|
||||||
done
|
done
|
||||||
|
done
|
||||||
|
for i in 4 5 6 7; do
|
||||||
|
find /sys/devices/system/node/node$i/memory*/ -name "online" | while read f; do
|
||||||
|
echo 1 > $f 2>&1 > /dev/null;
|
||||||
|
done
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Offline-reonline RAM (special case for OFP Quadrant flat mode)
|
||||||
|
if [ "`hostname | grep "c[0-9][0-9][0-9][0-9].ofp"`" != "" ] && [ "`cat /sys/devices/system/node/online`" == "0-1" ]; then
|
||||||
|
for i in 1; do
|
||||||
|
find /sys/devices/system/node/node$i/memory*/ -name "online" | while read f; do
|
||||||
|
echo 0 > $f 2>&1 > /dev/null;
|
||||||
|
done
|
||||||
|
done
|
||||||
|
for i in 1; do
|
||||||
find /sys/devices/system/node/node$i/memory*/ -name "online" | while read f; do
|
find /sys/devices/system/node/node$i/memory*/ -name "online" | while read f; do
|
||||||
echo 1 > $f 2>&1 > /dev/null;
|
echo 1 > $f 2>&1 > /dev/null;
|
||||||
done
|
done
|
||||||
@@ -333,13 +392,20 @@ if ! grep mcctrl /proc/modules &>/dev/null; then
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Check that different versions of binaries/scripts are not mixed
|
||||||
|
IHK_BUILDID=`${SBINDIR}/ihkconfig 0 get buildid`
|
||||||
|
if [ "${IHK_BUILDID}" != "${MCK_BUILDID}" ]; then
|
||||||
|
echo "IHK build-id (${IHK_BUILDID}) didn't match McKernel build-id (${MCK_BUILDID})." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
# Destroy all LWK instances
|
# Destroy all LWK instances
|
||||||
if ls /dev/mcos* 1>/dev/null 2>&1; then
|
if ls /dev/mcos* 1>/dev/null 2>&1; then
|
||||||
for i in /dev/mcos*; do
|
for i in /dev/mcos*; do
|
||||||
ind=`echo $i|cut -c10-`;
|
ind=`echo $i|cut -c10-`;
|
||||||
# Retry when conflicting with ihkmond
|
# Retry when conflicting with ihkmond
|
||||||
nretry=0
|
nretry=0
|
||||||
until ${SBINDIR}/ihkconfig 0 destroy $ind || [ $nretry -lt 4 ]; do
|
until ${SBINDIR}/ihkconfig 0 destroy $ind || [ $nretry -ge 4 ]; do
|
||||||
sleep 0.25
|
sleep 0.25
|
||||||
nretry=$[ $nretry + 1 ]
|
nretry=$[ $nretry + 1 ]
|
||||||
done
|
done
|
||||||
@@ -383,7 +449,7 @@ if ! ${SBINDIR}/ihkosctl 0 load ${KERNDIR}/mckernel.img; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Set kernel arguments
|
# Set kernel arguments
|
||||||
if ! ${SBINDIR}/ihkosctl 0 kargs "hidos $turbo dump_level=${DUMP_LEVEL}"; then
|
if ! ${SBINDIR}/ihkosctl 0 kargs "hidos $turbo $safe_kernel_map $idle_halt dump_level=${DUMP_LEVEL} $extra_kopts $allow_oversubscribe"; then
|
||||||
echo "error: setting kernel arguments" >&2
|
echo "error: setting kernel arguments" >&2
|
||||||
error_exit "os_created"
|
error_exit "os_created"
|
||||||
fi
|
fi
|
||||||
@@ -401,7 +467,11 @@ fi
|
|||||||
|
|
||||||
# Overlay /proc, /sys with McKernel specific contents
|
# Overlay /proc, /sys with McKernel specific contents
|
||||||
if [ "$enable_mcoverlay" == "yes" ]; then
|
if [ "$enable_mcoverlay" == "yes" ]; then
|
||||||
. ${SBINDIR}/mcoverlay-create.sh
|
${SBINDIR}/mcoverlay-create.sh
|
||||||
|
ret=$?
|
||||||
|
if [ $ret -ne 0 ]; then
|
||||||
|
error_exit "os_created"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Start irqbalance with CPUs and IRQ for McKernel banned
|
# Start irqbalance with CPUs and IRQ for McKernel banned
|
||||||
@@ -409,7 +479,9 @@ if [ "${irqbalance_used}" == "yes" ]; then
|
|||||||
banirq=`cat /proc/interrupts| perl -e 'while(<>) { if(/^\s*(\d+).*IHK\-SMP\s*$/) {print $1;}}'`
|
banirq=`cat /proc/interrupts| perl -e 'while(<>) { if(/^\s*(\d+).*IHK\-SMP\s*$/) {print $1;}}'`
|
||||||
|
|
||||||
sed "s/%mask%/$smp_affinity_mask/g" $ETCDIR/irqbalance_mck.in | sed "s/%banirq%/$banirq/g" > /tmp/irqbalance_mck
|
sed "s/%mask%/$smp_affinity_mask/g" $ETCDIR/irqbalance_mck.in | sed "s/%banirq%/$banirq/g" > /tmp/irqbalance_mck
|
||||||
systemctl disable irqbalance_mck.service >/dev/null 2>/dev/null
|
|
||||||
|
disable_irqbalance_mck
|
||||||
|
|
||||||
if ! systemctl link $ETCDIR/irqbalance_mck.service >/dev/null 2>/dev/null; then
|
if ! systemctl link $ETCDIR/irqbalance_mck.service >/dev/null 2>/dev/null; then
|
||||||
echo "error: linking irqbalance_mck" >&2
|
echo "error: linking irqbalance_mck" >&2
|
||||||
error_exit "mcos_sys_mounted"
|
error_exit "mcos_sys_mounted"
|
||||||
@@ -421,3 +493,8 @@ if [ "${irqbalance_used}" == "yes" ]; then
|
|||||||
fi
|
fi
|
||||||
# echo cpus=$cpus ncpus=$ncpus banirq=$banirq
|
# echo cpus=$cpus ncpus=$ncpus banirq=$banirq
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Restore umask
|
||||||
|
umask ${umask_old}
|
||||||
|
|
||||||
|
exit 0
|
||||||
@@ -18,17 +18,24 @@ mem=""
|
|||||||
cpus=""
|
cpus=""
|
||||||
irqbalance_used=""
|
irqbalance_used=""
|
||||||
|
|
||||||
|
disable_irqbalance_mck() {
|
||||||
|
if [ -f /etc/systemd/system/irqbalance_mck.service ]; then
|
||||||
|
systemctl disable irqbalance_mck.service >/dev/null 2>/dev/null
|
||||||
|
|
||||||
|
# Invalid .service file persists so remove it
|
||||||
|
rm -f /etc/systemd/system/irqbalance_mck.service
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
# No SMP module? Exit.
|
# No SMP module? Exit.
|
||||||
if ! grep ihk_smp_x86 /proc/modules &>/dev/null; then exit 0; fi
|
if ! grep ihk_smp_@ARCH@ /proc/modules &>/dev/null; then exit 0; fi
|
||||||
|
|
||||||
if [ "`systemctl status irqbalance_mck.service 2> /dev/null |grep -E 'Active: active'`" != "" ]; then
|
if [ "`systemctl status irqbalance_mck.service 2> /dev/null |grep -E 'Active: active'`" != "" ]; then
|
||||||
irqbalance_used="yes"
|
irqbalance_used="yes"
|
||||||
if ! systemctl stop irqbalance_mck.service 2>/dev/null; then
|
if ! systemctl stop irqbalance_mck.service 2>/dev/null; then
|
||||||
echo "warning: failed to stop irqbalance_mck" >&2
|
echo "warning: failed to stop irqbalance_mck" >&2
|
||||||
fi
|
fi
|
||||||
if ! systemctl disable irqbalance_mck.service >/dev/null 2>/dev/null; then
|
disable_irqbalance_mck
|
||||||
echo "warning: failed to disable irqbalance_mck" >&2
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Destroy all LWK instances
|
# Destroy all LWK instances
|
||||||
@@ -37,7 +44,7 @@ if ls /dev/mcos* 1>/dev/null 2>&1; then
|
|||||||
ind=`echo $i|cut -c10-`;
|
ind=`echo $i|cut -c10-`;
|
||||||
# Retry when conflicting with ihkmond
|
# Retry when conflicting with ihkmond
|
||||||
nretry=0
|
nretry=0
|
||||||
until ${SBINDIR}/ihkconfig 0 destroy $ind || [ $nretry -lt 4 ]; do
|
until ${SBINDIR}/ihkconfig 0 destroy $ind || [ $nretry -ge 4 ]; do
|
||||||
sleep 0.25
|
sleep 0.25
|
||||||
nretry=$[ $nretry + 1 ]
|
nretry=$[ $nretry + 1 ]
|
||||||
done
|
done
|
||||||
@@ -48,6 +55,9 @@ if ls /dev/mcos* 1>/dev/null 2>&1; then
|
|||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Allow ihkmond to flush kmsg buffer
|
||||||
|
sleep 2.0
|
||||||
|
|
||||||
# Query IHK-SMP resources and release them
|
# Query IHK-SMP resources and release them
|
||||||
if ! ${SBINDIR}/ihkconfig 0 query cpu > /dev/null; then
|
if ! ${SBINDIR}/ihkconfig 0 query cpu > /dev/null; then
|
||||||
echo "error: querying cpus" >&2
|
echo "error: querying cpus" >&2
|
||||||
@@ -62,17 +72,23 @@ if [ "${cpus}" != "" ]; then
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! ${SBINDIR}/ihkconfig 0 query mem > /dev/null; then
|
#if ! ${SBINDIR}/ihkconfig 0 query mem > /dev/null; then
|
||||||
echo "error: querying memory" >&2
|
# echo "error: querying memory" >&2
|
||||||
exit 1
|
# exit 1
|
||||||
fi
|
#fi
|
||||||
|
#
|
||||||
|
#mem=`${SBINDIR}/ihkconfig 0 query mem`
|
||||||
|
#if [ "${mem}" != "" ]; then
|
||||||
|
# if ! ${SBINDIR}/ihkconfig 0 release mem $mem > /dev/null; then
|
||||||
|
# echo "error: releasing memory" >&2
|
||||||
|
# exit 1
|
||||||
|
# fi
|
||||||
|
#fi
|
||||||
|
|
||||||
mem=`${SBINDIR}/ihkconfig 0 query mem`
|
# Release all memory
|
||||||
if [ "${mem}" != "" ]; then
|
if ! ${SBINDIR}/ihkconfig 0 release mem "all" > /dev/null; then
|
||||||
if ! ${SBINDIR}/ihkconfig 0 release mem $mem > /dev/null; then
|
echo "error: releasing memory" >&2
|
||||||
echo "error: releasing memory" >&2
|
exit 1
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Remove delegator if loaded
|
# Remove delegator if loaded
|
||||||
@@ -84,12 +100,18 @@ if grep mcctrl /proc/modules &>/dev/null; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Remove mcoverlay if loaded
|
# Remove mcoverlay if loaded
|
||||||
. ${SBINDIR}/mcoverlay-destroy.sh
|
${SBINDIR}/mcoverlay-destroy.sh
|
||||||
|
ret=$?
|
||||||
|
if [ $ret -ne 0 ]; then
|
||||||
|
echo "error: mcoverlay-destroy.sh" >&2
|
||||||
|
exit $ret
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
# Remove SMP module
|
# Remove SMP module
|
||||||
if grep ihk_smp_x86 /proc/modules &>/dev/null; then
|
if grep ihk_smp_@ARCH@ /proc/modules &>/dev/null; then
|
||||||
if ! rmmod ihk_smp_x86 2>/dev/null; then
|
if ! rmmod ihk_smp_@ARCH@ 2>/dev/null; then
|
||||||
echo "error: removing ihk_smp_x86" >&2
|
echo "error: removing ihk_smp_@ARCH@" >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
@@ -110,9 +132,10 @@ fi
|
|||||||
|
|
||||||
# Start irqbalance with the original settings
|
# Start irqbalance with the original settings
|
||||||
if [ "${irqbalance_used}" != "" ]; then
|
if [ "${irqbalance_used}" != "" ]; then
|
||||||
if ! etcdir=@ETCDIR@ perl -e '$etcdir=$ENV{'etcdir'}; @files = grep { -f } glob "$etcdir/proc/irq/*/smp_affinity"; foreach $file (@files) { $dest = substr($file, length($etcdir)); if(0) {print "cp $file $dest\n";} system("cp $file $dest 2>/dev/null"); }'; then
|
if ! perl -e '$tmpdir="/tmp/mcreboot"; @files = grep { -f } glob "$tmpdir/proc/irq/*/smp_affinity"; foreach $file (@files) { $dest = substr($file, length($tmpdir)); if (0) {print "cp $file $dest\n";} system("cp $file $dest 2>/dev/null"); }'; then
|
||||||
echo "warning: failed to restore /proc/irq/*/smp_affinity" >&2
|
echo "warning: failed to restore /proc/irq/*/smp_affinity" >&2
|
||||||
fi
|
fi
|
||||||
|
if [ -e /tmp/mcreboot ]; then rm -rf /tmp/mcreboot; fi
|
||||||
if ! systemctl start irqbalance.service; then
|
if ! systemctl start irqbalance.service; then
|
||||||
echo "warning: failed to start irqbalance" >&2;
|
echo "warning: failed to start irqbalance" >&2;
|
||||||
fi
|
fi
|
||||||
53
config.h.in
53
config.h.in
@@ -3,13 +3,19 @@
|
|||||||
/* Path of install directory for binary */
|
/* Path of install directory for binary */
|
||||||
#undef BINDIR
|
#undef BINDIR
|
||||||
|
|
||||||
|
/* IHK build-id to confirm IHK and McKernel built at the same time are used */
|
||||||
|
#undef BUILDID
|
||||||
|
|
||||||
/* whether mcoverlayfs is enabled */
|
/* whether mcoverlayfs is enabled */
|
||||||
#undef ENABLE_MCOVERLAYFS
|
#undef ENABLE_MCOVERLAYFS
|
||||||
|
|
||||||
/* whether memdump feature is enabled */
|
/* whether memdump feature is enabled */
|
||||||
#undef ENABLE_MEMDUMP
|
#undef ENABLE_MEMDUMP
|
||||||
|
|
||||||
/* whether mcoverlayfs is enabled */
|
/* whether perf is enabled */
|
||||||
|
#undef ENABLE_PERF
|
||||||
|
|
||||||
|
/* whether qlmpi is enabled */
|
||||||
#undef ENABLE_QLMPI
|
#undef ENABLE_QLMPI
|
||||||
|
|
||||||
/* whether rusage is enabled */
|
/* whether rusage is enabled */
|
||||||
@@ -48,48 +54,6 @@
|
|||||||
/* Define to 1 if you have the <unistd.h> header file. */
|
/* Define to 1 if you have the <unistd.h> header file. */
|
||||||
#undef HAVE_UNISTD_H
|
#undef HAVE_UNISTD_H
|
||||||
|
|
||||||
/* Define to address of kernel symbol __vvar_page, or 0 if exported */
|
|
||||||
#undef MCCTRL_KSYM___vvar_page
|
|
||||||
|
|
||||||
/* Define to address of kernel symbol hpet_address, or 0 if exported */
|
|
||||||
#undef MCCTRL_KSYM_hpet_address
|
|
||||||
|
|
||||||
/* Define to address of kernel symbol hv_clock, or 0 if exported */
|
|
||||||
#undef MCCTRL_KSYM_hv_clock
|
|
||||||
|
|
||||||
/* Define to address of kernel symbol sys_mount, or 0 if exported */
|
|
||||||
#undef MCCTRL_KSYM_sys_mount
|
|
||||||
|
|
||||||
/* Define to address of kernel symbol sys_readlink, or 0 if exported */
|
|
||||||
#undef MCCTRL_KSYM_sys_readlink
|
|
||||||
|
|
||||||
/* Define to address of kernel symbol sys_umount, or 0 if exported */
|
|
||||||
#undef MCCTRL_KSYM_sys_umount
|
|
||||||
|
|
||||||
/* Define to address of kernel symbol sys_unshare, or 0 if exported */
|
|
||||||
#undef MCCTRL_KSYM_sys_unshare
|
|
||||||
|
|
||||||
/* Define to address of kernel symbol vdso_end, or 0 if exported */
|
|
||||||
#undef MCCTRL_KSYM_vdso_end
|
|
||||||
|
|
||||||
/* Define to address of kernel symbol vdso_image_64, or 0 if exported */
|
|
||||||
#undef MCCTRL_KSYM_vdso_image_64
|
|
||||||
|
|
||||||
/* Define to address of kernel symbol vdso_pages, or 0 if exported */
|
|
||||||
#undef MCCTRL_KSYM_vdso_pages
|
|
||||||
|
|
||||||
/* Define to address of kernel symbol vdso_spec, or 0 if exported */
|
|
||||||
#undef MCCTRL_KSYM_vdso_spec
|
|
||||||
|
|
||||||
/* Define to address of kernel symbol vdso_start, or 0 if exported */
|
|
||||||
#undef MCCTRL_KSYM_vdso_start
|
|
||||||
|
|
||||||
/* Define to address of kernel symbol walk_page_range, or 0 if exported */
|
|
||||||
#undef MCCTRL_KSYM_walk_page_range
|
|
||||||
|
|
||||||
/* Define to address of kernel symbol zap_page_range, or 0 if exported */
|
|
||||||
#undef MCCTRL_KSYM_zap_page_range
|
|
||||||
|
|
||||||
/* McKernel specific headers */
|
/* McKernel specific headers */
|
||||||
#undef MCKERNEL_INCDIR
|
#undef MCKERNEL_INCDIR
|
||||||
|
|
||||||
@@ -122,3 +86,6 @@
|
|||||||
|
|
||||||
/* Define to 1 if you have the ANSI C header files. */
|
/* Define to 1 if you have the ANSI C header files. */
|
||||||
#undef STDC_HEADERS
|
#undef STDC_HEADERS
|
||||||
|
|
||||||
|
/* whether or not syscall_intercept library is linked */
|
||||||
|
#undef WITH_SYSCALL_INTERCEPT
|
||||||
|
|||||||
732
configure
vendored
732
configure
vendored
@@ -1,6 +1,6 @@
|
|||||||
#! /bin/sh
|
#! /bin/sh
|
||||||
# Guess values for system-dependent variables and create Makefiles.
|
# Guess values for system-dependent variables and create Makefiles.
|
||||||
# Generated by GNU Autoconf 2.69 for mckernel 0.9.0.
|
# Generated by GNU Autoconf 2.69 for mckernel 1.6.0.
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
|
# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
|
||||||
@@ -577,8 +577,8 @@ MAKEFLAGS=
|
|||||||
# Identity of this package.
|
# Identity of this package.
|
||||||
PACKAGE_NAME='mckernel'
|
PACKAGE_NAME='mckernel'
|
||||||
PACKAGE_TARNAME='mckernel'
|
PACKAGE_TARNAME='mckernel'
|
||||||
PACKAGE_VERSION='0.9.0'
|
PACKAGE_VERSION='1.6.0'
|
||||||
PACKAGE_STRING='mckernel 0.9.0'
|
PACKAGE_STRING='mckernel 1.6.0'
|
||||||
PACKAGE_BUGREPORT=''
|
PACKAGE_BUGREPORT=''
|
||||||
PACKAGE_URL=''
|
PACKAGE_URL=''
|
||||||
|
|
||||||
@@ -628,9 +628,12 @@ IHK_RELEASE_DATE
|
|||||||
DCFA_VERSION
|
DCFA_VERSION
|
||||||
MCKERNEL_VERSION
|
MCKERNEL_VERSION
|
||||||
IHK_VERSION
|
IHK_VERSION
|
||||||
|
WITH_SYSCALL_INTERCEPT
|
||||||
ENABLE_QLMPI
|
ENABLE_QLMPI
|
||||||
ENABLE_RUSAGE
|
ENABLE_RUSAGE
|
||||||
ENABLE_MCOVERLAYFS
|
ENABLE_MCOVERLAYFS
|
||||||
|
LDFLAGS_SYSCALL_INTERCEPT
|
||||||
|
CPPFLAGS_SYSCALL_INTERCEPT
|
||||||
MANDIR
|
MANDIR
|
||||||
KERNDIR
|
KERNDIR
|
||||||
KMODDIR
|
KMODDIR
|
||||||
@@ -645,6 +648,7 @@ TARGET
|
|||||||
UNAME_R
|
UNAME_R
|
||||||
KDIR
|
KDIR
|
||||||
ARCH
|
ARCH
|
||||||
|
BUILDID
|
||||||
XCC
|
XCC
|
||||||
FGREP
|
FGREP
|
||||||
EGREP
|
EGREP
|
||||||
@@ -701,6 +705,9 @@ enable_option_checking
|
|||||||
with_mpi
|
with_mpi
|
||||||
with_mpi_include
|
with_mpi_include
|
||||||
with_mpi_lib
|
with_mpi_lib
|
||||||
|
with_syscall_intercept
|
||||||
|
with_syscall_intercept_include
|
||||||
|
with_syscall_intercept_lib
|
||||||
with_kernelsrc
|
with_kernelsrc
|
||||||
with_target
|
with_target
|
||||||
with_system_map
|
with_system_map
|
||||||
@@ -708,6 +715,7 @@ enable_dcfa
|
|||||||
enable_memdump
|
enable_memdump
|
||||||
enable_mcoverlayfs
|
enable_mcoverlayfs
|
||||||
enable_rusage
|
enable_rusage
|
||||||
|
enable_perf
|
||||||
enable_qlmpi
|
enable_qlmpi
|
||||||
with_uname_r
|
with_uname_r
|
||||||
'
|
'
|
||||||
@@ -1260,7 +1268,7 @@ if test "$ac_init_help" = "long"; then
|
|||||||
# Omit some internal or obsolete options to make the list less imposing.
|
# Omit some internal or obsolete options to make the list less imposing.
|
||||||
# This message is too long to be a string in the A/UX 3.1 sh.
|
# This message is too long to be a string in the A/UX 3.1 sh.
|
||||||
cat <<_ACEOF
|
cat <<_ACEOF
|
||||||
\`configure' configures mckernel 0.9.0 to adapt to many kinds of systems.
|
\`configure' configures mckernel 1.6.0 to adapt to many kinds of systems.
|
||||||
|
|
||||||
Usage: $0 [OPTION]... [VAR=VALUE]...
|
Usage: $0 [OPTION]... [VAR=VALUE]...
|
||||||
|
|
||||||
@@ -1321,7 +1329,7 @@ fi
|
|||||||
|
|
||||||
if test -n "$ac_init_help"; then
|
if test -n "$ac_init_help"; then
|
||||||
case $ac_init_help in
|
case $ac_init_help in
|
||||||
short | recursive ) echo "Configuration of mckernel 0.9.0:";;
|
short | recursive ) echo "Configuration of mckernel 1.6.0:";;
|
||||||
esac
|
esac
|
||||||
cat <<\_ACEOF
|
cat <<\_ACEOF
|
||||||
|
|
||||||
@@ -1333,6 +1341,7 @@ Optional Features:
|
|||||||
--enable-memdump enable dumping memory and analyzing a dump
|
--enable-memdump enable dumping memory and analyzing a dump
|
||||||
--enable-mcoverlayfs enable mcoverlayfs implementation
|
--enable-mcoverlayfs enable mcoverlayfs implementation
|
||||||
--enable-rusage enable rusage implementation
|
--enable-rusage enable rusage implementation
|
||||||
|
--enable-perf enable perf_event implementation
|
||||||
--enable-qlmpi enable qlmpi implementation
|
--enable-qlmpi enable qlmpi implementation
|
||||||
|
|
||||||
Optional Packages:
|
Optional Packages:
|
||||||
@@ -1343,6 +1352,15 @@ Optional Packages:
|
|||||||
--with-mpi-include=PATH specify path where mpi include directory can be
|
--with-mpi-include=PATH specify path where mpi include directory can be
|
||||||
found
|
found
|
||||||
--with-mpi-lib=PATH specify path where mpi lib directory can be found
|
--with-mpi-lib=PATH specify path where mpi lib directory can be found
|
||||||
|
--with-syscall_intercept=PATH
|
||||||
|
specify path where syscall_intercept include
|
||||||
|
directory and lib directory can be found
|
||||||
|
--with-syscall_intercept-include=PATH
|
||||||
|
specify path where syscall_intercept include
|
||||||
|
directory can be found
|
||||||
|
--with-syscall_intercept-lib=PATH
|
||||||
|
specify path where syscall_intercept lib directory
|
||||||
|
can be found
|
||||||
--with-kernelsrc=path Path to 'kernel src', default is
|
--with-kernelsrc=path Path to 'kernel src', default is
|
||||||
/lib/modules/uname_r/build
|
/lib/modules/uname_r/build
|
||||||
--with-target={attached-mic | builtin-mic | builtin-x86 | smp-x86}
|
--with-target={attached-mic | builtin-mic | builtin-x86 | smp-x86}
|
||||||
@@ -1428,7 +1446,7 @@ fi
|
|||||||
test -n "$ac_init_help" && exit $ac_status
|
test -n "$ac_init_help" && exit $ac_status
|
||||||
if $ac_init_version; then
|
if $ac_init_version; then
|
||||||
cat <<\_ACEOF
|
cat <<\_ACEOF
|
||||||
mckernel configure 0.9.0
|
mckernel configure 1.6.0
|
||||||
generated by GNU Autoconf 2.69
|
generated by GNU Autoconf 2.69
|
||||||
|
|
||||||
Copyright (C) 2012 Free Software Foundation, Inc.
|
Copyright (C) 2012 Free Software Foundation, Inc.
|
||||||
@@ -1726,7 +1744,7 @@ cat >config.log <<_ACEOF
|
|||||||
This file contains any messages produced by compilers while
|
This file contains any messages produced by compilers while
|
||||||
running configure, to aid debugging if configure makes a mistake.
|
running configure, to aid debugging if configure makes a mistake.
|
||||||
|
|
||||||
It was created by mckernel $as_me 0.9.0, which was
|
It was created by mckernel $as_me 1.6.0, which was
|
||||||
generated by GNU Autoconf 2.69. Invocation command line was
|
generated by GNU Autoconf 2.69. Invocation command line was
|
||||||
|
|
||||||
$ $0 $@
|
$ $0 $@
|
||||||
@@ -2079,12 +2097,14 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
IHK_VERSION=0.9.0
|
|
||||||
MCKERNEL_VERSION=0.9.0
|
|
||||||
DCFA_VERSION=0.9.0
|
IHK_VERSION=1.6.0
|
||||||
IHK_RELEASE_DATE=2013-11-18
|
MCKERNEL_VERSION=1.6.0
|
||||||
MCKERNEL_RELEASE_DATE=2013-11-18
|
DCFA_VERSION=DCFA_VERSION_m4
|
||||||
DCFA_RELEASE_DATE=2013-11-18
|
IHK_RELEASE_DATE=2018-11-11
|
||||||
|
MCKERNEL_RELEASE_DATE=2018-11-11
|
||||||
|
DCFA_RELEASE_DATE=DCFA_RELEASE_DATE_m4
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -3510,6 +3530,195 @@ fi
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Check whether --with-syscall_intercept was given.
|
||||||
|
if test "${with_syscall_intercept+set}" = set; then :
|
||||||
|
withval=$with_syscall_intercept; case "$withval" in #(
|
||||||
|
yes|no|'') :
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --without-syscall_intercept=PATH expects a valid PATH" >&5
|
||||||
|
$as_echo "$as_me: WARNING: --without-syscall_intercept=PATH expects a valid PATH" >&2;}
|
||||||
|
with_syscall_intercept="" ;; #(
|
||||||
|
*) :
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
else
|
||||||
|
with_syscall_intercept=
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# Check whether --with-syscall_intercept-include was given.
|
||||||
|
if test "${with_syscall_intercept_include+set}" = set; then :
|
||||||
|
withval=$with_syscall_intercept_include; case "$withval" in #(
|
||||||
|
yes|no|'') :
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --without-syscall_intercept-include=PATH expects a valid PATH" >&5
|
||||||
|
$as_echo "$as_me: WARNING: --without-syscall_intercept-include=PATH expects a valid PATH" >&2;}
|
||||||
|
with_syscall_intercept_include="" ;; #(
|
||||||
|
*) :
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# Check whether --with-syscall_intercept-lib was given.
|
||||||
|
if test "${with_syscall_intercept_lib+set}" = set; then :
|
||||||
|
withval=$with_syscall_intercept_lib; case "$withval" in #(
|
||||||
|
yes|no|'') :
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --without-syscall_intercept-lib=PATH expects a valid PATH" >&5
|
||||||
|
$as_echo "$as_me: WARNING: --without-syscall_intercept-lib=PATH expects a valid PATH" >&2;}
|
||||||
|
with_syscall_intercept_lib="" ;; #(
|
||||||
|
*) :
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# The args have been sanitized into empty/non-empty values above.
|
||||||
|
# Now append -I/-L args to CPPFLAGS/LDFLAGS, with more specific options
|
||||||
|
# taking priority
|
||||||
|
|
||||||
|
if test -n "${with_syscall_intercept_include}"; then :
|
||||||
|
|
||||||
|
|
||||||
|
if echo "$CPPFLAGS_SYSCALL_INTERCEPT" | $FGREP -e "\<-I${with_syscall_intercept_include}\>" >/dev/null 2>&1; then :
|
||||||
|
echo "CPPFLAGS_SYSCALL_INTERCEPT(='$CPPFLAGS_SYSCALL_INTERCEPT') contains '-I${with_syscall_intercept_include}', not appending" >&5
|
||||||
|
else
|
||||||
|
echo "CPPFLAGS_SYSCALL_INTERCEPT(='$CPPFLAGS_SYSCALL_INTERCEPT') does not contain '-I${with_syscall_intercept_include}', appending" >&5
|
||||||
|
CPPFLAGS_SYSCALL_INTERCEPT="$CPPFLAGS_SYSCALL_INTERCEPT -I${with_syscall_intercept_include}"
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
else
|
||||||
|
if test -n "${with_syscall_intercept}"; then :
|
||||||
|
|
||||||
|
|
||||||
|
if echo "$CPPFLAGS_SYSCALL_INTERCEPT" | $FGREP -e "\<-I${with_syscall_intercept}/include\>" >/dev/null 2>&1; then :
|
||||||
|
echo "CPPFLAGS_SYSCALL_INTERCEPT(='$CPPFLAGS_SYSCALL_INTERCEPT') contains '-I${with_syscall_intercept}/include', not appending" >&5
|
||||||
|
else
|
||||||
|
echo "CPPFLAGS_SYSCALL_INTERCEPT(='$CPPFLAGS_SYSCALL_INTERCEPT') does not contain '-I${with_syscall_intercept}/include', appending" >&5
|
||||||
|
CPPFLAGS_SYSCALL_INTERCEPT="$CPPFLAGS_SYSCALL_INTERCEPT -I${with_syscall_intercept}/include"
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -n "${with_syscall_intercept_lib}"; then :
|
||||||
|
|
||||||
|
|
||||||
|
if echo "$LDFLAGS_SYSCALL_INTERCEPT" | $FGREP -e "\<-L${with_syscall_intercept_lib} -Wl,-rpath,${with_syscall_intercept_lib}\>" >/dev/null 2>&1; then :
|
||||||
|
echo "LDFLAGS_SYSCALL_INTERCEPT(='$LDFLAGS_SYSCALL_INTERCEPT') contains '-L${with_syscall_intercept_lib} -Wl,-rpath,${with_syscall_intercept_lib}', not appending" >&5
|
||||||
|
else
|
||||||
|
echo "LDFLAGS_SYSCALL_INTERCEPT(='$LDFLAGS_SYSCALL_INTERCEPT') does not contain '-L${with_syscall_intercept_lib} -Wl,-rpath,${with_syscall_intercept_lib}', appending" >&5
|
||||||
|
LDFLAGS_SYSCALL_INTERCEPT="$LDFLAGS_SYSCALL_INTERCEPT -L${with_syscall_intercept_lib} -Wl,-rpath,${with_syscall_intercept_lib}"
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
else
|
||||||
|
if test -n "${with_syscall_intercept}"; then :
|
||||||
|
|
||||||
|
|
||||||
|
if echo "$LDFLAGS_SYSCALL_INTERCEPT" | $FGREP -e "\<-L${with_syscall_intercept}/lib -Wl,-rpath,${with_syscall_intercept}/lib\>" >/dev/null 2>&1; then :
|
||||||
|
echo "LDFLAGS_SYSCALL_INTERCEPT(='$LDFLAGS_SYSCALL_INTERCEPT') contains '-L${with_syscall_intercept}/lib -Wl,-rpath,${with_syscall_intercept}/lib', not appending" >&5
|
||||||
|
else
|
||||||
|
echo "LDFLAGS_SYSCALL_INTERCEPT(='$LDFLAGS_SYSCALL_INTERCEPT') does not contain '-L${with_syscall_intercept}/lib -Wl,-rpath,${with_syscall_intercept}/lib', appending" >&5
|
||||||
|
LDFLAGS_SYSCALL_INTERCEPT="$LDFLAGS_SYSCALL_INTERCEPT -L${with_syscall_intercept}/lib -Wl,-rpath,${with_syscall_intercept}/lib"
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -d "${with_syscall_intercept}/lib64"; then :
|
||||||
|
|
||||||
|
|
||||||
|
if echo "$LDFLAGS_SYSCALL_INTERCEPT" | $FGREP -e "\<-L${with_syscall_intercept}/lib64 -Wl,-rpath,${with_syscall_intercept}/lib64\>" >/dev/null 2>&1; then :
|
||||||
|
echo "LDFLAGS_SYSCALL_INTERCEPT(='$LDFLAGS_SYSCALL_INTERCEPT') contains '-L${with_syscall_intercept}/lib64 -Wl,-rpath,${with_syscall_intercept}/lib64', not appending" >&5
|
||||||
|
else
|
||||||
|
echo "LDFLAGS_SYSCALL_INTERCEPT(='$LDFLAGS_SYSCALL_INTERCEPT') does not contain '-L${with_syscall_intercept}/lib64 -Wl,-rpath,${with_syscall_intercept}/lib64', appending" >&5
|
||||||
|
LDFLAGS_SYSCALL_INTERCEPT="$LDFLAGS_SYSCALL_INTERCEPT -L${with_syscall_intercept}/lib64 -Wl,-rpath,${with_syscall_intercept}/lib64"
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -n "${with_syscall_intercept}" || test -n "${with_syscall_intercept_include}" || test -n "${with_syscall_intercept_lib}"; then :
|
||||||
|
WITH_SYSCALL_INTERCEPT=yes
|
||||||
|
else
|
||||||
|
WITH_SYSCALL_INTERCEPT=no
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if test "x$WITH_SYSCALL_INTERCEPT" == "xno" ; then
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for syscall_no_intercept in -lsyscall_intercept" >&5
|
||||||
|
$as_echo_n "checking for syscall_no_intercept in -lsyscall_intercept... " >&6; }
|
||||||
|
if ${ac_cv_lib_syscall_intercept_syscall_no_intercept+:} false; then :
|
||||||
|
$as_echo_n "(cached) " >&6
|
||||||
|
else
|
||||||
|
ac_check_lib_save_LIBS=$LIBS
|
||||||
|
LIBS="-lsyscall_intercept -lcapstone -ldl $LIBS"
|
||||||
|
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||||
|
/* end confdefs.h. */
|
||||||
|
|
||||||
|
/* Override any GCC internal prototype to avoid an error.
|
||||||
|
Use char because int might match the return type of a GCC
|
||||||
|
builtin and then its argument prototype would still apply. */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
#endif
|
||||||
|
char syscall_no_intercept ();
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
return syscall_no_intercept ();
|
||||||
|
;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
_ACEOF
|
||||||
|
if ac_fn_c_try_link "$LINENO"; then :
|
||||||
|
ac_cv_lib_syscall_intercept_syscall_no_intercept=yes
|
||||||
|
else
|
||||||
|
ac_cv_lib_syscall_intercept_syscall_no_intercept=no
|
||||||
|
fi
|
||||||
|
rm -f core conftest.err conftest.$ac_objext \
|
||||||
|
conftest$ac_exeext conftest.$ac_ext
|
||||||
|
LIBS=$ac_check_lib_save_LIBS
|
||||||
|
fi
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_syscall_intercept_syscall_no_intercept" >&5
|
||||||
|
$as_echo "$ac_cv_lib_syscall_intercept_syscall_no_intercept" >&6; }
|
||||||
|
if test "x$ac_cv_lib_syscall_intercept_syscall_no_intercept" = xyes; then :
|
||||||
|
syscall_intercept_lib_found=yes
|
||||||
|
else
|
||||||
|
syscall_intercept_lib_found=no
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "x$syscall_intercept_lib_found" != "xyes"; then :
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: libsyscall_intercept.so not found" >&5
|
||||||
|
$as_echo "$as_me: libsyscall_intercept.so not found" >&6;}
|
||||||
|
fi
|
||||||
|
|
||||||
|
ac_fn_c_check_header_mongrel "$LINENO" "libsyscall_intercept_hook_point.h" "ac_cv_header_libsyscall_intercept_hook_point_h" "$ac_includes_default"
|
||||||
|
if test "x$ac_cv_header_libsyscall_intercept_hook_point_h" = xyes; then :
|
||||||
|
syscall_intercept_header_found=yes
|
||||||
|
else
|
||||||
|
syscall_intercept_header_found=no
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if test "x$syscall_intercept_header_found" != "xyes"; then :
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: libsyscall_intercept_hook_point.h not found" >&5
|
||||||
|
$as_echo "$as_me: libsyscall_intercept_hook_point.h not found" >&6;}
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "x$syscall_intercept_lib_found" == "xyes" && test "x$syscall_intercept_header_found" == "xyes"; then :
|
||||||
|
WITH_SYSCALL_INTERCEPT=yes
|
||||||
|
else
|
||||||
|
WITH_SYSCALL_INTERCEPT=no
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Check whether --with-kernelsrc was given.
|
# Check whether --with-kernelsrc was given.
|
||||||
if test "${with_kernelsrc+set}" = set; then :
|
if test "${with_kernelsrc+set}" = set; then :
|
||||||
withval=$with_kernelsrc; WITH_KERNELSRC=$withval
|
withval=$with_kernelsrc; WITH_KERNELSRC=$withval
|
||||||
@@ -3568,6 +3777,14 @@ else
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# Check whether --enable-perf was given.
|
||||||
|
if test "${enable_perf+set}" = set; then :
|
||||||
|
enableval=$enable_perf; ENABLE_PERF=$enableval
|
||||||
|
else
|
||||||
|
ENABLE_PERF=yes
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
# Check whether --enable-qlmpi was given.
|
# Check whether --enable-qlmpi was given.
|
||||||
if test "${enable_qlmpi+set}" = set; then :
|
if test "${enable_qlmpi+set}" = set; then :
|
||||||
enableval=$enable_qlmpi; ENABLE_QLMPI=$enableval
|
enableval=$enable_qlmpi; ENABLE_QLMPI=$enableval
|
||||||
@@ -4275,7 +4492,7 @@ case $WITH_TARGET in
|
|||||||
KMODDIR="$prefix/kmod"
|
KMODDIR="$prefix/kmod"
|
||||||
fi
|
fi
|
||||||
if test "X$MANDIR" = X; then
|
if test "X$MANDIR" = X; then
|
||||||
MANDIR="$prefix/man"
|
MANDIR="$prefix/share/man"
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
builtin-mic)
|
builtin-mic)
|
||||||
@@ -4292,7 +4509,7 @@ case $WITH_TARGET in
|
|||||||
KMODDIR="$prefix/attached/kmod"
|
KMODDIR="$prefix/attached/kmod"
|
||||||
fi
|
fi
|
||||||
if test "X$MANDIR" = X; then
|
if test "X$MANDIR" = X; then
|
||||||
MANDIR="$prefix/attached/man"
|
MANDIR="$prefix/share/man"
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
builtin-x86)
|
builtin-x86)
|
||||||
@@ -4309,7 +4526,7 @@ case $WITH_TARGET in
|
|||||||
KMODDIR="$prefix/kmod"
|
KMODDIR="$prefix/kmod"
|
||||||
fi
|
fi
|
||||||
if test "X$MANDIR" = X; then
|
if test "X$MANDIR" = X; then
|
||||||
MANDIR="$prefix/attached/man"
|
MANDIR="$prefix/share/man"
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
smp-x86)
|
smp-x86)
|
||||||
@@ -4341,7 +4558,7 @@ case $WITH_TARGET in
|
|||||||
KMODDIR="$prefix/kmod"
|
KMODDIR="$prefix/kmod"
|
||||||
fi
|
fi
|
||||||
if test "X$MANDIR" = X; then
|
if test "X$MANDIR" = X; then
|
||||||
MANDIR="$prefix/smp-x86/man"
|
MANDIR="$prefix/share/man"
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
smp-arm64)
|
smp-arm64)
|
||||||
@@ -4366,11 +4583,14 @@ case $WITH_TARGET in
|
|||||||
if test "X$ETCDIR" = X; then
|
if test "X$ETCDIR" = X; then
|
||||||
ETCDIR="$prefix/etc"
|
ETCDIR="$prefix/etc"
|
||||||
fi
|
fi
|
||||||
|
if test "X$INCLUDEDIR" = X; then
|
||||||
|
INCLUDEDIR="$prefix/include"
|
||||||
|
fi
|
||||||
if test "X$KMODDIR" = X; then
|
if test "X$KMODDIR" = X; then
|
||||||
KMODDIR="$prefix/kmod"
|
KMODDIR="$prefix/kmod"
|
||||||
fi
|
fi
|
||||||
if test "X$MANDIR" = X; then
|
if test "X$MANDIR" = X; then
|
||||||
MANDIR="$prefix/smp-arm64/man"
|
MANDIR="$prefix/share/man"
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
@@ -4382,399 +4602,6 @@ KDIR="$WITH_KERNELSRC"
|
|||||||
UNAME_R="$WITH_UNAME_R"
|
UNAME_R="$WITH_UNAME_R"
|
||||||
TARGET="$WITH_TARGET"
|
TARGET="$WITH_TARGET"
|
||||||
|
|
||||||
MCCTRL_LINUX_SYMTAB=""
|
|
||||||
case "X$WITH_SYSTEM_MAP" in
|
|
||||||
Xyes | Xno | X)
|
|
||||||
MCCTRL_LINUX_SYMTAB=""
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
MCCTRL_LINUX_SYMTAB="$WITH_SYSTEM_MAP"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for System.map" >&5
|
|
||||||
$as_echo_n "checking for System.map... " >&6; }
|
|
||||||
if test -r "$MCCTRL_LINUX_SYMTAB"; then
|
|
||||||
MCCTRL_LINUX_SYMTAB="$MCCTRL_LINUX_SYMTAB"
|
|
||||||
elif test -r "/boot/System.map-`uname -r`"; then
|
|
||||||
MCCTRL_LINUX_SYMTAB="/boot/System.map-`uname -r`"
|
|
||||||
elif test -r "$KDIR/System.map"; then
|
|
||||||
MCCTRL_LINUX_SYMTAB="$KDIR/System.map"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "$MCCTRL_LINUX_SYMTAB" == ""; then
|
|
||||||
as_fn_error $? "could not find" "$LINENO" 5
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test -z "`eval cat $MCCTRL_LINUX_SYMTAB`"; then
|
|
||||||
as_fn_error $? "could not read System.map file, no read permission?" "$LINENO" 5
|
|
||||||
fi
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MCCTRL_LINUX_SYMTAB" >&5
|
|
||||||
$as_echo "$MCCTRL_LINUX_SYMTAB" >&6; }
|
|
||||||
|
|
||||||
MCCTRL_LINUX_SYMTAB_CMD="cat $MCCTRL_LINUX_SYMTAB"
|
|
||||||
|
|
||||||
# MCCTRL_FIND_KSYM(SYMBOL)
|
|
||||||
# ------------------------------------------------------
|
|
||||||
# Search System.map for address of the given symbol and
|
|
||||||
# do one of three things in config.h:
|
|
||||||
# If not found, leave MCCTRL_KSYM_foo undefined
|
|
||||||
# If found to be exported, "#define MCCTRL_KSYM_foo 0"
|
|
||||||
# If found not to be exported, "#define MCCTRL_KSYM_foo 0x<value>"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking System.map for symbol sys_mount" >&5
|
|
||||||
$as_echo_n "checking System.map for symbol sys_mount... " >&6; }
|
|
||||||
mcctrl_addr=`eval $MCCTRL_LINUX_SYMTAB_CMD | grep " sys_mount\$" | cut -d\ -f1`
|
|
||||||
if test -z $mcctrl_addr; then
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
|
|
||||||
$as_echo "not found" >&6; }
|
|
||||||
else
|
|
||||||
mcctrl_result=$mcctrl_addr
|
|
||||||
mcctrl_addr="0x$mcctrl_addr"
|
|
||||||
|
|
||||||
if `eval $MCCTRL_LINUX_SYMTAB_CMD | grep " __ksymtab_sys_mount\$" >/dev/null`; then
|
|
||||||
mcctrl_result="exported"
|
|
||||||
mcctrl_addr="0"
|
|
||||||
fi
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mcctrl_result" >&5
|
|
||||||
$as_echo "$mcctrl_result" >&6; }
|
|
||||||
|
|
||||||
cat >>confdefs.h <<_ACEOF
|
|
||||||
#define MCCTRL_KSYM_sys_mount $mcctrl_addr
|
|
||||||
_ACEOF
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking System.map for symbol sys_umount" >&5
|
|
||||||
$as_echo_n "checking System.map for symbol sys_umount... " >&6; }
|
|
||||||
mcctrl_addr=`eval $MCCTRL_LINUX_SYMTAB_CMD | grep " sys_umount\$" | cut -d\ -f1`
|
|
||||||
if test -z $mcctrl_addr; then
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
|
|
||||||
$as_echo "not found" >&6; }
|
|
||||||
else
|
|
||||||
mcctrl_result=$mcctrl_addr
|
|
||||||
mcctrl_addr="0x$mcctrl_addr"
|
|
||||||
|
|
||||||
if `eval $MCCTRL_LINUX_SYMTAB_CMD | grep " __ksymtab_sys_umount\$" >/dev/null`; then
|
|
||||||
mcctrl_result="exported"
|
|
||||||
mcctrl_addr="0"
|
|
||||||
fi
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mcctrl_result" >&5
|
|
||||||
$as_echo "$mcctrl_result" >&6; }
|
|
||||||
|
|
||||||
cat >>confdefs.h <<_ACEOF
|
|
||||||
#define MCCTRL_KSYM_sys_umount $mcctrl_addr
|
|
||||||
_ACEOF
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking System.map for symbol sys_unshare" >&5
|
|
||||||
$as_echo_n "checking System.map for symbol sys_unshare... " >&6; }
|
|
||||||
mcctrl_addr=`eval $MCCTRL_LINUX_SYMTAB_CMD | grep " sys_unshare\$" | cut -d\ -f1`
|
|
||||||
if test -z $mcctrl_addr; then
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
|
|
||||||
$as_echo "not found" >&6; }
|
|
||||||
else
|
|
||||||
mcctrl_result=$mcctrl_addr
|
|
||||||
mcctrl_addr="0x$mcctrl_addr"
|
|
||||||
|
|
||||||
if `eval $MCCTRL_LINUX_SYMTAB_CMD | grep " __ksymtab_sys_unshare\$" >/dev/null`; then
|
|
||||||
mcctrl_result="exported"
|
|
||||||
mcctrl_addr="0"
|
|
||||||
fi
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mcctrl_result" >&5
|
|
||||||
$as_echo "$mcctrl_result" >&6; }
|
|
||||||
|
|
||||||
cat >>confdefs.h <<_ACEOF
|
|
||||||
#define MCCTRL_KSYM_sys_unshare $mcctrl_addr
|
|
||||||
_ACEOF
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking System.map for symbol zap_page_range" >&5
|
|
||||||
$as_echo_n "checking System.map for symbol zap_page_range... " >&6; }
|
|
||||||
mcctrl_addr=`eval $MCCTRL_LINUX_SYMTAB_CMD | grep " zap_page_range\$" | cut -d\ -f1`
|
|
||||||
if test -z $mcctrl_addr; then
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
|
|
||||||
$as_echo "not found" >&6; }
|
|
||||||
else
|
|
||||||
mcctrl_result=$mcctrl_addr
|
|
||||||
mcctrl_addr="0x$mcctrl_addr"
|
|
||||||
|
|
||||||
if `eval $MCCTRL_LINUX_SYMTAB_CMD | grep " __ksymtab_zap_page_range\$" >/dev/null`; then
|
|
||||||
mcctrl_result="exported"
|
|
||||||
mcctrl_addr="0"
|
|
||||||
fi
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mcctrl_result" >&5
|
|
||||||
$as_echo "$mcctrl_result" >&6; }
|
|
||||||
|
|
||||||
cat >>confdefs.h <<_ACEOF
|
|
||||||
#define MCCTRL_KSYM_zap_page_range $mcctrl_addr
|
|
||||||
_ACEOF
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking System.map for symbol vdso_image_64" >&5
|
|
||||||
$as_echo_n "checking System.map for symbol vdso_image_64... " >&6; }
|
|
||||||
mcctrl_addr=`eval $MCCTRL_LINUX_SYMTAB_CMD | grep " vdso_image_64\$" | cut -d\ -f1`
|
|
||||||
if test -z $mcctrl_addr; then
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
|
|
||||||
$as_echo "not found" >&6; }
|
|
||||||
else
|
|
||||||
mcctrl_result=$mcctrl_addr
|
|
||||||
mcctrl_addr="0x$mcctrl_addr"
|
|
||||||
|
|
||||||
if `eval $MCCTRL_LINUX_SYMTAB_CMD | grep " __ksymtab_vdso_image_64\$" >/dev/null`; then
|
|
||||||
mcctrl_result="exported"
|
|
||||||
mcctrl_addr="0"
|
|
||||||
fi
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mcctrl_result" >&5
|
|
||||||
$as_echo "$mcctrl_result" >&6; }
|
|
||||||
|
|
||||||
cat >>confdefs.h <<_ACEOF
|
|
||||||
#define MCCTRL_KSYM_vdso_image_64 $mcctrl_addr
|
|
||||||
_ACEOF
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking System.map for symbol vdso_start" >&5
|
|
||||||
$as_echo_n "checking System.map for symbol vdso_start... " >&6; }
|
|
||||||
mcctrl_addr=`eval $MCCTRL_LINUX_SYMTAB_CMD | grep " vdso_start\$" | cut -d\ -f1`
|
|
||||||
if test -z $mcctrl_addr; then
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
|
|
||||||
$as_echo "not found" >&6; }
|
|
||||||
else
|
|
||||||
mcctrl_result=$mcctrl_addr
|
|
||||||
mcctrl_addr="0x$mcctrl_addr"
|
|
||||||
|
|
||||||
if `eval $MCCTRL_LINUX_SYMTAB_CMD | grep " __ksymtab_vdso_start\$" >/dev/null`; then
|
|
||||||
mcctrl_result="exported"
|
|
||||||
mcctrl_addr="0"
|
|
||||||
fi
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mcctrl_result" >&5
|
|
||||||
$as_echo "$mcctrl_result" >&6; }
|
|
||||||
|
|
||||||
cat >>confdefs.h <<_ACEOF
|
|
||||||
#define MCCTRL_KSYM_vdso_start $mcctrl_addr
|
|
||||||
_ACEOF
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking System.map for symbol vdso_end" >&5
|
|
||||||
$as_echo_n "checking System.map for symbol vdso_end... " >&6; }
|
|
||||||
mcctrl_addr=`eval $MCCTRL_LINUX_SYMTAB_CMD | grep " vdso_end\$" | cut -d\ -f1`
|
|
||||||
if test -z $mcctrl_addr; then
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
|
|
||||||
$as_echo "not found" >&6; }
|
|
||||||
else
|
|
||||||
mcctrl_result=$mcctrl_addr
|
|
||||||
mcctrl_addr="0x$mcctrl_addr"
|
|
||||||
|
|
||||||
if `eval $MCCTRL_LINUX_SYMTAB_CMD | grep " __ksymtab_vdso_end\$" >/dev/null`; then
|
|
||||||
mcctrl_result="exported"
|
|
||||||
mcctrl_addr="0"
|
|
||||||
fi
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mcctrl_result" >&5
|
|
||||||
$as_echo "$mcctrl_result" >&6; }
|
|
||||||
|
|
||||||
cat >>confdefs.h <<_ACEOF
|
|
||||||
#define MCCTRL_KSYM_vdso_end $mcctrl_addr
|
|
||||||
_ACEOF
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking System.map for symbol vdso_pages" >&5
|
|
||||||
$as_echo_n "checking System.map for symbol vdso_pages... " >&6; }
|
|
||||||
mcctrl_addr=`eval $MCCTRL_LINUX_SYMTAB_CMD | grep " vdso_pages\$" | cut -d\ -f1`
|
|
||||||
if test -z $mcctrl_addr; then
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
|
|
||||||
$as_echo "not found" >&6; }
|
|
||||||
else
|
|
||||||
mcctrl_result=$mcctrl_addr
|
|
||||||
mcctrl_addr="0x$mcctrl_addr"
|
|
||||||
|
|
||||||
if `eval $MCCTRL_LINUX_SYMTAB_CMD | grep " __ksymtab_vdso_pages\$" >/dev/null`; then
|
|
||||||
mcctrl_result="exported"
|
|
||||||
mcctrl_addr="0"
|
|
||||||
fi
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mcctrl_result" >&5
|
|
||||||
$as_echo "$mcctrl_result" >&6; }
|
|
||||||
|
|
||||||
cat >>confdefs.h <<_ACEOF
|
|
||||||
#define MCCTRL_KSYM_vdso_pages $mcctrl_addr
|
|
||||||
_ACEOF
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking System.map for symbol __vvar_page" >&5
|
|
||||||
$as_echo_n "checking System.map for symbol __vvar_page... " >&6; }
|
|
||||||
mcctrl_addr=`eval $MCCTRL_LINUX_SYMTAB_CMD | grep " __vvar_page\$" | cut -d\ -f1`
|
|
||||||
if test -z $mcctrl_addr; then
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
|
|
||||||
$as_echo "not found" >&6; }
|
|
||||||
else
|
|
||||||
mcctrl_result=$mcctrl_addr
|
|
||||||
mcctrl_addr="0x$mcctrl_addr"
|
|
||||||
|
|
||||||
if `eval $MCCTRL_LINUX_SYMTAB_CMD | grep " __ksymtab___vvar_page\$" >/dev/null`; then
|
|
||||||
mcctrl_result="exported"
|
|
||||||
mcctrl_addr="0"
|
|
||||||
fi
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mcctrl_result" >&5
|
|
||||||
$as_echo "$mcctrl_result" >&6; }
|
|
||||||
|
|
||||||
cat >>confdefs.h <<_ACEOF
|
|
||||||
#define MCCTRL_KSYM___vvar_page $mcctrl_addr
|
|
||||||
_ACEOF
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking System.map for symbol hpet_address" >&5
|
|
||||||
$as_echo_n "checking System.map for symbol hpet_address... " >&6; }
|
|
||||||
mcctrl_addr=`eval $MCCTRL_LINUX_SYMTAB_CMD | grep " hpet_address\$" | cut -d\ -f1`
|
|
||||||
if test -z $mcctrl_addr; then
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
|
|
||||||
$as_echo "not found" >&6; }
|
|
||||||
else
|
|
||||||
mcctrl_result=$mcctrl_addr
|
|
||||||
mcctrl_addr="0x$mcctrl_addr"
|
|
||||||
|
|
||||||
if `eval $MCCTRL_LINUX_SYMTAB_CMD | grep " __ksymtab_hpet_address\$" >/dev/null`; then
|
|
||||||
mcctrl_result="exported"
|
|
||||||
mcctrl_addr="0"
|
|
||||||
fi
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mcctrl_result" >&5
|
|
||||||
$as_echo "$mcctrl_result" >&6; }
|
|
||||||
|
|
||||||
cat >>confdefs.h <<_ACEOF
|
|
||||||
#define MCCTRL_KSYM_hpet_address $mcctrl_addr
|
|
||||||
_ACEOF
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
# POSTK_DEBUG_ARCH_DEP_50, add:find kernel symbol.
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking System.map for symbol vdso_spec" >&5
|
|
||||||
$as_echo_n "checking System.map for symbol vdso_spec... " >&6; }
|
|
||||||
mcctrl_addr=`eval $MCCTRL_LINUX_SYMTAB_CMD | grep " vdso_spec\$" | cut -d\ -f1`
|
|
||||||
if test -z $mcctrl_addr; then
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
|
|
||||||
$as_echo "not found" >&6; }
|
|
||||||
else
|
|
||||||
mcctrl_result=$mcctrl_addr
|
|
||||||
mcctrl_addr="0x$mcctrl_addr"
|
|
||||||
|
|
||||||
if `eval $MCCTRL_LINUX_SYMTAB_CMD | grep " __ksymtab_vdso_spec\$" >/dev/null`; then
|
|
||||||
mcctrl_result="exported"
|
|
||||||
mcctrl_addr="0"
|
|
||||||
fi
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mcctrl_result" >&5
|
|
||||||
$as_echo "$mcctrl_result" >&6; }
|
|
||||||
|
|
||||||
cat >>confdefs.h <<_ACEOF
|
|
||||||
#define MCCTRL_KSYM_vdso_spec $mcctrl_addr
|
|
||||||
_ACEOF
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking System.map for symbol hv_clock" >&5
|
|
||||||
$as_echo_n "checking System.map for symbol hv_clock... " >&6; }
|
|
||||||
mcctrl_addr=`eval $MCCTRL_LINUX_SYMTAB_CMD | grep " hv_clock\$" | cut -d\ -f1`
|
|
||||||
if test -z $mcctrl_addr; then
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
|
|
||||||
$as_echo "not found" >&6; }
|
|
||||||
else
|
|
||||||
mcctrl_result=$mcctrl_addr
|
|
||||||
mcctrl_addr="0x$mcctrl_addr"
|
|
||||||
|
|
||||||
if `eval $MCCTRL_LINUX_SYMTAB_CMD | grep " __ksymtab_hv_clock\$" >/dev/null`; then
|
|
||||||
mcctrl_result="exported"
|
|
||||||
mcctrl_addr="0"
|
|
||||||
fi
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mcctrl_result" >&5
|
|
||||||
$as_echo "$mcctrl_result" >&6; }
|
|
||||||
|
|
||||||
cat >>confdefs.h <<_ACEOF
|
|
||||||
#define MCCTRL_KSYM_hv_clock $mcctrl_addr
|
|
||||||
_ACEOF
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking System.map for symbol sys_readlink" >&5
|
|
||||||
$as_echo_n "checking System.map for symbol sys_readlink... " >&6; }
|
|
||||||
mcctrl_addr=`eval $MCCTRL_LINUX_SYMTAB_CMD | grep " sys_readlink\$" | cut -d\ -f1`
|
|
||||||
if test -z $mcctrl_addr; then
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
|
|
||||||
$as_echo "not found" >&6; }
|
|
||||||
else
|
|
||||||
mcctrl_result=$mcctrl_addr
|
|
||||||
mcctrl_addr="0x$mcctrl_addr"
|
|
||||||
|
|
||||||
if `eval $MCCTRL_LINUX_SYMTAB_CMD | grep " __ksymtab_sys_readlink\$" >/dev/null`; then
|
|
||||||
mcctrl_result="exported"
|
|
||||||
mcctrl_addr="0"
|
|
||||||
fi
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mcctrl_result" >&5
|
|
||||||
$as_echo "$mcctrl_result" >&6; }
|
|
||||||
|
|
||||||
cat >>confdefs.h <<_ACEOF
|
|
||||||
#define MCCTRL_KSYM_sys_readlink $mcctrl_addr
|
|
||||||
_ACEOF
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking System.map for symbol walk_page_range" >&5
|
|
||||||
$as_echo_n "checking System.map for symbol walk_page_range... " >&6; }
|
|
||||||
mcctrl_addr=`eval $MCCTRL_LINUX_SYMTAB_CMD | grep " walk_page_range\$" | cut -d\ -f1`
|
|
||||||
if test -z $mcctrl_addr; then
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
|
|
||||||
$as_echo "not found" >&6; }
|
|
||||||
else
|
|
||||||
mcctrl_result=$mcctrl_addr
|
|
||||||
mcctrl_addr="0x$mcctrl_addr"
|
|
||||||
|
|
||||||
if `eval $MCCTRL_LINUX_SYMTAB_CMD | grep " __ksymtab_walk_page_range\$" >/dev/null`; then
|
|
||||||
mcctrl_result="exported"
|
|
||||||
mcctrl_addr="0"
|
|
||||||
fi
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mcctrl_result" >&5
|
|
||||||
$as_echo "$mcctrl_result" >&6; }
|
|
||||||
|
|
||||||
cat >>confdefs.h <<_ACEOF
|
|
||||||
#define MCCTRL_KSYM_walk_page_range $mcctrl_addr
|
|
||||||
_ACEOF
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
case $ENABLE_MEMDUMP in
|
case $ENABLE_MEMDUMP in
|
||||||
yes|no|auto)
|
yes|no|auto)
|
||||||
;;
|
;;
|
||||||
@@ -4961,6 +4788,28 @@ else
|
|||||||
$as_echo "$as_me: rusage is disabled" >&6;}
|
$as_echo "$as_me: rusage is disabled" >&6;}
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if test "x$ENABLE_PERF" = "xyes" ; then
|
||||||
|
|
||||||
|
$as_echo "#define ENABLE_PERF 1" >>confdefs.h
|
||||||
|
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: perf is enabled" >&5
|
||||||
|
$as_echo "$as_me: perf is enabled" >&6;}
|
||||||
|
else
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: perf is disabled" >&5
|
||||||
|
$as_echo "$as_me: perf is disabled" >&6;}
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "x$WITH_SYSCALL_INTERCEPT" = "xyes" ; then
|
||||||
|
|
||||||
|
$as_echo "#define WITH_SYSCALL_INTERCEPT 1" >>confdefs.h
|
||||||
|
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: syscall_intercept library is linked" >&5
|
||||||
|
$as_echo "$as_me: syscall_intercept library is linked" >&6;}
|
||||||
|
else
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: syscall_intercept library isn't linked" >&5
|
||||||
|
$as_echo "$as_me: syscall_intercept library isn't linked" >&6;}
|
||||||
|
fi
|
||||||
|
|
||||||
if test "x$MCKERNEL_INCDIR" != "x" ; then
|
if test "x$MCKERNEL_INCDIR" != "x" ; then
|
||||||
|
|
||||||
cat >>confdefs.h <<_ACEOF
|
cat >>confdefs.h <<_ACEOF
|
||||||
@@ -4988,6 +4837,23 @@ cat >>confdefs.h <<_ACEOF
|
|||||||
_ACEOF
|
_ACEOF
|
||||||
|
|
||||||
|
|
||||||
|
ABS_SRCDIR=$( cd $( dirname $0 ); pwd )
|
||||||
|
IHK_ABS_SRCDIR=${ABS_SRCDIR}/../ihk
|
||||||
|
BUILDID=$( cd $IHK_ABS_SRCDIR; if [ ! -d .git ]; then echo $IHK_VERSION; else bash -c 'git rev-list -1 HEAD | cut -c1-8'; fi )
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: BUILDID=$BUILDID" >&5
|
||||||
|
$as_echo "$as_me: BUILDID=$BUILDID" >&6;}
|
||||||
|
if test "x$BUILDID" != "x" ; then
|
||||||
|
|
||||||
|
cat >>confdefs.h <<_ACEOF
|
||||||
|
#define BUILDID "$BUILDID"
|
||||||
|
_ACEOF
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -5021,9 +4887,19 @@ ac_config_headers="$ac_config_headers config.h"
|
|||||||
|
|
||||||
# POSTK_DEBUG_ARCH_DEP_37
|
# POSTK_DEBUG_ARCH_DEP_37
|
||||||
# AC_CONFIG_FILES arch dependfiles separate
|
# AC_CONFIG_FILES arch dependfiles separate
|
||||||
ac_config_files="$ac_config_files Makefile executer/user/Makefile executer/user/mcexec.1:executer/user/mcexec.1in executer/user/vmcore2mckdump executer/user/arch/$ARCH/Makefile executer/user/arch/x86_64/Makefile executer/kernel/mcctrl/Makefile executer/kernel/mcctrl/arch/$ARCH/Makefile executer/kernel/mcoverlayfs/Makefile executer/kernel/mcoverlayfs/linux-3.10.0-327.36.1.el7/Makefile executer/kernel/mcoverlayfs/linux-4.0.9/Makefile executer/kernel/mcoverlayfs/linux-4.6.7/Makefile executer/include/qlmpilib.h kernel/Makefile kernel/Makefile.build kernel/include/swapfmt.h arch/x86/tools/mcreboot-attached-mic.sh arch/x86/tools/mcshutdown-attached-mic.sh arch/x86/tools/mcreboot-builtin-x86.sh arch/x86/tools/mcreboot-smp-x86.sh arch/x86/tools/mcstop+release-smp-x86.sh arch/x86/tools/mcoverlay-destroy-smp-x86.sh arch/x86/tools/mcoverlay-create-smp-x86.sh arch/x86/tools/eclair-dump-backtrace.exp arch/x86/tools/mcshutdown-builtin-x86.sh arch/x86/tools/mcreboot.1:arch/x86/tools/mcreboot.1in arch/x86/tools/irqbalance_mck.service arch/x86/tools/irqbalance_mck.in"
|
ac_config_files="$ac_config_files Makefile executer/user/Makefile executer/user/mcexec.1:executer/user/mcexec.1in executer/user/vmcore2mckdump executer/user/arch/$ARCH/Makefile executer/user/arch/x86_64/Makefile executer/kernel/mcctrl/Makefile executer/kernel/mcctrl/arch/$ARCH/Makefile executer/kernel/mcoverlayfs/Makefile executer/kernel/mcoverlayfs/linux-3.10.0-327.36.1.el7/Makefile executer/kernel/mcoverlayfs/linux-4.0.9/Makefile executer/kernel/mcoverlayfs/linux-4.6.7/Makefile executer/include/qlmpilib.h kernel/Makefile kernel/Makefile.build kernel/include/swapfmt.h arch/x86_64/tools/mcreboot-attached-mic.sh arch/x86_64/tools/mcshutdown-attached-mic.sh arch/x86_64/tools/mcreboot-builtin-x86.sh arch/x86_64/tools/mcreboot-smp-x86.sh arch/x86_64/tools/mcstop+release-smp-x86.sh arch/x86_64/tools/mcoverlay-destroy-smp-x86.sh arch/x86_64/tools/mcoverlay-create-smp-x86.sh arch/x86_64/tools/eclair-dump-backtrace.exp arch/x86_64/tools/mcshutdown-builtin-x86.sh arch/x86_64/tools/mcreboot.1:arch/x86_64/tools/mcreboot.1in arch/x86_64/tools/irqbalance_mck.service arch/x86_64/tools/irqbalance_mck.in tools/mcstat/mcstat.1:tools/mcstat/mcstat.1in tools/mcstat/Makefile"
|
||||||
|
|
||||||
|
|
||||||
|
if test -e "${ABS_SRCDIR}/test"; then
|
||||||
|
ac_config_files="$ac_config_files mck_test_config.sample:test/mck_test_config.sample.in"
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "$TARGET" = "smp-x86"; then
|
||||||
|
ac_config_files="$ac_config_files arch/x86_64/kernel/Makefile.arch"
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
if test "$TARGET" = "smp-arm64"; then
|
if test "$TARGET" = "smp-arm64"; then
|
||||||
ac_config_files="$ac_config_files kernel/config/config.smp-arm64 arch/arm64/kernel/vdso/Makefile arch/arm64/kernel/Makefile.arch"
|
ac_config_files="$ac_config_files kernel/config/config.smp-arm64 arch/arm64/kernel/vdso/Makefile arch/arm64/kernel/Makefile.arch"
|
||||||
|
|
||||||
@@ -5541,7 +5417,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
|
|||||||
# report actual input values of CONFIG_FILES etc. instead of their
|
# report actual input values of CONFIG_FILES etc. instead of their
|
||||||
# values after options handling.
|
# values after options handling.
|
||||||
ac_log="
|
ac_log="
|
||||||
This file was extended by mckernel $as_me 0.9.0, which was
|
This file was extended by mckernel $as_me 1.6.0, which was
|
||||||
generated by GNU Autoconf 2.69. Invocation command line was
|
generated by GNU Autoconf 2.69. Invocation command line was
|
||||||
|
|
||||||
CONFIG_FILES = $CONFIG_FILES
|
CONFIG_FILES = $CONFIG_FILES
|
||||||
@@ -5603,7 +5479,7 @@ _ACEOF
|
|||||||
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
|
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
|
||||||
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
|
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
|
||||||
ac_cs_version="\\
|
ac_cs_version="\\
|
||||||
mckernel config.status 0.9.0
|
mckernel config.status 1.6.0
|
||||||
configured by $0, generated by GNU Autoconf 2.69,
|
configured by $0, generated by GNU Autoconf 2.69,
|
||||||
with options \\"\$ac_cs_config\\"
|
with options \\"\$ac_cs_config\\"
|
||||||
|
|
||||||
@@ -5741,18 +5617,22 @@ do
|
|||||||
"kernel/Makefile") CONFIG_FILES="$CONFIG_FILES kernel/Makefile" ;;
|
"kernel/Makefile") CONFIG_FILES="$CONFIG_FILES kernel/Makefile" ;;
|
||||||
"kernel/Makefile.build") CONFIG_FILES="$CONFIG_FILES kernel/Makefile.build" ;;
|
"kernel/Makefile.build") CONFIG_FILES="$CONFIG_FILES kernel/Makefile.build" ;;
|
||||||
"kernel/include/swapfmt.h") CONFIG_FILES="$CONFIG_FILES kernel/include/swapfmt.h" ;;
|
"kernel/include/swapfmt.h") CONFIG_FILES="$CONFIG_FILES kernel/include/swapfmt.h" ;;
|
||||||
"arch/x86/tools/mcreboot-attached-mic.sh") CONFIG_FILES="$CONFIG_FILES arch/x86/tools/mcreboot-attached-mic.sh" ;;
|
"arch/x86_64/tools/mcreboot-attached-mic.sh") CONFIG_FILES="$CONFIG_FILES arch/x86_64/tools/mcreboot-attached-mic.sh" ;;
|
||||||
"arch/x86/tools/mcshutdown-attached-mic.sh") CONFIG_FILES="$CONFIG_FILES arch/x86/tools/mcshutdown-attached-mic.sh" ;;
|
"arch/x86_64/tools/mcshutdown-attached-mic.sh") CONFIG_FILES="$CONFIG_FILES arch/x86_64/tools/mcshutdown-attached-mic.sh" ;;
|
||||||
"arch/x86/tools/mcreboot-builtin-x86.sh") CONFIG_FILES="$CONFIG_FILES arch/x86/tools/mcreboot-builtin-x86.sh" ;;
|
"arch/x86_64/tools/mcreboot-builtin-x86.sh") CONFIG_FILES="$CONFIG_FILES arch/x86_64/tools/mcreboot-builtin-x86.sh" ;;
|
||||||
"arch/x86/tools/mcreboot-smp-x86.sh") CONFIG_FILES="$CONFIG_FILES arch/x86/tools/mcreboot-smp-x86.sh" ;;
|
"arch/x86_64/tools/mcreboot-smp-x86.sh") CONFIG_FILES="$CONFIG_FILES arch/x86_64/tools/mcreboot-smp-x86.sh" ;;
|
||||||
"arch/x86/tools/mcstop+release-smp-x86.sh") CONFIG_FILES="$CONFIG_FILES arch/x86/tools/mcstop+release-smp-x86.sh" ;;
|
"arch/x86_64/tools/mcstop+release-smp-x86.sh") CONFIG_FILES="$CONFIG_FILES arch/x86_64/tools/mcstop+release-smp-x86.sh" ;;
|
||||||
"arch/x86/tools/mcoverlay-destroy-smp-x86.sh") CONFIG_FILES="$CONFIG_FILES arch/x86/tools/mcoverlay-destroy-smp-x86.sh" ;;
|
"arch/x86_64/tools/mcoverlay-destroy-smp-x86.sh") CONFIG_FILES="$CONFIG_FILES arch/x86_64/tools/mcoverlay-destroy-smp-x86.sh" ;;
|
||||||
"arch/x86/tools/mcoverlay-create-smp-x86.sh") CONFIG_FILES="$CONFIG_FILES arch/x86/tools/mcoverlay-create-smp-x86.sh" ;;
|
"arch/x86_64/tools/mcoverlay-create-smp-x86.sh") CONFIG_FILES="$CONFIG_FILES arch/x86_64/tools/mcoverlay-create-smp-x86.sh" ;;
|
||||||
"arch/x86/tools/eclair-dump-backtrace.exp") CONFIG_FILES="$CONFIG_FILES arch/x86/tools/eclair-dump-backtrace.exp" ;;
|
"arch/x86_64/tools/eclair-dump-backtrace.exp") CONFIG_FILES="$CONFIG_FILES arch/x86_64/tools/eclair-dump-backtrace.exp" ;;
|
||||||
"arch/x86/tools/mcshutdown-builtin-x86.sh") CONFIG_FILES="$CONFIG_FILES arch/x86/tools/mcshutdown-builtin-x86.sh" ;;
|
"arch/x86_64/tools/mcshutdown-builtin-x86.sh") CONFIG_FILES="$CONFIG_FILES arch/x86_64/tools/mcshutdown-builtin-x86.sh" ;;
|
||||||
"arch/x86/tools/mcreboot.1") CONFIG_FILES="$CONFIG_FILES arch/x86/tools/mcreboot.1:arch/x86/tools/mcreboot.1in" ;;
|
"arch/x86_64/tools/mcreboot.1") CONFIG_FILES="$CONFIG_FILES arch/x86_64/tools/mcreboot.1:arch/x86_64/tools/mcreboot.1in" ;;
|
||||||
"arch/x86/tools/irqbalance_mck.service") CONFIG_FILES="$CONFIG_FILES arch/x86/tools/irqbalance_mck.service" ;;
|
"arch/x86_64/tools/irqbalance_mck.service") CONFIG_FILES="$CONFIG_FILES arch/x86_64/tools/irqbalance_mck.service" ;;
|
||||||
"arch/x86/tools/irqbalance_mck.in") CONFIG_FILES="$CONFIG_FILES arch/x86/tools/irqbalance_mck.in" ;;
|
"arch/x86_64/tools/irqbalance_mck.in") CONFIG_FILES="$CONFIG_FILES arch/x86_64/tools/irqbalance_mck.in" ;;
|
||||||
|
"tools/mcstat/mcstat.1") CONFIG_FILES="$CONFIG_FILES tools/mcstat/mcstat.1:tools/mcstat/mcstat.1in" ;;
|
||||||
|
"tools/mcstat/Makefile") CONFIG_FILES="$CONFIG_FILES tools/mcstat/Makefile" ;;
|
||||||
|
"mck_test_config.sample") CONFIG_FILES="$CONFIG_FILES mck_test_config.sample:test/mck_test_config.sample.in" ;;
|
||||||
|
"arch/x86_64/kernel/Makefile.arch") CONFIG_FILES="$CONFIG_FILES arch/x86_64/kernel/Makefile.arch" ;;
|
||||||
"kernel/config/config.smp-arm64") CONFIG_FILES="$CONFIG_FILES kernel/config/config.smp-arm64" ;;
|
"kernel/config/config.smp-arm64") CONFIG_FILES="$CONFIG_FILES kernel/config/config.smp-arm64" ;;
|
||||||
"arch/arm64/kernel/vdso/Makefile") CONFIG_FILES="$CONFIG_FILES arch/arm64/kernel/vdso/Makefile" ;;
|
"arch/arm64/kernel/vdso/Makefile") CONFIG_FILES="$CONFIG_FILES arch/arm64/kernel/vdso/Makefile" ;;
|
||||||
"arch/arm64/kernel/Makefile.arch") CONFIG_FILES="$CONFIG_FILES arch/arm64/kernel/Makefile.arch" ;;
|
"arch/arm64/kernel/Makefile.arch") CONFIG_FILES="$CONFIG_FILES arch/arm64/kernel/Makefile.arch" ;;
|
||||||
|
|||||||
236
configure.ac
236
configure.ac
@@ -1,11 +1,9 @@
|
|||||||
# configure.ac COPYRIGHT FUJITSU LIMITED 2015-2016
|
# configure.ac COPYRIGHT FUJITSU LIMITED 2015-2016
|
||||||
AC_PREREQ(2.63)
|
AC_PREREQ(2.63)
|
||||||
m4_define([IHK_VERSION_m4],[0.9.0])dnl
|
m4_define([IHK_VERSION_m4],[1.6.0])dnl
|
||||||
m4_define([MCKERNEL_VERSION_m4],[0.9.0])dnl
|
m4_define([MCKERNEL_VERSION_m4],[1.6.0])dnl
|
||||||
m4_define([DCFA_VERSION_m4],[0.9.0])dnl
|
m4_define([IHK_RELEASE_DATE_m4],[2018-11-11])dnl
|
||||||
m4_define([IHK_RELEASE_DATE_m4],[2013-11-18])dnl
|
m4_define([MCKERNEL_RELEASE_DATE_m4],[2018-11-11])dnl
|
||||||
m4_define([MCKERNEL_RELEASE_DATE_m4],[2013-11-18])dnl
|
|
||||||
m4_define([DCFA_RELEASE_DATE_m4],[2013-11-18])dnl
|
|
||||||
|
|
||||||
AC_INIT([mckernel], MCKERNEL_VERSION_m4)
|
AC_INIT([mckernel], MCKERNEL_VERSION_m4)
|
||||||
|
|
||||||
@@ -79,6 +77,58 @@ AC_DEFUN([PAC_SET_HEADER_LIB_PATH],[
|
|||||||
])
|
])
|
||||||
])
|
])
|
||||||
|
|
||||||
|
AC_DEFUN([PAC_SET_HEADER_LIB_PATH_SYSCALL_INTERCEPT],[
|
||||||
|
AC_ARG_WITH([$1],
|
||||||
|
[AC_HELP_STRING([--with-$1=PATH],
|
||||||
|
[specify path where $1 include directory and lib directory can be found])],
|
||||||
|
|
||||||
|
[AS_CASE(["$withval"],
|
||||||
|
[yes|no|''],
|
||||||
|
[AC_MSG_WARN([--with[out]-$1=PATH expects a valid PATH])
|
||||||
|
with_$1=""])],
|
||||||
|
[with_$1=$2])
|
||||||
|
AC_ARG_WITH([$1-include],
|
||||||
|
[AC_HELP_STRING([--with-$1-include=PATH],
|
||||||
|
[specify path where $1 include directory can be found])],
|
||||||
|
[AS_CASE(["$withval"],
|
||||||
|
[yes|no|''],
|
||||||
|
[AC_MSG_WARN([--with[out]-$1-include=PATH expects a valid PATH])
|
||||||
|
with_$1_include=""])],
|
||||||
|
[])
|
||||||
|
AC_ARG_WITH([$1-lib],
|
||||||
|
[AC_HELP_STRING([--with-$1-lib=PATH],
|
||||||
|
[specify path where $1 lib directory can be found])],
|
||||||
|
[AS_CASE(["$withval"],
|
||||||
|
[yes|no|''],
|
||||||
|
[AC_MSG_WARN([--with[out]-$1-lib=PATH expects a valid PATH])
|
||||||
|
with_$1_lib=""])],
|
||||||
|
[])
|
||||||
|
|
||||||
|
# The args have been sanitized into empty/non-empty values above.
|
||||||
|
# Now append -I/-L args to CPPFLAGS/LDFLAGS, with more specific options
|
||||||
|
# taking priority
|
||||||
|
|
||||||
|
AS_IF([test -n "${with_$1_include}"],
|
||||||
|
[PAC_APPEND_FLAG([-I${with_$1_include}],[CPPFLAGS_SYSCALL_INTERCEPT])],
|
||||||
|
[AS_IF([test -n "${with_$1}"],
|
||||||
|
[PAC_APPEND_FLAG([-I${with_$1}/include],[CPPFLAGS_SYSCALL_INTERCEPT])])])
|
||||||
|
|
||||||
|
AS_IF([test -n "${with_$1_lib}"],
|
||||||
|
[PAC_APPEND_FLAG([-L${with_$1_lib} -Wl,-rpath,${with_$1_lib}],[LDFLAGS_SYSCALL_INTERCEPT])],
|
||||||
|
[AS_IF([test -n "${with_$1}"],
|
||||||
|
dnl is adding lib64 by default really the right thing to do? What if
|
||||||
|
dnl we are on a 32-bit host that happens to have both lib dirs available?
|
||||||
|
[PAC_APPEND_FLAG([-L${with_$1}/lib -Wl,-rpath,${with_$1}/lib],[LDFLAGS_SYSCALL_INTERCEPT])
|
||||||
|
AS_IF([test -d "${with_$1}/lib64"],
|
||||||
|
[PAC_APPEND_FLAG([-L${with_$1}/lib64 -Wl,-rpath,${with_$1}/lib64],[LDFLAGS_SYSCALL_INTERCEPT])])
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
|
AS_IF([test -n "${with_$1}" || test -n "${with_$1_include}" || test -n "${with_$1_lib}"],
|
||||||
|
[WITH_SYSCALL_INTERCEPT=yes],
|
||||||
|
[WITH_SYSCALL_INTERCEPT=no])
|
||||||
|
])
|
||||||
|
|
||||||
IHK_VERSION=IHK_VERSION_m4
|
IHK_VERSION=IHK_VERSION_m4
|
||||||
MCKERNEL_VERSION=MCKERNEL_VERSION_m4
|
MCKERNEL_VERSION=MCKERNEL_VERSION_m4
|
||||||
DCFA_VERSION=DCFA_VERSION_m4
|
DCFA_VERSION=DCFA_VERSION_m4
|
||||||
@@ -97,6 +147,23 @@ AS_IF([test "x$numa_lib_found" != "xyes"],
|
|||||||
|
|
||||||
PAC_SET_HEADER_LIB_PATH([mpi])
|
PAC_SET_HEADER_LIB_PATH([mpi])
|
||||||
|
|
||||||
|
PAC_SET_HEADER_LIB_PATH_SYSCALL_INTERCEPT([syscall_intercept])
|
||||||
|
|
||||||
|
if test "x$WITH_SYSCALL_INTERCEPT" == "xno" ; then
|
||||||
|
AC_CHECK_LIB([syscall_intercept],[syscall_no_intercept],[syscall_intercept_lib_found=yes],[syscall_intercept_lib_found=no],[-lcapstone -ldl])
|
||||||
|
AS_IF([test "x$syscall_intercept_lib_found" != "xyes"],
|
||||||
|
[AC_MSG_NOTICE([libsyscall_intercept.so not found])])
|
||||||
|
|
||||||
|
AC_CHECK_HEADER([libsyscall_intercept_hook_point.h],[syscall_intercept_header_found=yes],[syscall_intercept_header_found=no])
|
||||||
|
AS_IF([test "x$syscall_intercept_header_found" != "xyes"],
|
||||||
|
[AC_MSG_NOTICE([libsyscall_intercept_hook_point.h not found])])
|
||||||
|
|
||||||
|
AS_IF([test "x$syscall_intercept_lib_found" == "xyes" && test "x$syscall_intercept_header_found" == "xyes"],
|
||||||
|
[WITH_SYSCALL_INTERCEPT=yes],
|
||||||
|
[WITH_SYSCALL_INTERCEPT=no])
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
AC_ARG_WITH([kernelsrc],
|
AC_ARG_WITH([kernelsrc],
|
||||||
AC_HELP_STRING(
|
AC_HELP_STRING(
|
||||||
[--with-kernelsrc=path],[Path to 'kernel src', default is /lib/modules/uname_r/build]),
|
[--with-kernelsrc=path],[Path to 'kernel src', default is /lib/modules/uname_r/build]),
|
||||||
@@ -134,6 +201,12 @@ AC_ARG_ENABLE([rusage],
|
|||||||
[ENABLE_RUSAGE=$enableval],
|
[ENABLE_RUSAGE=$enableval],
|
||||||
[ENABLE_RUSAGE=yes])
|
[ENABLE_RUSAGE=yes])
|
||||||
|
|
||||||
|
AC_ARG_ENABLE([perf],
|
||||||
|
AC_HELP_STRING([--enable-perf],
|
||||||
|
[enable perf_event implementation]),
|
||||||
|
[ENABLE_PERF=$enableval],
|
||||||
|
[ENABLE_PERF=yes])
|
||||||
|
|
||||||
AC_ARG_ENABLE([qlmpi],
|
AC_ARG_ENABLE([qlmpi],
|
||||||
AC_HELP_STRING([--enable-qlmpi],
|
AC_HELP_STRING([--enable-qlmpi],
|
||||||
[enable qlmpi implementation]),
|
[enable qlmpi implementation]),
|
||||||
@@ -225,7 +298,7 @@ case $WITH_TARGET in
|
|||||||
KMODDIR="$prefix/kmod"
|
KMODDIR="$prefix/kmod"
|
||||||
fi
|
fi
|
||||||
if test "X$MANDIR" = X; then
|
if test "X$MANDIR" = X; then
|
||||||
MANDIR="$prefix/man"
|
MANDIR="$prefix/share/man"
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
builtin-mic)
|
builtin-mic)
|
||||||
@@ -242,7 +315,7 @@ case $WITH_TARGET in
|
|||||||
KMODDIR="$prefix/attached/kmod"
|
KMODDIR="$prefix/attached/kmod"
|
||||||
fi
|
fi
|
||||||
if test "X$MANDIR" = X; then
|
if test "X$MANDIR" = X; then
|
||||||
MANDIR="$prefix/attached/man"
|
MANDIR="$prefix/share/man"
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
builtin-x86)
|
builtin-x86)
|
||||||
@@ -259,7 +332,7 @@ case $WITH_TARGET in
|
|||||||
KMODDIR="$prefix/kmod"
|
KMODDIR="$prefix/kmod"
|
||||||
fi
|
fi
|
||||||
if test "X$MANDIR" = X; then
|
if test "X$MANDIR" = X; then
|
||||||
MANDIR="$prefix/attached/man"
|
MANDIR="$prefix/share/man"
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
smp-x86)
|
smp-x86)
|
||||||
@@ -291,7 +364,7 @@ case $WITH_TARGET in
|
|||||||
KMODDIR="$prefix/kmod"
|
KMODDIR="$prefix/kmod"
|
||||||
fi
|
fi
|
||||||
if test "X$MANDIR" = X; then
|
if test "X$MANDIR" = X; then
|
||||||
MANDIR="$prefix/smp-x86/man"
|
MANDIR="$prefix/share/man"
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
smp-arm64)
|
smp-arm64)
|
||||||
@@ -316,11 +389,14 @@ case $WITH_TARGET in
|
|||||||
if test "X$ETCDIR" = X; then
|
if test "X$ETCDIR" = X; then
|
||||||
ETCDIR="$prefix/etc"
|
ETCDIR="$prefix/etc"
|
||||||
fi
|
fi
|
||||||
|
if test "X$INCLUDEDIR" = X; then
|
||||||
|
INCLUDEDIR="$prefix/include"
|
||||||
|
fi
|
||||||
if test "X$KMODDIR" = X; then
|
if test "X$KMODDIR" = X; then
|
||||||
KMODDIR="$prefix/kmod"
|
KMODDIR="$prefix/kmod"
|
||||||
fi
|
fi
|
||||||
if test "X$MANDIR" = X; then
|
if test "X$MANDIR" = X; then
|
||||||
MANDIR="$prefix/smp-arm64/man"
|
MANDIR="$prefix/share/man"
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
@@ -332,78 +408,6 @@ KDIR="$WITH_KERNELSRC"
|
|||||||
UNAME_R="$WITH_UNAME_R"
|
UNAME_R="$WITH_UNAME_R"
|
||||||
TARGET="$WITH_TARGET"
|
TARGET="$WITH_TARGET"
|
||||||
|
|
||||||
MCCTRL_LINUX_SYMTAB=""
|
|
||||||
case "X$WITH_SYSTEM_MAP" in
|
|
||||||
Xyes | Xno | X)
|
|
||||||
MCCTRL_LINUX_SYMTAB=""
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
MCCTRL_LINUX_SYMTAB="$WITH_SYSTEM_MAP"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
AC_MSG_CHECKING([[for System.map]])
|
|
||||||
if test -r "$MCCTRL_LINUX_SYMTAB"; then
|
|
||||||
MCCTRL_LINUX_SYMTAB="$MCCTRL_LINUX_SYMTAB"
|
|
||||||
elif test -r "/boot/System.map-`uname -r`"; then
|
|
||||||
MCCTRL_LINUX_SYMTAB="/boot/System.map-`uname -r`"
|
|
||||||
elif test -r "$KDIR/System.map"; then
|
|
||||||
MCCTRL_LINUX_SYMTAB="$KDIR/System.map"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "$MCCTRL_LINUX_SYMTAB" == ""; then
|
|
||||||
AC_MSG_ERROR([could not find])
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test -z "`eval cat $MCCTRL_LINUX_SYMTAB`"; then
|
|
||||||
AC_MSG_ERROR([could not read System.map file, no read permission?])
|
|
||||||
fi
|
|
||||||
AC_MSG_RESULT([$MCCTRL_LINUX_SYMTAB])
|
|
||||||
|
|
||||||
MCCTRL_LINUX_SYMTAB_CMD="cat $MCCTRL_LINUX_SYMTAB"
|
|
||||||
|
|
||||||
# MCCTRL_FIND_KSYM(SYMBOL)
|
|
||||||
# ------------------------------------------------------
|
|
||||||
# Search System.map for address of the given symbol and
|
|
||||||
# do one of three things in config.h:
|
|
||||||
# If not found, leave MCCTRL_KSYM_foo undefined
|
|
||||||
# If found to be exported, "#define MCCTRL_KSYM_foo 0"
|
|
||||||
# If found not to be exported, "#define MCCTRL_KSYM_foo 0x<value>"
|
|
||||||
AC_DEFUN([MCCTRL_FIND_KSYM],[
|
|
||||||
AC_MSG_CHECKING([[System.map for symbol $1]])
|
|
||||||
mcctrl_addr=`eval $MCCTRL_LINUX_SYMTAB_CMD | grep " $1\$" | cut -d\ -f1`
|
|
||||||
if test -z $mcctrl_addr; then
|
|
||||||
AC_MSG_RESULT([not found])
|
|
||||||
else
|
|
||||||
mcctrl_result=$mcctrl_addr
|
|
||||||
mcctrl_addr="0x$mcctrl_addr"
|
|
||||||
m4_ifval([$2],[],[
|
|
||||||
if `eval $MCCTRL_LINUX_SYMTAB_CMD | grep " __ksymtab_$1\$" >/dev/null`; then
|
|
||||||
mcctrl_result="exported"
|
|
||||||
mcctrl_addr="0"
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
AC_MSG_RESULT([$mcctrl_result])
|
|
||||||
AC_DEFINE_UNQUOTED(MCCTRL_KSYM_[]$1,$mcctrl_addr,[Define to address of kernel symbol $1, or 0 if exported])
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
|
|
||||||
MCCTRL_FIND_KSYM([sys_mount])
|
|
||||||
MCCTRL_FIND_KSYM([sys_umount])
|
|
||||||
MCCTRL_FIND_KSYM([sys_unshare])
|
|
||||||
MCCTRL_FIND_KSYM([zap_page_range])
|
|
||||||
MCCTRL_FIND_KSYM([vdso_image_64])
|
|
||||||
MCCTRL_FIND_KSYM([vdso_start])
|
|
||||||
MCCTRL_FIND_KSYM([vdso_end])
|
|
||||||
MCCTRL_FIND_KSYM([vdso_pages])
|
|
||||||
MCCTRL_FIND_KSYM([__vvar_page])
|
|
||||||
MCCTRL_FIND_KSYM([hpet_address])
|
|
||||||
# POSTK_DEBUG_ARCH_DEP_50, add:find kernel symbol.
|
|
||||||
MCCTRL_FIND_KSYM([vdso_spec])
|
|
||||||
MCCTRL_FIND_KSYM([hv_clock])
|
|
||||||
MCCTRL_FIND_KSYM([sys_readlink])
|
|
||||||
MCCTRL_FIND_KSYM([walk_page_range])
|
|
||||||
|
|
||||||
case $ENABLE_MEMDUMP in
|
case $ENABLE_MEMDUMP in
|
||||||
yes|no|auto)
|
yes|no|auto)
|
||||||
;;
|
;;
|
||||||
@@ -451,7 +455,7 @@ else
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if test "x$ENABLE_QLMPI" = "xyes" ; then
|
if test "x$ENABLE_QLMPI" = "xyes" ; then
|
||||||
AC_DEFINE([ENABLE_QLMPI],[1],[whether mcoverlayfs is enabled])
|
AC_DEFINE([ENABLE_QLMPI],[1],[whether qlmpi is enabled])
|
||||||
AC_MSG_NOTICE([qlmpi is enabled])
|
AC_MSG_NOTICE([qlmpi is enabled])
|
||||||
else
|
else
|
||||||
AC_MSG_NOTICE([qlmpi is disabled])
|
AC_MSG_NOTICE([qlmpi is disabled])
|
||||||
@@ -475,6 +479,20 @@ else
|
|||||||
AC_MSG_NOTICE([rusage is disabled])
|
AC_MSG_NOTICE([rusage is disabled])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if test "x$ENABLE_PERF" = "xyes" ; then
|
||||||
|
AC_DEFINE([ENABLE_PERF],[1],[whether perf is enabled])
|
||||||
|
AC_MSG_NOTICE([perf is enabled])
|
||||||
|
else
|
||||||
|
AC_MSG_NOTICE([perf is disabled])
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "x$WITH_SYSCALL_INTERCEPT" = "xyes" ; then
|
||||||
|
AC_DEFINE([WITH_SYSCALL_INTERCEPT],[1],[whether or not syscall_intercept library is linked])
|
||||||
|
AC_MSG_NOTICE([syscall_intercept library is linked])
|
||||||
|
else
|
||||||
|
AC_MSG_NOTICE([syscall_intercept library isn't linked])
|
||||||
|
fi
|
||||||
|
|
||||||
if test "x$MCKERNEL_INCDIR" != "x" ; then
|
if test "x$MCKERNEL_INCDIR" != "x" ; then
|
||||||
AC_DEFINE_UNQUOTED(MCKERNEL_INCDIR,"$MCKERNEL_INCDIR",[McKernel specific headers])
|
AC_DEFINE_UNQUOTED(MCKERNEL_INCDIR,"$MCKERNEL_INCDIR",[McKernel specific headers])
|
||||||
fi
|
fi
|
||||||
@@ -486,6 +504,15 @@ fi
|
|||||||
AC_DEFINE_UNQUOTED(BINDIR,"$BINDIR",[Path of install directory for binary])
|
AC_DEFINE_UNQUOTED(BINDIR,"$BINDIR",[Path of install directory for binary])
|
||||||
AC_DEFINE_UNQUOTED(SBINDIR,"$SBINDIR",[Path of install directory for system binary])
|
AC_DEFINE_UNQUOTED(SBINDIR,"$SBINDIR",[Path of install directory for system binary])
|
||||||
|
|
||||||
|
ABS_SRCDIR=$( cd $( dirname $0 ); pwd )
|
||||||
|
IHK_ABS_SRCDIR=${ABS_SRCDIR}/../ihk
|
||||||
|
BUILDID=$( cd $IHK_ABS_SRCDIR; if @<:@ ! -d .git @:>@; then echo $IHK_VERSION; else bash -c 'git rev-list -1 HEAD | cut -c1-8'; fi )
|
||||||
|
AC_MSG_NOTICE([BUILDID=$BUILDID])
|
||||||
|
if test "x$BUILDID" != "x" ; then
|
||||||
|
AC_DEFINE_UNQUOTED(BUILDID,"$BUILDID",[IHK build-id to confirm IHK and McKernel built at the same time are used])
|
||||||
|
fi
|
||||||
|
AC_SUBST(BUILDID)
|
||||||
|
|
||||||
AC_SUBST(CC)
|
AC_SUBST(CC)
|
||||||
AC_SUBST(XCC)
|
AC_SUBST(XCC)
|
||||||
AC_SUBST(ARCH)
|
AC_SUBST(ARCH)
|
||||||
@@ -503,9 +530,12 @@ AC_SUBST(KMODDIR)
|
|||||||
AC_SUBST(KERNDIR)
|
AC_SUBST(KERNDIR)
|
||||||
AC_SUBST(MANDIR)
|
AC_SUBST(MANDIR)
|
||||||
AC_SUBST(CFLAGS)
|
AC_SUBST(CFLAGS)
|
||||||
|
AC_SUBST(CPPFLAGS_SYSCALL_INTERCEPT)
|
||||||
|
AC_SUBST(LDFLAGS_SYSCALL_INTERCEPT)
|
||||||
AC_SUBST(ENABLE_MCOVERLAYFS)
|
AC_SUBST(ENABLE_MCOVERLAYFS)
|
||||||
AC_SUBST(ENABLE_RUSAGE)
|
AC_SUBST(ENABLE_RUSAGE)
|
||||||
AC_SUBST(ENABLE_QLMPI)
|
AC_SUBST(ENABLE_QLMPI)
|
||||||
|
AC_SUBST(WITH_SYSCALL_INTERCEPT)
|
||||||
|
|
||||||
AC_SUBST(IHK_VERSION)
|
AC_SUBST(IHK_VERSION)
|
||||||
AC_SUBST(MCKERNEL_VERSION)
|
AC_SUBST(MCKERNEL_VERSION)
|
||||||
@@ -535,20 +565,34 @@ AC_CONFIG_FILES([
|
|||||||
kernel/Makefile
|
kernel/Makefile
|
||||||
kernel/Makefile.build
|
kernel/Makefile.build
|
||||||
kernel/include/swapfmt.h
|
kernel/include/swapfmt.h
|
||||||
arch/x86/tools/mcreboot-attached-mic.sh
|
arch/x86_64/tools/mcreboot-attached-mic.sh
|
||||||
arch/x86/tools/mcshutdown-attached-mic.sh
|
arch/x86_64/tools/mcshutdown-attached-mic.sh
|
||||||
arch/x86/tools/mcreboot-builtin-x86.sh
|
arch/x86_64/tools/mcreboot-builtin-x86.sh
|
||||||
arch/x86/tools/mcreboot-smp-x86.sh
|
arch/x86_64/tools/mcreboot-smp-x86.sh
|
||||||
arch/x86/tools/mcstop+release-smp-x86.sh
|
arch/x86_64/tools/mcstop+release-smp-x86.sh
|
||||||
arch/x86/tools/mcoverlay-destroy-smp-x86.sh
|
arch/x86_64/tools/mcoverlay-destroy-smp-x86.sh
|
||||||
arch/x86/tools/mcoverlay-create-smp-x86.sh
|
arch/x86_64/tools/mcoverlay-create-smp-x86.sh
|
||||||
arch/x86/tools/eclair-dump-backtrace.exp
|
arch/x86_64/tools/eclair-dump-backtrace.exp
|
||||||
arch/x86/tools/mcshutdown-builtin-x86.sh
|
arch/x86_64/tools/mcshutdown-builtin-x86.sh
|
||||||
arch/x86/tools/mcreboot.1:arch/x86/tools/mcreboot.1in
|
arch/x86_64/tools/mcreboot.1:arch/x86_64/tools/mcreboot.1in
|
||||||
arch/x86/tools/irqbalance_mck.service
|
arch/x86_64/tools/irqbalance_mck.service
|
||||||
arch/x86/tools/irqbalance_mck.in
|
arch/x86_64/tools/irqbalance_mck.in
|
||||||
|
tools/mcstat/mcstat.1:tools/mcstat/mcstat.1in
|
||||||
|
tools/mcstat/Makefile
|
||||||
])
|
])
|
||||||
|
|
||||||
|
if test -e "${ABS_SRCDIR}/test"; then
|
||||||
|
AC_CONFIG_FILES([
|
||||||
|
mck_test_config.sample:test/mck_test_config.sample.in
|
||||||
|
])
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "$TARGET" = "smp-x86"; then
|
||||||
|
AC_CONFIG_FILES([
|
||||||
|
arch/x86_64/kernel/Makefile.arch
|
||||||
|
])
|
||||||
|
fi
|
||||||
|
|
||||||
if test "$TARGET" = "smp-arm64"; then
|
if test "$TARGET" = "smp-arm64"; then
|
||||||
AC_CONFIG_FILES([
|
AC_CONFIG_FILES([
|
||||||
kernel/config/config.smp-arm64
|
kernel/config/config.smp-arm64
|
||||||
|
|||||||
@@ -5,6 +5,10 @@
|
|||||||
#define IHK_MAX_NUM_NUMA_NODES 1024
|
#define IHK_MAX_NUM_NUMA_NODES 1024
|
||||||
#define IHK_MAX_NUM_CPUS 1024
|
#define IHK_MAX_NUM_CPUS 1024
|
||||||
|
|
||||||
|
#define IHK_OS_PGSIZE_4KB 0
|
||||||
|
#define IHK_OS_PGSIZE_2MB 1
|
||||||
|
#define IHK_OS_PGSIZE_1GB 2
|
||||||
|
|
||||||
struct mckernel_rusage {
|
struct mckernel_rusage {
|
||||||
unsigned long memory_stat_rss[IHK_MAX_NUM_PGSIZES];
|
unsigned long memory_stat_rss[IHK_MAX_NUM_PGSIZES];
|
||||||
unsigned long memory_stat_mapped_file[IHK_MAX_NUM_PGSIZES];
|
unsigned long memory_stat_mapped_file[IHK_MAX_NUM_PGSIZES];
|
||||||
|
|||||||
@@ -55,13 +55,14 @@
|
|||||||
#define MCEXEC_UP_SYS_UMOUNT 0x30a02915
|
#define MCEXEC_UP_SYS_UMOUNT 0x30a02915
|
||||||
#define MCEXEC_UP_SYS_UNSHARE 0x30a02916
|
#define MCEXEC_UP_SYS_UNSHARE 0x30a02916
|
||||||
|
|
||||||
#define MCEXEC_UP_UTIL_THREAD1 0x30a02920
|
#define MCEXEC_UP_UTI_GET_CTX 0x30a02920
|
||||||
#define MCEXEC_UP_UTIL_THREAD2 0x30a02921
|
#define MCEXEC_UP_UTI_SAVE_FS 0x30a02921
|
||||||
#define MCEXEC_UP_SIG_THREAD 0x30a02922
|
#define MCEXEC_UP_SIG_THREAD 0x30a02922
|
||||||
#define MCEXEC_UP_SYSCALL_THREAD 0x30a02924
|
#define MCEXEC_UP_SYSCALL_THREAD 0x30a02924
|
||||||
#define MCEXEC_UP_TERMINATE_THREAD 0x30a02925
|
#define MCEXEC_UP_TERMINATE_THREAD 0x30a02925
|
||||||
#define MCEXEC_UP_GET_NUM_POOL_THREADS 0x30a02926
|
#define MCEXEC_UP_GET_NUM_POOL_THREADS 0x30a02926
|
||||||
#define MCEXEC_UP_UTI_ATTR 0x30a02927
|
#define MCEXEC_UP_UTI_ATTR 0x30a02927
|
||||||
|
#define MCEXEC_UP_RELEASE_USER_SPACE 0x30a02928
|
||||||
|
|
||||||
#define MCEXEC_UP_DEBUG_LOG 0x40000000
|
#define MCEXEC_UP_DEBUG_LOG 0x40000000
|
||||||
|
|
||||||
@@ -91,6 +92,7 @@ struct program_image_section {
|
|||||||
|
|
||||||
struct get_cpu_set_arg {
|
struct get_cpu_set_arg {
|
||||||
int nr_processes;
|
int nr_processes;
|
||||||
|
int *process_rank;
|
||||||
void *cpu_set;
|
void *cpu_set;
|
||||||
size_t cpu_set_size; // Size in bytes
|
size_t cpu_set_size; // Size in bytes
|
||||||
int *target_core;
|
int *target_core;
|
||||||
@@ -111,10 +113,8 @@ typedef unsigned long __cpu_set_unit;
|
|||||||
|
|
||||||
struct program_load_desc {
|
struct program_load_desc {
|
||||||
int num_sections;
|
int num_sections;
|
||||||
int status;
|
|
||||||
int cpu;
|
int cpu;
|
||||||
int pid;
|
int pid;
|
||||||
int err;
|
|
||||||
int stack_prot;
|
int stack_prot;
|
||||||
int pgid;
|
int pgid;
|
||||||
int cred[8];
|
int cred[8];
|
||||||
@@ -140,8 +140,12 @@ struct program_load_desc {
|
|||||||
unsigned long mpol_flags;
|
unsigned long mpol_flags;
|
||||||
unsigned long mpol_threshold;
|
unsigned long mpol_threshold;
|
||||||
unsigned long heap_extension;
|
unsigned long heap_extension;
|
||||||
|
long stack_premap;
|
||||||
|
unsigned long mpol_bind_mask;
|
||||||
|
int uti_thread_rank; /* N-th clone() spawns a thread on Linux CPU */
|
||||||
|
int uti_use_last_cpu; /* Work-around not to share CPU with OpenMP thread */
|
||||||
int nr_processes;
|
int nr_processes;
|
||||||
char shell_path[SHELL_PATH_MAX_LEN];
|
int process_rank;
|
||||||
__cpu_set_unit cpu_set[PLD_CPU_SET_SIZE];
|
__cpu_set_unit cpu_set[PLD_CPU_SET_SIZE];
|
||||||
int profile;
|
int profile;
|
||||||
struct program_image_section sections[0];
|
struct program_image_section sections[0];
|
||||||
@@ -242,6 +246,28 @@ struct sys_unshare_desc {
|
|||||||
unsigned long unshare_flags;
|
unsigned long unshare_flags;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct release_user_space_desc {
|
||||||
|
unsigned long user_start;
|
||||||
|
unsigned long user_end;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct terminate_thread_desc {
|
||||||
|
int pid;
|
||||||
|
int tid;
|
||||||
|
|
||||||
|
long code;
|
||||||
|
/* 32------32 31--16 15--------8 7----0
|
||||||
|
exit_group exit-status signal */
|
||||||
|
|
||||||
|
unsigned long tsk; /* struct task_struct * */
|
||||||
|
};
|
||||||
|
|
||||||
|
struct rpgtable_desc {
|
||||||
|
uintptr_t rpgtable;
|
||||||
|
uintptr_t start;
|
||||||
|
uintptr_t len;
|
||||||
|
};
|
||||||
|
|
||||||
enum perf_ctrl_type {
|
enum perf_ctrl_type {
|
||||||
PERF_CTRL_SET,
|
PERF_CTRL_SET,
|
||||||
PERF_CTRL_GET,
|
PERF_CTRL_GET,
|
||||||
@@ -251,7 +277,7 @@ enum perf_ctrl_type {
|
|||||||
|
|
||||||
struct perf_ctrl_desc {
|
struct perf_ctrl_desc {
|
||||||
enum perf_ctrl_type ctrl_type;
|
enum perf_ctrl_type ctrl_type;
|
||||||
int status;
|
int err;
|
||||||
union {
|
union {
|
||||||
/* for SET, GET */
|
/* for SET, GET */
|
||||||
struct {
|
struct {
|
||||||
@@ -291,6 +317,10 @@ struct perf_ctrl_desc {
|
|||||||
#define UTI_FLAG_HIGH_PRIORITY (1ULL<<12)
|
#define UTI_FLAG_HIGH_PRIORITY (1ULL<<12)
|
||||||
#define UTI_FLAG_NON_COOPERATIVE (1ULL<<13)
|
#define UTI_FLAG_NON_COOPERATIVE (1ULL<<13)
|
||||||
|
|
||||||
|
#define UTI_FLAG_PREFER_LWK (1ULL << 14)
|
||||||
|
#define UTI_FLAG_PREFER_FWK (1ULL << 15)
|
||||||
|
#define UTI_FLAG_FABRIC_INTR_AFFINITY (1ULL << 16)
|
||||||
|
|
||||||
/* Linux default value is used */
|
/* Linux default value is used */
|
||||||
#define UTI_MAX_NUMA_DOMAINS (1024)
|
#define UTI_MAX_NUMA_DOMAINS (1024)
|
||||||
|
|
||||||
@@ -309,6 +339,30 @@ struct kuti_attr {
|
|||||||
|
|
||||||
struct uti_attr_desc {
|
struct uti_attr_desc {
|
||||||
unsigned long phys_attr;
|
unsigned long phys_attr;
|
||||||
|
char *uti_cpu_set_str; /* UTI_CPU_SET environmental variable */
|
||||||
|
size_t uti_cpu_set_len;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct uti_ctx {
|
||||||
|
union {
|
||||||
|
char ctx[4096]; /* TODO: Get the size from config.h */
|
||||||
|
struct {
|
||||||
|
int uti_refill_tid;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
struct uti_get_ctx_desc {
|
||||||
|
unsigned long rp_rctx; /* Remote physical address of remote context */
|
||||||
|
void *rctx; /* Remote context */
|
||||||
|
void *lctx; /* Local context */
|
||||||
|
int uti_refill_tid;
|
||||||
|
unsigned long key; /* OUT: struct task_struct* of mcexec thread, used to search struct host_thread */
|
||||||
|
};
|
||||||
|
|
||||||
|
struct uti_save_fs_desc {
|
||||||
|
void *rctx; /* Remote context */
|
||||||
|
void *lctx; /* Local context */
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
31
executer/include/uti.h
Normal file
31
executer/include/uti.h
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
#ifndef UTI_H_INCLUDED
|
||||||
|
#define UTI_H_INCLUDED
|
||||||
|
|
||||||
|
struct syscall_struct {
|
||||||
|
int number;
|
||||||
|
unsigned long args[6];
|
||||||
|
unsigned long ret;
|
||||||
|
unsigned long uti_clv; /* copy of a clv in McKernel */
|
||||||
|
};
|
||||||
|
|
||||||
|
#define UTI_SZ_SYSCALL_STACK 16
|
||||||
|
|
||||||
|
/* Variables accessed by mcexec.c and syscall_intercept.c */
|
||||||
|
struct uti_desc {
|
||||||
|
char lctx[4096]; /* TODO: Get the size from config.h */
|
||||||
|
char rctx[4096]; /* TODO: Get the size from config.h */
|
||||||
|
int mck_tid; /* TODO: Move this out for multiple migrated-to-Linux threads */
|
||||||
|
unsigned long key; /* struct task_struct* of mcexec thread, used to search struct host_thread */
|
||||||
|
int pid, tid; /* Used as the id of tracee when issuing MCEXEC_UP_TERMINATE_THREAD */
|
||||||
|
unsigned long uti_clv; /* copy of McKernel clv */
|
||||||
|
|
||||||
|
int fd; /* /dev/mcosX */
|
||||||
|
struct syscall_struct syscall_stack[UTI_SZ_SYSCALL_STACK]; /* stack of system call arguments and return values */
|
||||||
|
int syscall_stack_top; /* stack-pointer of syscall arguments list */
|
||||||
|
long syscalls[512], syscalls2[512]; /* Syscall profile counters */
|
||||||
|
int start_syscall_intercept; /* Used to sync between mcexec.c and syscall_intercept.c */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
@@ -9,13 +9,22 @@ IHK_BASE=$(src)/../../../../ihk
|
|||||||
|
|
||||||
obj-m += mcctrl.o
|
obj-m += mcctrl.o
|
||||||
|
|
||||||
# POSTK_DEBUG_ARCH_DEP_1, arch depend "-mcmodel"
|
|
||||||
# POSTK_DEBUG_ARCH_DEP_83, arch depend translate_rva_to_rpa() move
|
# POSTK_DEBUG_ARCH_DEP_83, arch depend translate_rva_to_rpa() move
|
||||||
ifeq ($(ARCH), arm64)
|
ccflags-y := -I$(IHK_BASE)/linux/include \
|
||||||
ccflags-y := -I$(IHK_BASE)/linux/include -I$(IHK_BASE)/linux/include/ihk/arch/$(ARCH) -I$(IHK_BASE)/ikc/include -I$(IHK_BASE)/ikc/include/ikc/arch/$(ARCH) -I$(IHK_BASE)/include -I$(IHK_BASE)/include/arch/$(ARCH) -I$(src)/../../include -I$(src)/arch/$(ARCH)/include -DMCEXEC_PATH=\"$(BINDIR)/mcexec\" -I@abs_builddir@
|
-I$(IHK_BASE)/linux/include/ihk/arch/$(ARCH) \
|
||||||
else
|
-I$(IHK_BASE)/ikc/include \
|
||||||
ccflags-y := -I$(IHK_BASE)/linux/include -I$(IHK_BASE)/linux/include/ihk/arch/$(ARCH) -I$(IHK_BASE)/ikc/include -I$(IHK_BASE)/ikc/include/ikc/arch/$(ARCH) -I$(IHK_BASE)/include -I$(IHK_BASE)/include/arch/$(ARCH) -I$(src)/../../../kernel/include -I$(src)/../../include -mcmodel=kernel -mno-red-zone -DMCEXEC_PATH=\"$(BINDIR)/mcexec\" -I@abs_builddir@ -I@abs_builddir@/../../../
|
-I$(IHK_BASE)/ikc/include/ikc/arch/$(ARCH) \
|
||||||
endif
|
-I$(IHK_BASE)/include \
|
||||||
|
-I$(IHK_BASE)/include/arch/$(ARCH) \
|
||||||
|
-I$(src)/../../include \
|
||||||
|
-I$(src)/arch/$(ARCH)/include \
|
||||||
|
-I@abs_builddir@ \
|
||||||
|
-I@abs_builddir@/../../../ \
|
||||||
|
-I$(src)/../../../kernel/include \
|
||||||
|
-DMCEXEC_PATH=\"$(BINDIR)/mcexec\"
|
||||||
|
|
||||||
|
# depending arch
|
||||||
|
include @abs_builddir@/arch/$(ARCH)/Makefile
|
||||||
|
|
||||||
mcctrl-y := driver.o control.o ikc.o syscall.o procfs.o binfmt_mcexec.o
|
mcctrl-y := driver.o control.o ikc.o syscall.o procfs.o binfmt_mcexec.o
|
||||||
mcctrl-y += sysfs.o sysfs_files.o arch/$(ARCH)/archdeps.o
|
mcctrl-y += sysfs.o sysfs_files.o arch/$(ARCH)/archdeps.o
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user