mirror of
https://github.com/mmueller41/genode.git
synced 2026-01-22 04:52:56 +01:00
Compare commits
414 Commits
sculpt-21.
...
21.08
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
64e2912a2f | ||
|
|
339dda8b43 | ||
|
|
397a3e45d1 | ||
|
|
f8898f3a56 | ||
|
|
83c5648d33 | ||
|
|
7fdebc6a09 | ||
|
|
4782f9376c | ||
|
|
a362505e8a | ||
|
|
ece837e8b8 | ||
|
|
eedbcf88ec | ||
|
|
2b0bb6dda0 | ||
|
|
31b049864c | ||
|
|
46be4f1145 | ||
|
|
e4ae817e82 | ||
|
|
38d731bd79 | ||
|
|
9041567f14 | ||
|
|
b6ec4bdf05 | ||
|
|
dd90424129 | ||
|
|
c26c50e59b | ||
|
|
ac9e0947fd | ||
|
|
fb4d357b59 | ||
|
|
7a4626861e | ||
|
|
bac7381be3 | ||
|
|
6b1f1794c4 | ||
|
|
eab92f8d6f | ||
|
|
ee283c0d12 | ||
|
|
c5d8a43418 | ||
|
|
cc2363d421 | ||
|
|
b287c4888a | ||
|
|
66ac2dc635 | ||
|
|
6c7bcdd32e | ||
|
|
b2440a72c3 | ||
|
|
8a285a7bee | ||
|
|
c9809fde67 | ||
|
|
de8327c11a | ||
|
|
0aa17661cc | ||
|
|
82a51d8eaa | ||
|
|
040628894c | ||
|
|
b5dd1dd01b | ||
|
|
ffbd26d63f | ||
|
|
1416b2258f | ||
|
|
436d946300 | ||
|
|
324ad33736 | ||
|
|
2cb4157211 | ||
|
|
c95af254f4 | ||
|
|
29032caf40 | ||
|
|
36af114d78 | ||
|
|
149bd999f3 | ||
|
|
a6fb61dbf2 | ||
|
|
50cc51f132 | ||
|
|
c54473abea | ||
|
|
611e93a5f2 | ||
|
|
d6bde82894 | ||
|
|
88b3880c77 | ||
|
|
7618c9410a | ||
|
|
5e284bfb35 | ||
|
|
81d939f947 | ||
|
|
9898341d4a | ||
|
|
812fdec27c | ||
|
|
fa64aae7f8 | ||
|
|
1111472af7 | ||
|
|
9e6f7988c2 | ||
|
|
80c1459e79 | ||
|
|
0840cfe834 | ||
|
|
e648e7255a | ||
|
|
06a4608f4a | ||
|
|
619474bc90 | ||
|
|
b0e558f486 | ||
|
|
d7a27c448d | ||
|
|
626b2f9cf2 | ||
|
|
2533d7b4b6 | ||
|
|
60c8369718 | ||
|
|
b59e2ba677 | ||
|
|
c3e8c22a6d | ||
|
|
2fe70f111b | ||
|
|
1727de30b7 | ||
|
|
6c003a13d2 | ||
|
|
11192b18e6 | ||
|
|
fe867765a8 | ||
|
|
ffc89f3edf | ||
|
|
067b7d7c67 | ||
|
|
4b653fbac1 | ||
|
|
7dc997c8e6 | ||
|
|
5d6ea5ef22 | ||
|
|
a721933771 | ||
|
|
c949e5c90d | ||
|
|
243a9ec3ca | ||
|
|
b3147050cc | ||
|
|
f8953de7ac | ||
|
|
fce525f122 | ||
|
|
2afae7e7c1 | ||
|
|
d06773b957 | ||
|
|
c8a8cbd7be | ||
|
|
00e8e363d8 | ||
|
|
8bc861ca71 | ||
|
|
9384e075cb | ||
|
|
52011ec034 | ||
|
|
908d581a8c | ||
|
|
b38ec9f238 | ||
|
|
9334ec09e2 | ||
|
|
1bfc828826 | ||
|
|
b51b9e1ef3 | ||
|
|
3d36291d7f | ||
|
|
2afb7c5567 | ||
|
|
ee045a68cc | ||
|
|
1a526e73a3 | ||
|
|
1aba330ae6 | ||
|
|
119d72ad94 | ||
|
|
b16bb82f8b | ||
|
|
f939b9ffb5 | ||
|
|
45f5ed173a | ||
|
|
6de19e4a9b | ||
|
|
5138aeba80 | ||
|
|
f3908b8283 | ||
|
|
fdc4bd2f90 | ||
|
|
4d4cc4fd02 | ||
|
|
4b10aa94ec | ||
|
|
688379d1ed | ||
|
|
0074a7c4ac | ||
|
|
388e2a0e6d | ||
|
|
a856bfb4ab | ||
|
|
3824c0ca5f | ||
|
|
40e2aa6617 | ||
|
|
2d017ad7b7 | ||
|
|
be644098d7 | ||
|
|
fd9bc43be1 | ||
|
|
a6fe6c90d4 | ||
|
|
ece33d37f8 | ||
|
|
e7067050be | ||
|
|
ed0cc5330e | ||
|
|
b83c8f35c6 | ||
|
|
a242bfce48 | ||
|
|
19a7997734 | ||
|
|
a58473dece | ||
|
|
cd25dc4e6a | ||
|
|
c585e008b1 | ||
|
|
5b85bd9602 | ||
|
|
0dc7084b0f | ||
|
|
16c4aacf34 | ||
|
|
6bfdddd0b5 | ||
|
|
026b117a63 | ||
|
|
e5600fea06 | ||
|
|
f541668604 | ||
|
|
bf7500ad7b | ||
|
|
29b7c5a202 | ||
|
|
7346defc26 | ||
|
|
dff1df0b49 | ||
|
|
2c87c68a5d | ||
|
|
52a4293bbc | ||
|
|
ff57bf617b | ||
|
|
818f1682ee | ||
|
|
eabda8907f | ||
|
|
4aa99fd1a9 | ||
|
|
ff452619e3 | ||
|
|
19a5fee70b | ||
|
|
c66a196f76 | ||
|
|
9165c7601d | ||
|
|
ff128df131 | ||
|
|
747d01e854 | ||
|
|
331844c979 | ||
|
|
434d007dc1 | ||
|
|
7db6f457d4 | ||
|
|
37f1873f2e | ||
|
|
002037ce15 | ||
|
|
2a1a47b598 | ||
|
|
ab31de0f6a | ||
|
|
a37ff1d985 | ||
|
|
4053e1628b | ||
|
|
27004e1fd5 | ||
|
|
b09e69a444 | ||
|
|
758c0a21cc | ||
|
|
60eec251e0 | ||
|
|
336350fe60 | ||
|
|
8408bf6ac0 | ||
|
|
73d87073af | ||
|
|
cf2527269f | ||
|
|
520b69ef0d | ||
|
|
c0150f97e5 | ||
|
|
5dc7d55cc0 | ||
|
|
fd2f137a9b | ||
|
|
1d52bd017d | ||
|
|
e06f3bba27 | ||
|
|
1d12755401 | ||
|
|
f2ac341003 | ||
|
|
f2ff1a6d52 | ||
|
|
4383579db6 | ||
|
|
f0b9549376 | ||
|
|
aab6f52325 | ||
|
|
6e85a73a28 | ||
|
|
4abc530974 | ||
|
|
583ba0e9db | ||
|
|
62f83b7198 | ||
|
|
464f0eaf8b | ||
|
|
0f72a342f3 | ||
|
|
3dff399fba | ||
|
|
0aa99648d7 | ||
|
|
6b9fcc9449 | ||
|
|
f9c7947c45 | ||
|
|
28189ba77a | ||
|
|
fc5903c917 | ||
|
|
7f6f710bd2 | ||
|
|
ed7d6c74f4 | ||
|
|
9f099bd61c | ||
|
|
6780cf0790 | ||
|
|
7b197d54ed | ||
|
|
933de21339 | ||
|
|
509e5aa776 | ||
|
|
e1abd2db4e | ||
|
|
faf491ce92 | ||
|
|
98f524bb41 | ||
|
|
7fcf9053b9 | ||
|
|
6910b880e7 | ||
|
|
708b7f4619 | ||
|
|
921a99bb9b | ||
|
|
a13dee8d19 | ||
|
|
0069660958 | ||
|
|
7b09675236 | ||
|
|
4bed825956 | ||
|
|
5135ff2dc2 | ||
|
|
4a56171a77 | ||
|
|
ae5b4c9624 | ||
|
|
46c846ef91 | ||
|
|
c8c589d91a | ||
|
|
5254930930 | ||
|
|
70797fe879 | ||
|
|
100583e262 | ||
|
|
57fbd2b658 | ||
|
|
9549eeeca4 | ||
|
|
9166a75f2c | ||
|
|
dd587c6712 | ||
|
|
3ed26e7bb2 | ||
|
|
6e900f147c | ||
|
|
0507d3f44b | ||
|
|
0b641ba581 | ||
|
|
b3a229eebb | ||
|
|
fd0a4e78c8 | ||
|
|
74d826d1ad | ||
|
|
b6b9801c20 | ||
|
|
b22d9385f1 | ||
|
|
516601b7ba | ||
|
|
67a8f29697 | ||
|
|
3e284558a1 | ||
|
|
04d8e03ecb | ||
|
|
cfe29b0e52 | ||
|
|
d4b9be8d44 | ||
|
|
db97af8dec | ||
|
|
4daf19ec7e | ||
|
|
18a43c1afd | ||
|
|
813f4d976b | ||
|
|
a24224ffc3 | ||
|
|
9543161827 | ||
|
|
a0517686ca | ||
|
|
9209dfc9d5 | ||
|
|
f8d0552d52 | ||
|
|
139a2cfae9 | ||
|
|
1c20ed12c1 | ||
|
|
d516544a1f | ||
|
|
f8b2fd522b | ||
|
|
471d34a367 | ||
|
|
d5e4ffd191 | ||
|
|
4a4b754bf2 | ||
|
|
a0f5d34e25 | ||
|
|
9a3d5dcf21 | ||
|
|
9c05cda6e7 | ||
|
|
6639261126 | ||
|
|
fc902d9e66 | ||
|
|
6a11b78cdf | ||
|
|
7fd598f0c1 | ||
|
|
777923f9bd | ||
|
|
d2bf565503 | ||
|
|
384a8da50b | ||
|
|
b6bdd91cfa | ||
|
|
a5385cebf4 | ||
|
|
c5c3d7ca98 | ||
|
|
d19b751632 | ||
|
|
ff160decec | ||
|
|
a4115cfea9 | ||
|
|
2f9d430c00 | ||
|
|
718f44ae5b | ||
|
|
66feb939e6 | ||
|
|
1baf844e20 | ||
|
|
5fa2efa745 | ||
|
|
ad847d0543 | ||
|
|
0b36d81c0c | ||
|
|
a4727c90a8 | ||
|
|
e65b7f3b82 | ||
|
|
0f0edc0134 | ||
|
|
d0f084d449 | ||
|
|
c7b2314d23 | ||
|
|
eb94f03416 | ||
|
|
516a9a6925 | ||
|
|
fdb1a4dd88 | ||
|
|
d477062c56 | ||
|
|
811009d18b | ||
|
|
00d13cf304 | ||
|
|
49184fb938 | ||
|
|
52e8c95321 | ||
|
|
9b854e1496 | ||
|
|
d5e7870532 | ||
|
|
bc8dbc6b1a | ||
|
|
8f23e377d9 | ||
|
|
aebece5110 | ||
|
|
82604f2c2b | ||
|
|
4563baae77 | ||
|
|
c4e3d3dbc4 | ||
|
|
eb53f8c113 | ||
|
|
07649b667b | ||
|
|
0f679bb35e | ||
|
|
d6e9d74038 | ||
|
|
405e6744fb | ||
|
|
fad85c3fd5 | ||
|
|
49392dfa44 | ||
|
|
e627f8320f | ||
|
|
8196e229b0 | ||
|
|
0a8394c891 | ||
|
|
66e8f8d764 | ||
|
|
84e4cbb54c | ||
|
|
23b21812dd | ||
|
|
d66e55ec37 | ||
|
|
5dbc9ef244 | ||
|
|
4e822436fc | ||
|
|
ce75b25fd4 | ||
|
|
118e8ee6e1 | ||
|
|
f236e99b5c | ||
|
|
86e09b60c4 | ||
|
|
373b45a0f0 | ||
|
|
a2491c30b3 | ||
|
|
d80b2a150a | ||
|
|
c802de2cf9 | ||
|
|
e86387d557 | ||
|
|
f6aabfe233 | ||
|
|
8617e5cee0 | ||
|
|
2db94b8438 | ||
|
|
7b9e7361ba | ||
|
|
910ea16405 | ||
|
|
58db8c647a | ||
|
|
4826bd82fe | ||
|
|
7b90f8f857 | ||
|
|
bf3ad3baff | ||
|
|
8a4b52d9e3 | ||
|
|
a47fd36b9f | ||
|
|
a2e62db6ec | ||
|
|
7503472ae6 | ||
|
|
1c49da8ce4 | ||
|
|
9cb8c37e3a | ||
|
|
bb6617ad03 | ||
|
|
f49ec5b171 | ||
|
|
507a7789fb | ||
|
|
421d2bed40 | ||
|
|
6caa74a18e | ||
|
|
5ac3c335dc | ||
|
|
e8b97ad684 | ||
|
|
3f450a77e1 | ||
|
|
462bff5aef | ||
|
|
ace7c9172b | ||
|
|
173264ed1e | ||
|
|
190eafeaa6 | ||
|
|
ddf6a0c276 | ||
|
|
8f30fc993d | ||
|
|
33a64f79dc | ||
|
|
7de62734e5 | ||
|
|
d73eaaa14c | ||
|
|
efbed6f7bf | ||
|
|
5ca024ff8b | ||
|
|
dc8c899c1d | ||
|
|
d1cf9c86b8 | ||
|
|
46ca576eac | ||
|
|
70281715c6 | ||
|
|
4546148ab7 | ||
|
|
80cf47d906 | ||
|
|
7c01053842 | ||
|
|
e28709d54d | ||
|
|
dc89ebf978 | ||
|
|
7ae1210531 | ||
|
|
c9d904df71 | ||
|
|
21e9e1840a | ||
|
|
4e714d3f3a | ||
|
|
2084404aba | ||
|
|
9c9302e51d | ||
|
|
af490bdd5b | ||
|
|
0339318572 | ||
|
|
53e44f8bfd | ||
|
|
a839b4f0bb | ||
|
|
468e7a825c | ||
|
|
3ed8df9089 | ||
|
|
97a9ad114c | ||
|
|
f5f5b8c1f1 | ||
|
|
b661459aca | ||
|
|
f925fef17b | ||
|
|
97d44c5a79 | ||
|
|
1867cf4967 | ||
|
|
f3f8d9a6de | ||
|
|
99f4b3cd07 | ||
|
|
ac07f9d08e | ||
|
|
ed9487b452 | ||
|
|
729b22f04f | ||
|
|
698f6eb86c | ||
|
|
73e8d64c34 | ||
|
|
cb9a26f1ed | ||
|
|
49481dd3fb | ||
|
|
dc8dd3396d | ||
|
|
9ac23a18d4 | ||
|
|
ae8050bb82 | ||
|
|
0a849a1681 | ||
|
|
f89414c637 | ||
|
|
4cdfeb13e2 | ||
|
|
1a57a5a959 | ||
|
|
96cc660f95 | ||
|
|
2c7c7767fc | ||
|
|
9f8c555e7d | ||
|
|
fb9f6812e1 | ||
|
|
839183d2b6 | ||
|
|
c67e78a7f0 | ||
|
|
0ac4d1d411 |
@@ -1 +0,0 @@
|
||||
https://depot.1337.cx
|
||||
@@ -1,37 +0,0 @@
|
||||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||
Version: GnuPG v1
|
||||
|
||||
mQENBFm3BlYBCADR2ZGIWiYurf/urQ+rAZs3HMobXQ/fckc3FOAdY9qiklrvPr9s
|
||||
maZZyMF+Wn4J2AmsGctJbBUt3ujcmk09AgZIzrHpVJRagUSz9q+bK7NvAfenDC2q
|
||||
w4HS5yE9DYxXOjxrcS5a2HhKfE5sZef1zPtFIkEZCJXCvh4IL6maLijOrUZPf9R6
|
||||
VJ+0itNh0hK9KiYsKA7CwrWuFaw7ZenVkEBV1HGXybFh9aInTTSqopyU6qYLDK1X
|
||||
U0NG24cjM8TDbMGTaoScpLchcftBGEhjYg7Y2FCu455MDVdrmoOoxDINYgDU1KN6
|
||||
8GBKKJ+xqG703/o550l+rCMB+TxMN5zKTFhXABEBAAG0IkVtZXJ5IEhlbWluZ3dh
|
||||
eSA8ZWhtcnlAcG9zdGVvLm5ldD6JAVQEEwEIAD4CGwMFCwkIBwIGFQgJCgsCBBYC
|
||||
AwECHgECF4AWIQRuEEFO5xYHgfX+6P+xTQQ6JrPSxwUCWgHubgUJAZm9OgAKCRCx
|
||||
TQQ6JrPSxyJ0B/0eBOIloo3zJwtuQnNXe2ZFAmHFF7MJhrr0IpZ0n5K0OHTFPqXN
|
||||
VJ+vhTGuI/SlF3a9YEHohIT2KKal1aq+/wVkX6Kdi4G4nGTEXdRsTwlzN/GXHBPF
|
||||
IW0iUOInJOliKReaamsR/rgXXH5sstq2IU4x+NpHMT/OrkQPNSqVX0RjS9i76Awo
|
||||
+EqdtW8g3y8qWd8WtTfhbMlQLhuzm99aADbspr4nK9WhZ7UHYLJAz/u7LzZlRiI5
|
||||
hNa85BCPhNuYz5NTHhn4L9r6PdbKPzUV173XrlAtlteYuGIHk4d/zSAwlgDevChL
|
||||
0MDRq1vvgfQ2V0SwIqRqIfnO31Ph8uktJ8WRiQEfBBABCAAJBQJaAReyAgcAAAoJ
|
||||
EIZq4LBroLaERpQH/3Dw0H6N9YF2ATmkse6NNNQjxhKSUoA34UBWj0v4Q1AvXEe6
|
||||
nHRR0mAa9Gije9ixKUg85VbKM3lUhXCFqW5jzyzpF1rzzTpAHaUTYKb8M2D9iRKo
|
||||
9ejTK3KrgpstYJ8jthfosxeC+lK24WUXKKWPjgoIhv7Thd31ea/PZdkFVd1MpSwg
|
||||
5BHRHcogsJI9uou7zWYbap9/k0lxKHJWklLh/oXet+aAoUIL0kTU+nILy3/RZJGW
|
||||
9WlnZR9g3qSQ8YNpgNSrraEtXpcs6MGsWZSzbzJ1U95NL87NbWEOYgHZA++vhEy5
|
||||
EXVrd8SuSHbUbqNF36gz1cxmEuKwxAaWZ1/UbGW5AQ0EWbcGVgEIANC9LozG/TXV
|
||||
4j0TniuLrsq7kkNH+OJQexcD19pBrmEV4eYYD6c8BB9CaBITqvKIqtG0VJrmB5S5
|
||||
D0oW4mQI+TkcX+Q7y3S7dUkc856d03aUX3vVcNhXEbNgM19qxAGieC8WH2kr4XU1
|
||||
psu1WvFCXOktrE5c8H0rPCQ1jseB0S67XCA9BLwAqlqu0OuTpbWddjXuE1ahi0ig
|
||||
Yt5YsHvgCMLup208azQqGCnJ5tFotqzbLg3I6+QzMcLySqsN4BzYmUGbOSSZdUhX
|
||||
DWxwAK1dB8qa27iwsxCMncdGnqOTkq+mXRmu8ztPTUivyC6YHJ+O5lXvMMADZi4j
|
||||
8RpQQlh5gFkAEQEAAYkBNgQYAQgAIBYhBG4QQU7nFgeB9f7o/7FNBDoms9LHBQJZ
|
||||
twZWAhsMAAoJELFNBDoms9LHTmIH/0PuzpA3Ezdrb4xfVwnhUUZGiqfNzULCZipT
|
||||
qtfym6Ove6To4BbXAihWwnCYs4sgipabW1WaXsDDvU+AmOmz4EPyTna23fUzYRSL
|
||||
MT/kk77d+BGRGeA8/Gj/BgjPlHlFa7ukbT1DL1lSV0RMQ32tDGnhJ7wMBx4GoYU+
|
||||
xjlsxrYKKdvZKOQVCCFn4KY/GavqT+8pYYI63stSPGspboQR2iboKqc350MVMvzz
|
||||
IaDt14YiOYlgV6LoNj2VaPJvFqm9ML+plYl4PPQZTV6KAhFWCDJq2DzEQqwG6RU4
|
||||
SsneHAqMlG4A5SSMTLEd9F2gZ2sJicybr1WbNLj1KF74ckUhpM4=
|
||||
=p4q9
|
||||
-----END PGP PUBLIC KEY BLOCK-----
|
||||
1
depot/jschlatow/download
Normal file
1
depot/jschlatow/download
Normal file
@@ -0,0 +1 @@
|
||||
https://depot.genode.org
|
||||
59
depot/jschlatow/pubkey
Normal file
59
depot/jschlatow/pubkey
Normal file
@@ -0,0 +1,59 @@
|
||||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||
|
||||
mQINBGBlsG4BEADBMY44lF/LYiZByj1clJa+aNCEMGtoulxhFgCLIt2DR9r5KRmi
|
||||
iAiweobH6ofbSXYKTOZqhAcmmkw3ihIVCsd1mHbdAAhlsnJetHLgOPL90aXVwce/
|
||||
CM5QDubFmSu1VuaCgp/GaPqtQ/yaIq4LPMK+w2BfNG2M5XBeM8qLzjIHF7KNN4nZ
|
||||
CX48Gx7q2DtIYCMUdIP0oK4dNfPDy6tvXiYvcz3lA2SNa6kszW3/mgIsurUEUFF6
|
||||
vtCjBS5f6vJikWsglvTXqS0Sw5aIPzvosL/U0fjM0BVdi2NK6dWfM4HUduzr5MTD
|
||||
Xc26CETmZ/8Sl4+mj0oUAuHU0SKDm22LNc+qRzXZxtkryDbFuikwtioYf3nIDTiA
|
||||
63YPsx1jHp3mitTQgvRlJdlncmKIxXIUyGXqWpc+QHGUsvbDFdsXRxtt3J+8QWso
|
||||
yLlaeP54E0OTQqdm+EnWGHahEKIwsn8/Gfs87phQsaF8Dlw+A132RukxB6zD35xF
|
||||
/rqu25/8B0tL603Z3TLIyLDNbh4xO/iNohTB1ps+ALRwu48MsXcTMGUeWuRt2YVJ
|
||||
RPG3KfIfnd+KcvJa2XFuzZCk57Jc8qGPmINPY5fJ7F9qIT0/9O7dlxzdoksfKXMf
|
||||
RdiSCiFgmgJTqpXyfEcV7GUHCj9e0WdCSmDIH13bbuUpaTQXxO5d+XkzGwARAQAB
|
||||
tDVKb2hhbm5lcyBTY2hsYXRvdyA8am9oYW5uZXMuc2NobGF0b3dAZ2Vub2RlLWxh
|
||||
YnMuY29tPokCVAQTAQgAPhYhBBHurPU5I/pstoojMcciWBOKaz+1BQJgZbBuAhsD
|
||||
BQkJZgGABQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEMciWBOKaz+1L28P/R+T
|
||||
usXX/AdgaTRSY3hFDVnhV+adcyFdmTKWey0lMUMWRGsALd1EIJbqk4HAA81jW68j
|
||||
9XG/kZgkhGKz+vOwOD40Y6G6f1GfKIEknzWok5RgH4p0BT5+ZhbqfX3/Z6z0CsOD
|
||||
mXAo1At9JvGmP6OnpHbCwutEa/KAB2fgrjjgGMZcBlDzIsBugbT+shEAE5et0b0J
|
||||
TrsClqoO71wknMkNp0ijfvCT4VtiCq/UBD5XqYRtzDQC6dMic/dNXKp3JmcsYf17
|
||||
DUNM7RVdVx+v9onWiUre9poVn9YgA/MYwVb4hMyjJEc9R8yQhENSJtdhX2pkXVF6
|
||||
l4ONbkdaw3xJqVO1ouPBI68Ddirwfwk6kgvpkvJ+iCVQ2lWSvPbtrhmTGpeerfQD
|
||||
vbFwtUX1OZhZma5Gq8n5r6VM7N29hQalYaKPBS9AoL3YBO51NsUwde/EmZydlYl6
|
||||
C7Ny+2iuPgKCoXS2zAxM2t9Ar9K0ZhhaiEbSZHoT596M/cWnn483edt15CQZO5w0
|
||||
QNBv5nNKh0J/GmM45TtbhUya9Cpc9Ad2SVYSlNB3KQgC/n+1UQm+8UHOBq/5nuC/
|
||||
Ww2It8g1G9pkGijG/f7flh1qE7KqqYec3cMLWj8hHRYSak3omSYlt4aOJEQPinjo
|
||||
XUw+WBi/Mjrnd6UxB6mNs0VADOHDrCmFBBHcfWIAiQEzBBABCAAdFiEEwNwMDXup
|
||||
zMtoYvj6v6ZIQUWP8uIFAmBlu6wACgkQv6ZIQUWP8uKNqwf+IjqK19dU8zATB50s
|
||||
x4aEqTF6U5J2xO4xiBJlWv55zewjmmOsjJZYKBJd4UzTHqG/0CRUiDzUmsn3q1o+
|
||||
GEwC+bB/LQMi+MaSG4w901Hz2cZ/qXonHfOtISKxmW2wDcOlG8Xsds0X5gfLgIZv
|
||||
4EYK+Nh1HqcEj2/RHRzfT8/WkDSC7AzSd8nuwQL03ZkAW5woh8vX5A/Fgj77mJb+
|
||||
APi6flqnTXxsVnRLHP8ErWQ8Akg07xV5fsOt1bFpY0aKgw2HJCoFyPDzVR09QILo
|
||||
Th3jiHBdNTlbd+Hb1kQJfIyhIpwkNRKBxdbM0wZoKdVMl7xiDMMDHkYpvNyBQTkJ
|
||||
nug/1LkCDQRgZbBuARAAzwJSYFegsVTJxm/6N9gN3vcfbZkvxttQYhNefw2eog7a
|
||||
UZq8Eog4LUuhDmuVt0CWZh5YOz7u4XwjxOzNk6fw630AKiWiNkYtiLYwPyT1tPcz
|
||||
I0XI6EcIYShyOfVZ+egPUELkjdC+SVwIQttQCPpEYnzWjbg22n+XeNRUfAI4EGKj
|
||||
H5bqhKx6sR2cmbB4FPUO1kpYoqhEVdk1wdZI7n93SDPSLsoJSO+xBMPj6HqfXeab
|
||||
gvr3dpqNg05G5g5JQBznILEJBHZBuCfy01j7WNRftdwWCGfWAh53uq6ug1vilodd
|
||||
T1jvWmIbFE66rljH+sbtkZwBuEbEDnwZxNK/g72aQkog3AeDljG1a8GjazN6/upe
|
||||
JD8LfoE8gjlj9Ncg9eYvqnrGR3nv566i7cq7UO10Dl5d6bedpEIo2htm90AI3M8p
|
||||
nmtAZ18cbQodwerFvdQcegdejlpYJmI/3xaPZQqPH0puhDpT3oA53ObmjPb12ztH
|
||||
Za06+klrr1MYb+x4IQYAOO8wwVRY/+YS+YU+6mxePyPMUDJYnIgOcTkg04/O55MF
|
||||
KghOumAY3KTFoE7VlWXrBbhE/MW+Owp8zbtyFovJbmo8H718JHBQwlxzd1cS2Fvd
|
||||
7g7r5eqWZNl+bMJQmgA0ZTAI0gD5PJU+GJEhiky3e29H2tBKqozX539HCxdOJycA
|
||||
EQEAAYkCPAQYAQgAJhYhBBHurPU5I/pstoojMcciWBOKaz+1BQJgZbBuAhsMBQkJ
|
||||
ZgGAAAoJEMciWBOKaz+1y94QAMD//6IqvIQEvsmDsv0hDy/ryPgYA7+2gKQCrvsq
|
||||
rdhXYrBYGwgUPAeuYKgIFQIE+UqFZDwMbZ38DozyXvg4QYTEYQtPOio5WZGMHsNa
|
||||
VYXel8qOKAbSECuP6GFiyX+NsSKYzs+iQLCzzLJS2/N8U1TMbgOwpqcVovpKOHvE
|
||||
XPTUTwnUP25ubY32ElslRACZ/REJIm1Ftmloef50qnFggfCQdSsjevl74Q2+QOHk
|
||||
Nb5w+a+vM6CmTGM1kqEATSJfBkxS7jCnGH4H9t44cEYqECpOYm4eUjxpM/9rxMw8
|
||||
itrVs8preL28zzgKydVLO1JAX4WAw+X1k1Q9EGcRcXRnlxptZ71Lgnv4qCshPAXk
|
||||
Sm5acLgdoOOSDDCSGFtjenyDjoHWfDk22CBwmEtMDtQ02m0+IzkfpNizqKGHBpKm
|
||||
/hsu36teJilJWdAQOmDyrb0VsRweWM+rqClq3GS1+r791836WxQlKvx0/eO0gZOP
|
||||
QjQxOjeCzZ/H8h7HBZ4bwRjQzHGgIbl7k6WPIwmvM4vLQfB44YEi/zDW5ivBcDEo
|
||||
2VnHwAC2EPiVRwhRB/9+I8U09Ngrg2SnO8MkgmZpob1amblnhItM1US8bq/KDKld
|
||||
4sWgWcZO21jEqnEaep4n/9vaxvLHfFa7AYY2EbB+Dfrns80oAqHG78qFyzflnLxx
|
||||
kLJD
|
||||
=7iZV
|
||||
-----END PGP PUBLIC KEY BLOCK-----
|
||||
@@ -362,6 +362,20 @@ in its 'LIBS' declaration and refers to the tools relative to
|
||||
'$(BUILD_BASE_DIR)'.
|
||||
|
||||
|
||||
Building additional custom targets accompanying library or program
|
||||
==================================================================
|
||||
|
||||
There are cases when it is important to build additional targets
|
||||
besides standard files built for library or program. Of course there
|
||||
is no problem with writing specific make rules for commands that
|
||||
generate those target files but for them to be built a proper
|
||||
dependency must be specified. To achieve it those additional targets
|
||||
should be added to 'CUSTOM_TARGET_DEPS' variable like e.g. in
|
||||
iwl_firmware library from dde_linux repository:
|
||||
|
||||
! CUSTOM_TARGET_DEPS += $(addprefix $(BIN_DIR)/,$(IMAGES))
|
||||
|
||||
|
||||
Automated integration and testing
|
||||
#################################
|
||||
|
||||
|
||||
@@ -162,10 +162,6 @@ capture-session and event-session interfaces respectively.
|
||||
:_dde_linux/src/drivers/usb_hid/_:
|
||||
USB Human Interface Device driver using the USB session interface.
|
||||
|
||||
:_os/src/drivers/usb_block/_:
|
||||
USB storage driver that uses the USB session interface and provides
|
||||
a block-session interface.
|
||||
|
||||
|
||||
Timer drivers
|
||||
=============
|
||||
@@ -220,11 +216,6 @@ _os/include/block_session/_.
|
||||
:_os/src/drivers/sd_card/spec/rpi/_:
|
||||
Driver for SD-cards connected to the Raspberry Pi.
|
||||
|
||||
:_dde_linux/src/drivers/usb/_:
|
||||
USB driver that makes USB storage devices available as block sessions.
|
||||
For an example of using this driver, refer to the run script at
|
||||
_dde_linux/run/usb_storage.run_.
|
||||
|
||||
:_os/src/drivers/ahci/_:
|
||||
Driver for SATA disks and CD-ROMs on x86 PCs.
|
||||
|
||||
@@ -232,7 +223,8 @@ _os/include/block_session/_.
|
||||
Driver for NVMe block devices on x86 PCs.
|
||||
|
||||
:_os/src/drivers/usb_block/_:
|
||||
USB Mass Storage Bulk-Only driver using the USB session interface.
|
||||
USB Mass Storage Bulk-Only driver using the USB session interface and provides
|
||||
a block-session interface.
|
||||
|
||||
|
||||
Network interface drivers
|
||||
@@ -257,8 +249,8 @@ defined at _os/include/nic_session/_.
|
||||
The wifi_drv component is a port of the Linux mac802.11 stack, including the
|
||||
iwlwifi driver. It enables the use of Intel Wireless 6xxx and 7xxx cards.
|
||||
|
||||
:_dde_linux/src/drivers/usb/_:
|
||||
For the OMAP4 platform, the USB driver contains the networking driver.
|
||||
:_dde_linux/src/drivers/usb_net/_:
|
||||
USB network driver using the USB session interface.
|
||||
|
||||
:_dde_linux/src/drivers/nic/fec/_:
|
||||
Driver for ethernet NICs of the i.MX SoC family.
|
||||
@@ -450,6 +442,9 @@ Separate components
|
||||
A wrapper for nitpicker's GUI session interface that applies alpha-blending
|
||||
to the of views a GUI client.
|
||||
|
||||
:_os/src/server/black_hole/_:
|
||||
Mockup implementation of Genode session interfaces.
|
||||
|
||||
|
||||
VFS plugins
|
||||
===========
|
||||
|
||||
91
doc/news.txt
91
doc/news.txt
@@ -4,6 +4,97 @@
|
||||
===========
|
||||
|
||||
|
||||
Genode OS Framework release 21.08 | 2021-08-31
|
||||
##############################################
|
||||
|
||||
| The highlights of Genode 21.08 are revamped GPU support as well as new
|
||||
| drivers for the Pinephone and MNT-Reform laptop based on a new streamlined
|
||||
| approach for porting Linux kernel code. Further topics range from VirtualBox
|
||||
| improvements, over media playback in the native web browser, to LTE
|
||||
| connectivity in Sculpt OS.
|
||||
|
||||
For complex driver stacks, Genode largely relies on code ported from other
|
||||
operating systems. The Linux kernel plays a special role because - being the
|
||||
basis for Android - it is the de-facto reference for driving the peripherals
|
||||
of most ARM SoCs. Up to now, however, the porting efforts of driver code from
|
||||
Linux to Genode used to be a time-intensive affair, which forced a narrow
|
||||
focus on very few SoCs on us. With the streamlined porting approach introduced
|
||||
with the new release, we become able to dramatically reduce the costs,
|
||||
creating the prospect of a much broader hardware support. The first success
|
||||
stories of the new way of porting are added graphics drivers for the Pinephone
|
||||
and the MNT-Reform laptop, a network driver for the Pine-A64-LTS board, and an
|
||||
SD-card driver for the MNT-Reform.
|
||||
|
||||
The second spotlight of the release is the largely revamped support for Intel
|
||||
GPUs. In contrast to our experimental GPU-related work of the past, we have
|
||||
now identified a way to cleanly integrate GPU support into the GUI
|
||||
architecture of sophisticated Genode systems such as Sculpt OS. This work is
|
||||
accompanied with an up-to-date version of the Mesa library stack. In
|
||||
combination with the improvements of our custom GPU multiplexer, we are now on
|
||||
a good track to make the use of hardware-accelerated graphics a commodity on
|
||||
Genode.
|
||||
|
||||
Even though most topics of the current release revolve around low-level
|
||||
driver-related work, the new version improves higher-level functionality as
|
||||
well. In particular, it adds the modular integration of mobile-data
|
||||
connectivity to Sculpt OS and enables media playback for our port of the
|
||||
Chromium web engine. Those and more topics are described in the detailed
|
||||
[https:/documentation/release-notes/21.08 - release documentation of version 21.08...]
|
||||
|
||||
|
||||
Genode OS Framework release 21.05 | 2021-05-31
|
||||
##############################################
|
||||
|
||||
| Version 21.05 introduces webcam support, features an encrypted file vault
|
||||
| for Sculpt OS, and adds new drivers for the i.MX8 SoC and Pine-A64.
|
||||
| Furthermore, it is accompanied with a new tool chain based on GCC 10
|
||||
| and new guidance documentation for driver development.
|
||||
|
||||
Device-driver support remains a prominent topic for almost every release.
|
||||
The just released version 21.05 is no exception, touching hardware topics
|
||||
ranging from USB, over I2C on i.MX8, over GPIO on Pine-A64, to networking on
|
||||
RISC-V. Until now, such nitty-gritty driver-development work has been pursued
|
||||
almost exclusively by the core team at Genode Labs. To encourage developers
|
||||
outside the inner circle to join the fun, the release is accompanied with the
|
||||
initial version of a comprehensive guidance documentation for
|
||||
hardware-related topics.
|
||||
|
||||
Feature-wise the two highlights of the new version are webcam support and an
|
||||
easy-to-use encrypted file store based on our custom CBE block encrypter.
|
||||
As detailed by the release documentation, both features leverage Genode's
|
||||
architecture in unique ways to attain high flexibility without an inflation of
|
||||
complexity.
|
||||
|
||||
The release is rounded up by a new tool chain based on GCC 10 and Binutils
|
||||
2.36, profound performance optimizations, framework refinements, and new
|
||||
assistive tooling for porting Linux drivers. All the details of the new
|
||||
version are covered by the official
|
||||
[https:/documentation/release-notes/21.05 - release documentation of version 21.05...]
|
||||
|
||||
|
||||
Sculpt OS 21.03 boots now in 2.5 seconds | 2021-05-03
|
||||
#####################################################
|
||||
|
||||
| We have released an updated Sculpt 21.03 image featuring several
|
||||
| hardware-compatibility tweaks and performance improvements.
|
||||
|
||||
Since the official Sculpt OS 21.03 release end of March, we continued our
|
||||
efforts with refining the user experience and broadening hardware
|
||||
compatibility, thanks to the user feedback we received. We have now released
|
||||
an updated system image that includes those refinements as well as several
|
||||
performance optimizations that boost the boot time of Sculpt to less than 2.5
|
||||
seconds from the first life sign of the kernel to the graphical user
|
||||
interface (measured on a 5-years old Lenovo x250 laptop).
|
||||
|
||||
You can get the new version of the system image named sculpt-21-03b at the
|
||||
[https://genode.org/download/sculpt - Sculpt OS download] page.
|
||||
It is binary compatible with the original release version. So you can use it
|
||||
as a drop-in-replacement.
|
||||
|
||||
For manually reproducing the image, please refer to the corresponding
|
||||
[https://github.com/chelmuth/genode/commits/sculpt_21_03b - Git branch].
|
||||
|
||||
|
||||
Sculpt OS release 21.03 | 2021-03-24
|
||||
####################################
|
||||
|
||||
|
||||
817
doc/release_notes/21-05.txt
Normal file
817
doc/release_notes/21-05.txt
Normal file
@@ -0,0 +1,817 @@
|
||||
|
||||
|
||||
===============================================
|
||||
Release notes for the Genode OS Framework 21.05
|
||||
===============================================
|
||||
|
||||
Genode Labs
|
||||
|
||||
|
||||
|
||||
The most prominent user-visible features of Genode 21.05 are the support for
|
||||
webcams and an easy-to-use component for file encryption on
|
||||
[https://genode.org/download/sculpt - Sculpt OS]. Both topics greatly benefit
|
||||
from Genode's component architecture. The video-conferencing scenario
|
||||
described in Section [Webcam support] sandboxes the webcam driver in a
|
||||
disposable Genode component while using a second instance of the nitpicker GUI
|
||||
server as a video bridge. This design strikes a beautiful combination of
|
||||
simplicity, robustness, and flexibility.
|
||||
|
||||
The new file vault described in Section
|
||||
[File vault based on the CBE block encrypter] leverages Genode's dynamic
|
||||
sandboxing capabilities to manage the creation and operation of an encrypted
|
||||
file store. Even though the underpinnings can be described as nothing less
|
||||
than sophisticated machinery, the package presented to the user combines ease
|
||||
of use with a great sense of control.
|
||||
|
||||
The second focus of the current release are the manifold improvements of
|
||||
Genode's driver and platform support as described in Sections [Device drivers]
|
||||
and [Platforms]. Our USB support received the attention needed to accommodate
|
||||
the webcam scenario, the arsenal of i.MX8 drivers got enriched with I2C and
|
||||
power-domain control, the Pine-A64 board support is growing, Genode has become
|
||||
able to run on 64-bit ARM Linux, and we enabled principle networking for
|
||||
RISC-V.
|
||||
|
||||
Speaking of platforms, this release features the first version of a new
|
||||
"Genode Platforms" documentation (Section [Updated and new documentation])
|
||||
that aids the porting of Genode to new ARM SoCs. With this document, we share
|
||||
our former in-house know-how and methodology about the porting and development
|
||||
of drivers with developers outside of Genode Labs.
|
||||
|
||||
The release is rounded up by several performance optimizations
|
||||
(Section [Performance optimizations]) to the benefit of most Genode system
|
||||
scenarios. Furthermore, it is accompanied with an updated tool chain,
|
||||
following our established two-years rhythm
|
||||
(Section [Tool-chain update to GCC 10.3 and binutils 2.36]).
|
||||
|
||||
|
||||
Webcam support
|
||||
##############
|
||||
|
||||
During 2020, the amount of home office and remote work took an unexpected turn.
|
||||
Video conferences and video chats have become the norm, which people and
|
||||
companies rely upon. Even though, not to be found on our
|
||||
[https://genode.org/about/road-map - road map] for 2021, this development
|
||||
prompted the Genode team to explore the field of webcam and video chat support
|
||||
on Genode.
|
||||
|
||||
Webcams are generally connected via USB to a host device and implement the USB
|
||||
video device class
|
||||
([https://www.usb.org/sites/default/files/USB_Video_Class_1_5.zip - UVC spec]).
|
||||
Therefore, it is possible to drive many different webcam devices using the
|
||||
same USB interface. To support this protocol, we enabled
|
||||
[https://ken.tossell.net/libuvc/doc - libuvc], which offers fine-grained control
|
||||
over UVC exporting USB devices. In order to enable _libuvc_ on Genode, we
|
||||
simply integrated the library into Genode's port system with no further
|
||||
changes required. _libuvc_ depends on [https://libusb.info - libusb] as a back
|
||||
end to access the actual webcam device. While there exists a port of _libusb_
|
||||
for Genode - that connects through Genode's USB session interface to the USB
|
||||
host controller - the port still lacked support for isochronous USB transfers
|
||||
as required by UVC devices. Isochronous transfers represent a continuous
|
||||
stream of data (either input or output) with a constant rate without delivery
|
||||
guarantees. We extended _libusb_ to handle isochronous transfers, which were
|
||||
already supported by Genode's USB session. Observing that this kind of
|
||||
transfers can cause high load within the USB host driver, we optimized
|
||||
isochronous transfer support at the host driver level (Section [USB]).
|
||||
|
||||
At the front-end side, we created a small _usb_webcam_ component that uses
|
||||
_libuvc_ in order to enable, disable, and configure the camera. The component
|
||||
connects to a GUI session, and thus, can be interfaced directly, for example,
|
||||
to the Nitpicker component for rendering webcam images natively on screen.
|
||||
Whereas Genode's pixel format is 32 bit RGB, webcams stream data in the YUV2,
|
||||
MJPEG, or H.264 formats. To handle the conversion of these formats to Genode's
|
||||
pixel format, we utilize the
|
||||
[https://chromium.googlesource.com/libyuv/libyuv - libyuv] library and thereby
|
||||
support the YUV2 as well as the MJPEG pixel format for webcams.
|
||||
|
||||
Additionally, we wanted to be able to transfer the webcam data directly into
|
||||
our VirtualBox port, thus enabling, sophisticated video conference systems
|
||||
like Jitsi or Skype.
|
||||
|
||||
[image webcam]
|
||||
|
||||
Our USB host-controller support for VirtualBox is based on the ported Qemu USB
|
||||
3.0 (XHCI) controller model. Since no USB webcam device model is available for
|
||||
Qemu, we were required to develop a one from scratch. The new USB webcam model
|
||||
is attached to the QEMU USB XHCI controller and operates as a bulk endpoint.
|
||||
In contrast to an isochronous endpoint, the model causes less CPU load and
|
||||
fewer virtual interrupts. The supported formats offered to the guest are YUV2
|
||||
and BGR3. By enabling the USB webcam model within the Genode VirtualBox
|
||||
configuration, a _Capture_ session is used to capture pictures at the rate of
|
||||
a configured _fps_ value. The following snippet shows the default values of
|
||||
the supported configuration attributes.
|
||||
|
||||
!<config ...>
|
||||
! ...
|
||||
! <webcam width="640" height="480" fps="15" vertical_flip="false"
|
||||
! screen_size="false" report="false"/>
|
||||
! ...
|
||||
!</config>
|
||||
|
||||
If the _screen_size_ attribute is set to _true_, the device model determines
|
||||
the resolution from the established capture session. Otherwise, the specified
|
||||
_width_ and _height_ values are used. The _vertical_flip_ attribute is useful
|
||||
for the BGR3 format, which is - when interpreted by Linux guests - flipped
|
||||
vertically and can be flipped back by setting the attribute to _true_.
|
||||
|
||||
If the _report_ attribute is set to _true_, a report will be generated
|
||||
whenever the guest changes the state of the webcam model, either by switching
|
||||
capturing on/off or by changing the pixel format.
|
||||
|
||||
! <capture enabled="true/false" format="YUV2/BGR3"/>
|
||||
|
||||
[image webcam_chat]
|
||||
|
||||
Finally, our developers, croc and lion, setup the Webcam scenario in Sculpt
|
||||
and test drive the new feature fascinated. The picture shows a session via
|
||||
Jitsi, on the right side croc participates at the meeting via a Win10 VM on
|
||||
Sculpt and lion sitting left joined via an Android tablet.
|
||||
|
||||
|
||||
Performance optimizations
|
||||
#########################
|
||||
|
||||
One of the overarching topics of this year's
|
||||
[https://genode.org/about/road-map - roadmap] is optimization.
|
||||
As part of working on the Sculpt OS
|
||||
[https://genode.org/news/sculpt-os-21.03-boots-now-in-2.5-seconds - version 21.03],
|
||||
we identified several optimization vectors with the potential for user-visible
|
||||
improvements. In particular, while interacting with the system, a few effects
|
||||
made us curious.
|
||||
|
||||
Operations that involved changes to the runtime subsystem, e.g., adding or
|
||||
reconfiguring a component, seemed to interfere with multi-media workloads.
|
||||
When running a graphical animation, we could see it stutter in such
|
||||
situations. Another direction of our curiosity was the boot time of the
|
||||
system. The boot time of Sculpt OS has always been relatively quick compared
|
||||
to commodity operating systems. E.g., on a 5-years old laptop like a Lenovo
|
||||
x260, the system used to boot in about 5 seconds to the graphical user
|
||||
interface. However, with the anticipation of Sculpt OS on lower-end platforms
|
||||
like the Pinephone and with the vision of instant-on systems, we wondered
|
||||
about the potential for improvement.
|
||||
|
||||
While gathering a CPU-load profile of the boot process using the top tool, we
|
||||
learned that the boot time was bounded not by I/O but by the CPU load (the
|
||||
kernel's idle thread did not appear in the profile). Interestingly, a
|
||||
significant portion of the cycles were consumed by various instances of the
|
||||
init component, which prompted us to turn our attention to the implementation
|
||||
of init.
|
||||
|
||||
|
||||
Clock-cycle measurements
|
||||
------------------------
|
||||
|
||||
The next natural step was the benchmarking of various code paths of init using
|
||||
a cycle-accurate time-stamp counter (TSC). Even though Genode has a
|
||||
'Trace::timestamp' utility readily available, it remains barely used for
|
||||
manual instrumentation because such instrumentations require too much labor:
|
||||
allocation of state variables for gathering the statistics, computing time
|
||||
differences, traffic-shaping of the debug noise (needed whenever investigating
|
||||
highly frequently called code). These tasks should better be covered by a
|
||||
utility so that friction-less performance analysis can become a regular part
|
||||
of our development work. As a side effect of our investigation, we came up
|
||||
with a new utility called GENODE_LOG_TSC. This utility is covered by a
|
||||
dedicated article.
|
||||
|
||||
:Performance analysis made easy:
|
||||
|
||||
[https://genodians.org/nfeske/2021-04-07-performance]
|
||||
|
||||
Thanks to GENODE_LOG_TSC, we were able to identify three concrete
|
||||
opportunities for optimization in a course of one evening. First, the dynamic
|
||||
reconfiguration of init apparently did not scale well with a growing number of
|
||||
components. The code for analysing differences of configuration versions
|
||||
relied on doubly nested loops in order to stay as simple as possible. With the
|
||||
typical number of 30 or more components/subsystems hosted in Sculpt's runtime,
|
||||
we passed a tipping point where quadratic time complexity is justifiable.
|
||||
Second, during a configuration update, the XML data is evaluated in multiple
|
||||
passes, which puts pressure on the efficiency of Genode's XML parser. This
|
||||
pressure could in principle be relieved. Third, the process of taking
|
||||
session-routing decisions involved XML parsing. In scenarios as sophisticated
|
||||
as Sculpt, the routing rules can become quite elaborate. Since the rules are
|
||||
consulted for each session route, the costs for the rule evaluations stack up.
|
||||
|
||||
|
||||
Init optimizations
|
||||
------------------
|
||||
|
||||
These realizations motivated us to replace the hand-crafted configuration
|
||||
processing by the use of Genode's generic 'List_model' utility. This way, the
|
||||
parsing follows a common formalism that makes the code easier to maintain and
|
||||
to understand while reducing the XML parsing to a single pass. The increased
|
||||
formality cleared the way for further optimizations. In particular, init
|
||||
became able to skip the re-evaluation of the session routing whenever no
|
||||
service is affected by the configuration change. This is actually the common
|
||||
case in Sculpt.
|
||||
|
||||
To alleviate the costs for evaluating session routes, we introduced an
|
||||
internal data model for the routing rules that is optimized for the matching
|
||||
of routes. With this model, the detection of a definite mismatch (the common
|
||||
case) comes down to a comparison of a single numeric value.
|
||||
|
||||
Combined, those optimizations yield a great effect. In a typical Sculpt
|
||||
system, the time of a dynamic reconfiguration got reduced by factor 10 to the
|
||||
order of 10 to 20 milliseconds. Hence, the visual stuttering we observed
|
||||
during structural changes of the runtime are completely eliminated.
|
||||
|
||||
Besides the major optimization of init, we were able to shave off a few
|
||||
milliseconds from the boot procedure here and there. For example, by deferring
|
||||
the initialization of the real-time clock driver to its first use, we avoid a
|
||||
potentially expensive active polling loop during the highly contended boot
|
||||
phase. Another obvious heuristic improvement is the skipping of the GUI
|
||||
handling until the framebuffer driver is up because all the nice pixels would
|
||||
not be visible anyway.
|
||||
|
||||
Combined, these optimizations were able to reduce the boot time of Sculpt from
|
||||
the entering of the kernel up to the graphical user interface down to only 2.3
|
||||
seconds. The improved performance of init is impactful beyond Sculpt OS
|
||||
because it is a central component of all Genode systems large and small.
|
||||
|
||||
|
||||
Updated and new documentation
|
||||
#############################
|
||||
|
||||
Genode Platforms
|
||||
----------------
|
||||
|
||||
We are proud to introduce the first version of a new "Genode Platforms"
|
||||
document, which complements the existing Genode Foundations book with
|
||||
low-level hardware-related topics. It is primarily intended for integrators
|
||||
and developers of device drivers.
|
||||
|
||||
: <div class="visualClear"><!-- --></div>
|
||||
: <p>
|
||||
: <div style="clear: both; float: left; margin-right:20px;">
|
||||
: <a class="internal-link" href="https://genode.org">
|
||||
: <img class="image-inline" src="https://genode.org/documentation/genode-platforms-title.png">
|
||||
: </a>
|
||||
: </div>
|
||||
: </p>
|
||||
|
||||
In this first edition, the document features a practical guide for the steps
|
||||
needed to bring Genode to a new ARM SoC. The content is based on the ongoing
|
||||
Pine Fun article series at [https://genodians.org - Genodians.org].
|
||||
We plan to continuously extend it with further practical topics as we go.
|
||||
|
||||
:Initial revision of the Genode Platforms document:
|
||||
|
||||
[https://genode.org/documentation/genode-platforms-21-05.pdf]
|
||||
|
||||
|
||||
Genode Foundations
|
||||
------------------
|
||||
|
||||
The "Genode Foundations" book received its annual update. It is available at
|
||||
the [https://genode.org] website as a PDF document and an online version.
|
||||
The most noteworthy additions and changes are:
|
||||
|
||||
: <div class="visualClear"><!-- --></div>
|
||||
: <p>
|
||||
: <div style="clear: both; float: left; margin-right:20px;">
|
||||
: <a class="internal-link" href="https://genode.org">
|
||||
: <img class="image-inline" src="https://genode.org/documentation/genode-foundations-title.png">
|
||||
: </a>
|
||||
: </div>
|
||||
: </p>
|
||||
|
||||
* Adaptation to the re-stacked GUI stack introduced in
|
||||
[https://genode.org/documentation/release-notes/20.08#The_GUI_stack__restacked - version 20.08]
|
||||
* Coverage of the new uplink, capture, and event session interfaces
|
||||
* Updated API documentation
|
||||
|
||||
: <div class="visualClear"><!-- --></div>
|
||||
|
||||
To examine the changes in detail, please refer to the book's
|
||||
[https://github.com/nfeske/genode-manual/commits/master - revision history].
|
||||
|
||||
|
||||
Base framework and OS-level infrastructure
|
||||
##########################################
|
||||
|
||||
API refinements
|
||||
===============
|
||||
|
||||
VFS-access utilities
|
||||
--------------------
|
||||
|
||||
Low-complexity native Genode components do not depend on a C runtime. To allow
|
||||
such components to still enjoy the power and flexibility of the Genode's VFS
|
||||
infrastructure, we provide an evolving front-end API
|
||||
[https://github.com/genodelabs/genode/blob/master/repos/os/include/os/vfs.h - os/vfs.h]
|
||||
first introduced in version
|
||||
[https://genode.org/documentation/release-notes/19.11#Virtual_file-system_infrastructure - 19.11].
|
||||
|
||||
The API is tailored and refined according to the relatively simple use cases
|
||||
of low-complexity Genode components. The current release introduces a new
|
||||
utility for the creation of new files, appropriately named 'New_file'. The
|
||||
change is accompanied by a new 'Directory::create_sub_directory' method for
|
||||
the easy creation of directory hierarchies.
|
||||
|
||||
|
||||
Safeguarded arrays
|
||||
------------------
|
||||
|
||||
To handle arrays in a safe and C++-like fashion, a new helper class has become
|
||||
available at _base/include/util/array.h_. It accommodates an increasingly used
|
||||
pattern where elements are dynamically added at construction time but stay the
|
||||
same once the array is constructed.
|
||||
|
||||
|
||||
Cosmetic changes
|
||||
----------------
|
||||
|
||||
We refined the 'Range_allocator::alloc_aligned' interface to make it more
|
||||
safe. The former 'from' and 'to' arguments are replaced by a single 'range'
|
||||
argument. The distinction of the use cases of regular allocations vs.
|
||||
address-constrained allocations is now covered by a dedicated overload instead
|
||||
of relying on a default argument. The 'align' argument has been changed from
|
||||
'int' to 'unsigned' to be better compatible with 'addr_t' and 'size_t'.
|
||||
|
||||
The 'Cache_attribute' type has been renamed to 'Cache'.
|
||||
|
||||
|
||||
Input-event handling
|
||||
====================
|
||||
|
||||
A central component for Genode's input-event handling functionality is the
|
||||
event filter. It merges input events from multiple event sources and passes
|
||||
them to the event sink (typically the GUI server). In between, it performs
|
||||
low-level key remapping and applies character mapping rules. Character mapping
|
||||
rules are essential for supporting different keyboard layouts (including
|
||||
dead-key sequences). Low-level key remapping is, for instance, used for
|
||||
changing the emitted key codes of the Num Pad keys according to the Num Lock
|
||||
state. The different filter functionalities can be arbitrarily assembled into
|
||||
a filter chain and provided as a dynamic config ROM to the event filter
|
||||
component. The event sink then receives and processes the filtered events.
|
||||
|
||||
Some input devices emit unusual and/or extra key codes in certain situations,
|
||||
which impedes the event sink's ability to detect key combos correctly. We
|
||||
therefore added the functionality to completely mute certain key codes. In
|
||||
order to ignore all unknown key codes for instance, we can now add an
|
||||
'<ignore-key>' node to the config of the event filter.
|
||||
|
||||
! <remap>
|
||||
! <ignore-key name="KEY_UNKNOWN"/>
|
||||
! ...
|
||||
! </remap>
|
||||
|
||||
Note, that '<ignore-key>' is part of the '<remap>' filter. The name attribute
|
||||
refers to the low-level key name before any remapping rule has been applied.
|
||||
|
||||
As a second addition, we implemented a '<log>' filter that allows low-level
|
||||
debugging of the event-filter component and its configuration. The '<log>'
|
||||
filter can appear at each stage in the filter chain. For instance, we can log
|
||||
the input events before and after the remap filter as follows.
|
||||
|
||||
! <log prefix="REMAPPED ">
|
||||
! <remap>
|
||||
! <log prefix="RAW ">
|
||||
! ...
|
||||
! </log>
|
||||
! </remap>
|
||||
! </log>
|
||||
|
||||
The optional 'prefix' attribute thereby helps to distinguish the log output
|
||||
from different stages.
|
||||
|
||||
|
||||
File-system helpers
|
||||
===================
|
||||
|
||||
The
|
||||
[https://genode.org/documentation/release-notes/18.08#New_component_for_querying_information_from_a_file_system - fs_query]
|
||||
component is a simple helper to query information from a file system. E.g., it
|
||||
is used by the file browser of Sculpt OS to obtain the directory structure.
|
||||
The component received two welcomed improvements. First, directory content is
|
||||
now reported in alphabetic order. Thereby, all consumers of the reports become
|
||||
able to rely on deterministic output. For example, the file browser of Sculpt
|
||||
OS, the launcher menu items, and the depot-selection items will appear in a
|
||||
predictable way. Second, the size of files can be queried now. By adding an
|
||||
attribute 'size="yes"' to a query, fs_query is instructed to report the size
|
||||
of each queried file as attribute 'size' of the corresponding 'file' node.
|
||||
|
||||
Whereas fs_query inspects a file system without changing it, its sister
|
||||
component fs_tool is able to perform file-system modifications. The new
|
||||
version adds a '<new-file path="...">' operation, which writes the content of
|
||||
the XML node into the file specified as 'path' attribute. The directory
|
||||
structure leading to the file is implicitly created if needed. Should a file
|
||||
with the specified name already exist, the original file will be overwritten.
|
||||
|
||||
|
||||
Applications
|
||||
############
|
||||
|
||||
File vault based on the CBE block encrypter
|
||||
===========================================
|
||||
|
||||
Over several releases
|
||||
([https://genode.org/documentation/release-notes/19.11#Preliminary_block-device_encrypter - 19.11],
|
||||
[https://genode.org/documentation/release-notes/20.05#Feature-completeness_of_the_consistent_block_encrypter - 20.05],
|
||||
[https://genode.org/documentation/release-notes/20.08#Consistent_Block_Encrypter - 20.08],
|
||||
[https://genode.org/documentation/release-notes/20.11#Consistent_Block_Encrypter__CBE_ - 20.11]),
|
||||
we persistently worked at a native solution for modern block encryption - the
|
||||
SPARK-based CBE-library - and its integration into Genode's VFS. Even though,
|
||||
this work was already suitable for real-world scenarios like
|
||||
[https://genodians.org/m-stein/2020-06-12-cbe-linux-vm - hosting a Linux VM on top of an encrypted block device],
|
||||
it still lacked stress-testing by a regular user base because its integration
|
||||
into an end-user system - like Sculpt - required tedious low-level wizardry.
|
||||
|
||||
This situation had to change because we want to encourage as many people as
|
||||
possible to expose the codebase around the CBE to their workflows and let it
|
||||
mature. Therefore, we came up with a new package called file vault that can be
|
||||
readily deployed on Sculpt OS. It is a graphical front end that aims at making
|
||||
the creation, use, and maintenance of a CBE-based encrypted file store as
|
||||
intuitive and secure as possible.
|
||||
|
||||
:Introducing the file vault:
|
||||
|
||||
[https://genodians.org/m-stein/2021-05-17-introducing-the-file-vault]
|
||||
|
||||
[image file_vault_setup]
|
||||
|
||||
The file vault only requires two file-system sessions from you (the trust
|
||||
anchor is stored separately from the payload data). With that, it will
|
||||
automatically create and connect a trust anchor, set up a CBE image, prepare
|
||||
an ext2 FS on top of the CBE image and provide it through a file system
|
||||
service - ready to be used like a simple directory. The directory can be
|
||||
locked by closing the file vault and unlocked by starting the file vault on
|
||||
the same trust anchor and entering the correct user passphrase. All controls
|
||||
for the file vault's underlying CBE encrypter - like for its re-sizing and
|
||||
re-keying functionality - are presented through a simple and guiding UI that
|
||||
also provides you with the most relevant status information of your vault.
|
||||
|
||||
The file vault package is accompanied by some notable improvements regarding
|
||||
CBE's key management. Whereas in the previous release, this aspect was still
|
||||
merely a prototype with almost no protective value, the current implementation
|
||||
embraces well-known algorithms to generate and encrypt the keys used within
|
||||
the CBE respectively the file vault. This is explained in detail in the
|
||||
aforementioned article.
|
||||
|
||||
As a note of caution, the primary purpose of the current version of the file
|
||||
vault is to lift native block encryption in Genode from the development stage
|
||||
to product quality. At the current stage, it is neither time-tested nor
|
||||
reviewed by independent cryptography experts. Consequently, you should use it
|
||||
with a healthy dose of suspicion, for non-critical data only! We would be more
|
||||
than happy to receive feedback on your experience with the file vault.
|
||||
|
||||
|
||||
VirtualBox
|
||||
==========
|
||||
|
||||
Since the previous release, we continued the enablement of VirtualBox 6 on
|
||||
Genode and put efforts into stabilizing the port. Therefore, we updated to
|
||||
version 6.1.18 and reorganized the internal structure for a more
|
||||
comprehensible execution model with fewer threads. Further, we improved
|
||||
synchronization in multi-processor use cases and added a Sculpt runtime
|
||||
package for vbox6.
|
||||
|
||||
Finally, as a little treat, our ports of VirtualBox now support to pass extra
|
||||
buttons of five-button mice to the guest.
|
||||
|
||||
|
||||
Device drivers
|
||||
##############
|
||||
|
||||
Platform driver on ARM
|
||||
======================
|
||||
|
||||
The current release streamlines Genode's API for interacting with the platform
|
||||
driver on ARM platforms. It eases the access to memory-mapped I/O registers
|
||||
and interrupts by introducing the notions of
|
||||
|
||||
:'Platform::Device': one device obtained from a platform session
|
||||
|
||||
:'Platform::Device::Mmio': locally-mapped MMIO registers of a device
|
||||
|
||||
:'Platform::Device::Irq': interface for receiving device interrupts
|
||||
|
||||
The API is covered in detail by the following article.
|
||||
|
||||
:One Platform driver to rule them all:
|
||||
|
||||
[https://genodians.org/nfeske/2021-04-29-platform-driver]
|
||||
|
||||
It goes without saying that this change touches most ARM-specific drivers.
|
||||
Closely related, we also revised the concept of the XML based device-info
|
||||
mechanism provided by the platform driver to accommodate both complex drivers
|
||||
operating on multiple devices simultaneously such as driver stacks ported from
|
||||
Linux as well as low-complexity drivers for simple devices. In the new
|
||||
version, the device XML-information dataspace is only provided if the client's
|
||||
session policy states 'info="yes"'. The format of the XML information got
|
||||
refined to include the physical resource names (I/O memory and IRQ addresses)
|
||||
instead of virtual IDs and page offsets and by using a 'type' attribute
|
||||
instead of a '<compatible>' node to uniquely identify devices.
|
||||
|
||||
|
||||
Changes specific to i.MX8
|
||||
-------------------------
|
||||
|
||||
The platform driver incarnation specific to i.MX8 got slightly improved. It
|
||||
can handle the configuration of reset-pins now. Analogously to the already
|
||||
existent power domains, one can assign reset domains per device. Whenever a
|
||||
device with a reset domain gets acquired, its reset-pins are de-asserted. When
|
||||
the device gets released again, its reset-pins are asserted to put it into
|
||||
reset state. A sample configuration looks as follows:
|
||||
|
||||
! <device name="mipi_dsi>
|
||||
! <reset-domain name="mipi_dsi_pclk"/>
|
||||
! ...
|
||||
! </device>
|
||||
|
||||
Technically, those reset domains map to pin settings of the System Reset
|
||||
Controller (SRC) that is part of the i.MX8 SoC. The SRC is under control of
|
||||
the platform driver now. Currently, only the pins for the MIPI DSI Phy get
|
||||
exported. They are used by the graphical subsystem to handle panels connected
|
||||
via MIPI DSI.
|
||||
|
||||
|
||||
I2C driver for i.MX8
|
||||
====================
|
||||
|
||||
Thanks to Jean-Adrien Domage from [https://www.gapfruit.com - gapfruit], an
|
||||
API for I2C bus transactions and a new I2C bus driver for the i.MX8 SoC
|
||||
entered our framework. Coincidentally, the need to use the new I2C API more
|
||||
intensively arose soon after his initial contribution. As a consequence, the
|
||||
API got extended a bit. The result is a nice joint venture, and looks like the
|
||||
following:
|
||||
|
||||
! void transmit(Transaction & t);
|
||||
|
||||
Hereby a 'Transaction' is a simple array of 'Message' objects, and a 'Message'
|
||||
is an array of bytes that are either read or written. For very simple
|
||||
use-cases, e.g., a client that polls single bytes from a temperature sensor,
|
||||
some convenience utilities are incorporated into the 'I2c::Connection'.
|
||||
|
||||
|
||||
USB
|
||||
===
|
||||
|
||||
The USB-driver system has received quite a few refinements, performance
|
||||
improvements, and robustness handling efforts during the current release
|
||||
cycle. The HID subsystem is now capable of handling devices where the HID USB
|
||||
interface is at an arbitrary location within the device descriptors - as
|
||||
opposed to the assumption that the HID interface is always at the first
|
||||
position in the interface list of the device. Also, the HID driver now handles
|
||||
session destruction more gracefully and supports unlimited plug and unplug
|
||||
events of an associated HID device.
|
||||
|
||||
For the USB host driver, various fixes of newer Linux kernel versions have
|
||||
been back ported, which concern the handling of DMA memory. Error code and
|
||||
timeout handling have been improved in order to support more corner cases, and
|
||||
the USB session handles outstanding USB requests (synchronous and
|
||||
asynchronous) on sudden session disconnects gracefully now.
|
||||
|
||||
The CPU usage of the host driver for isochronous transfers has been reduced
|
||||
significantly for Intel XHCI controllers by adding a fix that reduces the
|
||||
triggering of an interrupt for every completed isochronous packet to one
|
||||
interrupt per eight packets, bringing the worst case scenario down to 1000
|
||||
interrupts per second from a possible 8000 IRQs before.
|
||||
|
||||
|
||||
NIC drivers
|
||||
===========
|
||||
|
||||
Drivers for iPXE-supported Ethernet devices, Wifi adapters, and Linux TAP
|
||||
devices now support the reporting of the MAC address of detected adapters.
|
||||
The feature can be enabled by a '<report>' node in the driver configuration as
|
||||
follows, prompting the driver to request a report session with the label
|
||||
_devices_.
|
||||
|
||||
! <config>
|
||||
! <report mac_address="true"/>
|
||||
! </config>
|
||||
|
||||
The resulting report is depicted below.
|
||||
|
||||
! <devices>
|
||||
! <nic mac_address="02:00:00:00:00:01"/>
|
||||
! </devices>
|
||||
|
||||
|
||||
Platforms
|
||||
#########
|
||||
|
||||
Genode/Linux on 64-bit ARM
|
||||
==========================
|
||||
|
||||
The release introduces the support for running the Linux version of Genode on
|
||||
64-bit ARM platforms. As a part of this line of work, Genode's system call
|
||||
bindings for Linux underwent a modernization to harmonize the system calls
|
||||
across the supported CPU architectures. Furthermore, we took the opportunity
|
||||
to simplify the use of the clone system call by eliminating the need for
|
||||
passing a TLS pointer.
|
||||
|
||||
Expecting that the 64-bit Genode/Linux version will remain a niche use case of
|
||||
Genode in the foreseeable future, we do not provide a pre-built tool chain.
|
||||
Hence, as a preparatory step for using this version of Genode, the tool chain
|
||||
must be built manually via Genode's _tool/tool_chain_ script.
|
||||
|
||||
As a known limitation, Genode's 'Trace::timestamp' function is not available
|
||||
on this version of Genode because Linux prevents the user land from accessing
|
||||
the cycle counter (pmccntr_el0). So the accuracy of timing is somewhat impeded
|
||||
to the order of milliseconds. Also, the jitterentropy random-number generator
|
||||
cannot be used.
|
||||
|
||||
Those limitations notwithstanding, one can successfully execute scenarios as
|
||||
complex as _leitzentrale.run_. When using AARCH64 Linux as host, run scripts
|
||||
can be executed with the same convenience as on Linux on a PC.
|
||||
|
||||
! $ make run/<script> KERNEL=linux BOARD=linux
|
||||
|
||||
|
||||
Pine-A64-LTS single board computer
|
||||
==================================
|
||||
|
||||
The current release continues
|
||||
[https://genode.org/documentation/release-notes/21.02#Pine-A64-LTS_single_board_computer - our story]
|
||||
of porting Genode to the
|
||||
[https://pine64.com/product-category/pine-a64-ltslong-term-supply/ - Pine-A64-LTS]
|
||||
board. We document the progress in great detail as we go.
|
||||
|
||||
# [https://genodians.org/nfeske/2021-03-05-pine-fun-testing - Kernel packaging and testing]
|
||||
# [https://genodians.org/nfeske/2021-03-17-pine-fun-device-access - Device access from the user level]
|
||||
# [https://genodians.org/nfeske/2021-04-29-platform-driver - One Platform driver to rule them all]
|
||||
# [https://genodians.org/nfeske/2021-05-12-pine-fun-linux - Taking Linux out for a Walk]
|
||||
# [https://genodians.org/nfeske/2021-05-19-pine-dts-pruning - Pruning device trees]
|
||||
|
||||
The accumulated material forms the basis for the evolving Genode Platforms
|
||||
document introduced in Section [Updated and new documentation].
|
||||
|
||||
The code of this line of work is available at a dedicated repository:
|
||||
|
||||
:Genode board support for Allwinner SoCs:
|
||||
|
||||
[https://github.com/nfeske/genode-allwinner]
|
||||
|
||||
|
||||
RISC-V
|
||||
======
|
||||
|
||||
The support for the RISC-V architecture has further been developed into the
|
||||
direction of a fully supported Genode platform. With this release, we wanted
|
||||
to enable basic device driver support, which requires a working interrupt
|
||||
controller. Since the "platform-level interrupt controller" (PLIC) is now
|
||||
present on most hardware as well as on the Qemu emulator, we have added
|
||||
support for the PLIC within our base-hw kernel.
|
||||
|
||||
With the interrupt controller in place, we implemented a driver for the
|
||||
[https://opencores.org - OpenCores] Ethernet device as present on the
|
||||
[https://hensoldt-cyber.com/mig-v - MiG-V] board. The driver component runs on
|
||||
Qemu (with OpenCores enabled) as well as on the MiG-V board itself. Our RISC-V
|
||||
board specific line of work can now be found within a separate
|
||||
[https://github.com/ssumpf/genode-riscv - repository].
|
||||
|
||||
With driver support in place, the final step for full RISC-V support in Genode
|
||||
is to extend our C library for this architecture.
|
||||
|
||||
|
||||
Build system and tools
|
||||
######################
|
||||
|
||||
Tool-chain update to GCC 10.3 and binutils 2.36
|
||||
===============================================
|
||||
|
||||
About every two years, we update our tailored Genode tool chain to recent
|
||||
versions. This year's update includes GCC 10.3.0, binutils 2.36.1 and GDB 10.2
|
||||
together with their corresponding Genode libraries and tools (stdcxx, ADA
|
||||
runtime, libsparkcrypto, gcov, sanitizer).
|
||||
|
||||
Feature-wise, changes are not as significant this time as with the
|
||||
[https://genode.org/documentation/release-notes/19.05#Tool_chain_based_on_GCC_8.3.0_and_binutils_2.32 - previous update],
|
||||
nevertheless we had to overcome some hurdles worth noting.
|
||||
|
||||
* The _gprbuild_ tool, which is needed to build the _ali2dep_
|
||||
tool had a bug in the version provided by Ubuntu 18.04, which prevented it
|
||||
from building _ali2dep_ with GCC/GNAT 10. To still be able to build the
|
||||
tool chain on Ubuntu 18.04, the _gprbuild_ tool is now built from
|
||||
source (of a newer version) when running the _tool_chain_ script.
|
||||
|
||||
* When building the tool chain on armhf Linux, errors occurred because
|
||||
of mismatching float-abi compiler flags used when building the
|
||||
dependency libraries (_gmp_, _mpc_, _mpfr_) with the host tool chain and
|
||||
when building the Genode tool chain with the intermediate bootstrap
|
||||
tool chain. To solve this problem, the dependency libraries are now
|
||||
downloaded and built using the GCC build system. This also had the
|
||||
effect that the _mpc_ and _mpfr_ Genode ports were not needed anymore
|
||||
and got removed.
|
||||
|
||||
* GCC 10 reports more compile errors, which had to be fixed. The most common
|
||||
errors related to narrowing conversions and potential unaligned pointers
|
||||
from packed members.
|
||||
|
||||
* GCC 10 has the _-fno-common_ option set by default, which caused link
|
||||
errors especially with some 3rd party ports.
|
||||
|
||||
* GCC 10 generated 'memset()' calls in implementations of 'memset()',
|
||||
which caused stack overflows from this recursion.
|
||||
|
||||
* The ARM compiler generates more VFP instructions now, especially when
|
||||
building for armv6, so we had to update the 'setjmp()' and 'longjmp()'
|
||||
functions used by _dde_linux_ drivers to additionally save and restore the
|
||||
FPU registers on ARM.
|
||||
|
||||
* With the new binutils version, linker sections with the same name in
|
||||
multiple linker scripts are not merged anymore. Since we rely on this
|
||||
behavior when building _core_ for NOVA, we reverted the corresponding change
|
||||
with a patch.
|
||||
|
||||
* With the new binutils version, executable files are not allowed as input
|
||||
when linking executable output files anymore. The build process of the
|
||||
Fiasco.OC kernel relied on this behavior and needed to be adapted by the
|
||||
upstream developers.
|
||||
|
||||
The new tool chain has not been enabled for RISC-V yet, because of an unsolved
|
||||
issue on initialization (resp. initial relocation) of our dynamic linker.
|
||||
Until we finalized the RISC-V support, we recommend using the tool chain
|
||||
version 19.05 for this CPU architecture by adding the following two lines to
|
||||
your build directory's _etc/tools.conf_.
|
||||
|
||||
! CROSS_DEV_PREFIX = /usr/local/genode/tool/19.05/bin/genode-riscv-
|
||||
! REQUIRED_GCC_VERSION = 8.3.0
|
||||
|
||||
The updated tool chain can be built from source or downloaded in binary form
|
||||
as described in this [https://genode.org/download/tool-chain - document].
|
||||
|
||||
|
||||
Utilities for porting Linux drivers
|
||||
===================================
|
||||
|
||||
Dummy-function generator
|
||||
------------------------
|
||||
|
||||
While porting device drivers from the Linux kernel to Genode, one has to
|
||||
tailor the environment that replaces the original kernel code. Thereby, tons
|
||||
of missing function and variable implementations have to be written. Most of
|
||||
them won't even be called by the driver under normal circumstances, but
|
||||
nonetheless they are needed to link the executable binary.
|
||||
|
||||
The production of these dummy functions in the first place is a tiresome and
|
||||
somewhat annoying work. To free developers from this burden, a new tool
|
||||
entered the Genode framework under _tool/dde_linux/create_dummies_. Apart from
|
||||
the creation of missing kernel functions and variables, it can also be used to
|
||||
easily summarize all missing symbols during the porting work.
|
||||
|
||||
For a more detailed explanation of the new tool, please have a look at the
|
||||
following article.
|
||||
|
||||
:Linux device driver ports - Breaking new ground:
|
||||
|
||||
[https://genodians.org/skalk/2021-04-08-dde-linux-experiments-1]
|
||||
|
||||
|
||||
Device-tree source processing
|
||||
-----------------------------
|
||||
|
||||
Device-tree source files as featured in the source tree of the Linux kernel
|
||||
contain valuable information about the structure and parameters of SoCs and
|
||||
boards. The porting and implementation of device drivers for Genode calls for
|
||||
tooling that is able to extract and convert this information into digestible
|
||||
forms. The current release introduces the first version of a new tool set at
|
||||
_tools/dts/_ for this purpose.
|
||||
|
||||
[image dts_extract]
|
||||
|
||||
The tool aids the understanding of the hardware and allows for the pruning of
|
||||
device trees down to a manageable complexity. As an illustration, the
|
||||
spiderweb on the left shows the device-interdependencies of the Pine-A64-LTS
|
||||
board. On the right, the device tree is pruned to cover only what's needed to
|
||||
use Ethernet. The tool is covered in more detail by the following dedicated
|
||||
article.
|
||||
|
||||
:Pruning device trees:
|
||||
|
||||
[https://genodians.org/nfeske/2021-05-19-pine-dts-pruning]
|
||||
|
||||
|
||||
Cache for downloaded ports
|
||||
==========================
|
||||
|
||||
When working with ports, it is not uncommon that a port hash is changed due to
|
||||
some minor change like the addition of a patch. A subsequent call of
|
||||
'prepare_port' would download the same files that were already downloaded
|
||||
while preparing a previous version of the port even if the downloaded content
|
||||
remains the same. This wastes internet bandwidth and developer time. The
|
||||
current release introduces a simple cache for downloaded archives, which
|
||||
alleviates these costs.
|
||||
|
||||
_Thanks to Tomasz Gajewski for his continuous contributions to improve our_
|
||||
_development workflows._
|
||||
|
||||
|
||||
Common hook for custom build rules
|
||||
==================================
|
||||
|
||||
There are cases that call for building custom targets in addition to a regular
|
||||
library or program. For example, the executable binary of an application may
|
||||
be accompanied by generated data files. The creation of such build artifacts
|
||||
can be expressed by custom make rules. However, a rule is triggered only if it
|
||||
is a dependency of the build target. This can now be achieved by adding the
|
||||
rule to the 'CUSTOM_TARGET_DEPS' variable. For example,
|
||||
|
||||
! CUSTOM_TARGET_DEPS += menu_view_styles.tar
|
||||
!
|
||||
! menu_view_styles.tar:
|
||||
! $(VERBOSE)cd $(PRG_DIR); tar cf $(PWD)/bin/$@ styles
|
||||
|
||||
_Thanks to Tomasz Gajewski for this welcome contribution._
|
||||
|
||||
671
doc/release_notes/21-08.txt
Normal file
671
doc/release_notes/21-08.txt
Normal file
@@ -0,0 +1,671 @@
|
||||
|
||||
|
||||
===============================================
|
||||
Release notes for the Genode OS Framework 21.08
|
||||
===============================================
|
||||
|
||||
Genode Labs
|
||||
|
||||
|
||||
|
||||
Genode 21.08 puts device drivers into the spotlight. It attacks the costs of
|
||||
porting drivers from the Linux kernel and takes a leap forward with respect to
|
||||
GPU support. This low-level work is complemented by several topics that
|
||||
contribute to our vision of hosting video-conferencing scenarios natively on
|
||||
Genode.
|
||||
|
||||
For those of you who follow Genode's release notes over the years, the
|
||||
so-called DDE-Linux is a recurring topic. DDE is short for device-driver
|
||||
environment and denotes our principal approach of running unmodified Linux
|
||||
device-driver code inside Genode components. For over a decade, we iterated
|
||||
many times to find a sustainable and scalable solution for satisfying Genode's
|
||||
driver needs. Thanks to this enduring work, Genode enjoys support for modern
|
||||
hardware such as Intel wireless chips or Intel graphics devices. However, when
|
||||
looking beyond PC hardware, in particular at the plethora of ARM SoCs as
|
||||
potential target platforms for Genode, we found our existing DDE-Linux
|
||||
approach increasingly prohibitive because the investment of manual labour per
|
||||
driver would become unbearable. It was time to recollect, draw from our
|
||||
collective experience gathered over the past years, and re-envision what
|
||||
DDE-Linux could be. Section [Linux-device-driver environment re-imagined]
|
||||
presents the results of this recent line of development that promises to dwarf
|
||||
the costs of driver-porting work compared to our time-tested approach. The
|
||||
results have an immediate impact on our ambition to bring Genode to the
|
||||
Pinephone as our added network and framebuffer drivers for the Allwinner A64
|
||||
SoC leverage the new DDE already.
|
||||
|
||||
The challenge of using hardware-accelerated graphics (GPUs) on Genode makes a
|
||||
guest appearance in the release notes on-and-off since version
|
||||
[https://genode.org/documentation/release-notes/10.08#Gallium3D_and_Intel_s_Graphics_Execution_Manager - 10.08].
|
||||
However, until now, GPU support has not become a commodity for Genode yet.
|
||||
With the work presented in Section [Advancing GPU driver stack], we hope to
|
||||
change that. For the first time, we identified a clear path to the
|
||||
architectural integration of GPU support in sophisticated Genode scenarios
|
||||
such as Sculpt OS. This outlook prompted us to revive the GPU stack in a
|
||||
holistic way, including our custom Intel GPU multiplexer as well as the Mesa
|
||||
stack.
|
||||
|
||||
Further highlights of the current release are an improved and updated version
|
||||
of VirtualBox 6, refined user-level networking, the maturing integration with
|
||||
host file systems when running Genode on top of Linux, and new media-playback
|
||||
capabilities for our port of the Chromium web engine.
|
||||
|
||||
|
||||
Linux-device-driver environment re-imagined
|
||||
###########################################
|
||||
|
||||
Over more than a decade, the domestication of Linux device drivers for Genode
|
||||
has evolved into a quest of almost epic proportions. This long-winded story
|
||||
has been covered by a recent series of Genodians articles
|
||||
([https://genodians.org/skalk/2021-04-06-dde-linux-experiments - first],
|
||||
[https://genodians.org/skalk/2021-04-08-dde-linux-experiments-1 - second],
|
||||
[https://genodians.org/skalk/2021-06-21-dde-linux-experiments-2 - third]),
|
||||
which also goes into a technical deep dive of our recent developments.
|
||||
|
||||
On the one hand, we draw an enormous value from the device drivers of the
|
||||
Linux kernel. Genode would be nowhere as useful without the Intel wireless
|
||||
stack, USB host-controller drivers, or the Intel graphics driver that we
|
||||
ported over from Linux. On the other hand, those porting efforts are draining
|
||||
a lot of our energy. Linux kernel code is not designed for microkernel-based
|
||||
systems after all. Consequently, the transplantation of such code does not
|
||||
only require a solid understanding of Linux kernel internals, but also ways to
|
||||
overcome the friction between two radically different operating-system-design
|
||||
schools (monolithic and component-based) and friction between implementation
|
||||
languages (C and C++).
|
||||
|
||||
Even though we are not short of evidence of successful driver ports, we are
|
||||
very well aware of several elephants in the room:
|
||||
|
||||
Economically, each driver port must be understood as a distinct project of
|
||||
non-trivial costs. E.g., the port of the i.MX8 graphics driver took us two
|
||||
months. That's certainly minuscule compared to a driver written from scratch.
|
||||
But it is still expensive and we feel that those expenses hold us back.
|
||||
|
||||
Second, once ported, later updates of drivers to a new kernel version are
|
||||
costly and risky. But such updates are unavoidable to keep up with new
|
||||
hardware. The larger the arsenal of device drivers, the bigger this problem
|
||||
becomes.
|
||||
|
||||
Third, the skill set of the porting work is the cross point of Linux kernel
|
||||
competence and Genode competence. In other words, it's rare. To make Genode
|
||||
compatible to a broader spectrum of hardware in the long run, driver porting
|
||||
must become an easily attainable skill rather than black art.
|
||||
|
||||
With the current release, we introduce a vastly improved approach to the reuse
|
||||
of Linux device drivers on Genode. It entails three aspects:
|
||||
|
||||
:Code: Reusable building blocks for crafting custom runtime environments
|
||||
to bring Linux kernel code to fly, and for interfacing Genode's session
|
||||
interfaces with Linux kernel interfaces.
|
||||
|
||||
:Tooling: A custom tool set that automates repetitive work such as generating
|
||||
dummy implementations of Linux kernel functions.
|
||||
|
||||
:Methodology: Consistent patterns and exemplary test scenarios serving as
|
||||
guiding rails for the development work.
|
||||
|
||||
The following illustration maps out the first aspect, the various pieces of
|
||||
code involved in hosting unmodified Linux driver code on Genode.
|
||||
The clear separation of those parts reinforces a degree of formalism - in
|
||||
particular about separating C and C++ - that was absent in our previous takes.
|
||||
|
||||
[image dde_linux_parts]
|
||||
|
||||
A driver is a Genode component. So the outer border of the picture is Genode's
|
||||
bare-bones C++ API. At the lower end, the API provides access to device
|
||||
resources such as interrupts and memory-mapped device registers. At the higher
|
||||
end, the API allows the driver to play the role of a service for other
|
||||
components through one of Genode's session interfaces.
|
||||
|
||||
The lower (blueish) part of the picture is concerned with the runtime
|
||||
environment needed to make the Linux kernel code feel right at home. The gap
|
||||
between Genode's API and Linux kernel interfaces is closed in two steps.
|
||||
First, the so-called *lx_kit* library implements handy mechanisms for building
|
||||
the meaty parts of the runtime in C++. For example, it provides a user-level
|
||||
task scheduling model that satisfies the semantic needs of Linux. The lx_kit
|
||||
is located at _dde_linux/src/include/lx_kit_ and _dde_linux/src/lib/lx_kit/_
|
||||
|
||||
Second, the *lx_emul* (short for Linux emulation) code wraps the lx_kit
|
||||
functionality into C interfaces. The functions of those interfaces are
|
||||
prefixed with 'lx_emul_' and serve as basic primitives for re-implementing
|
||||
(parts of) the original Linux kernel-internal ABI. Although the previous
|
||||
version of DDE Linux already featured the principle lx_kit and lx_emul
|
||||
fragments, the new design applies the underlying idea much more stringent,
|
||||
fostering the almost galvanic separation between C and C++ code. In
|
||||
particular, C++ code never includes any Linux headers. The lx_emul code also
|
||||
comprises driver-specific dummy implementations of unused kernel functions.
|
||||
The handy tool at _tool/dde_linux/create_dummies_ automates the creation of
|
||||
those dummy implementations now. Finally, the lx_emul code drives the startup
|
||||
of the Linux kernel code by executing initcalls in the correct order. The
|
||||
reusable building blocks of lx_emul are located at
|
||||
_dde_linux/src/include/lx_emul/_ and _dde_linux/src/lib/lx_emul/_
|
||||
|
||||
When looking from the upper (greenish) end, the *genode_c_api* library is a
|
||||
thin wrapper around Genode's session interfaces. It enables C code to
|
||||
implement a Genode service such as block driver or network driver. The
|
||||
genode_c_api library is located at _os/include/genode_c_api/_ and
|
||||
_os/src/lib/genode_c_api/_.
|
||||
|
||||
The red area contains sole C code, most of which is unmodified Linux kernel
|
||||
code. It is supplemented with a small *lx_user* part that uses both the
|
||||
genode_c_api as well as Linux kernel interfaces to connect the unmodified
|
||||
Linux kernel code with the Genode universe.
|
||||
|
||||
We address the second aspect - the tooling - by the growing tool set at
|
||||
_tool/dde_linux/_. The biggest time saver is the _create_dummies_ tool, which
|
||||
automates the formerly manual task of implementing dummy functions to quickly
|
||||
attain a linkable binary. It is complemented with the _extract_initcall_order_
|
||||
tool, which supplements lx_emul with the information needed to perform all
|
||||
Linux initialization steps in the exact same order as a Linux kernel would do.
|
||||
|
||||
The third aspect - the methodology - is embodied in two source-code
|
||||
repositories that leverage the new DDE-Linux approach for two distinct ARM
|
||||
SoCs, namely i.MX8MQ and Allwinner A64.
|
||||
|
||||
:Genode support for i.MX8MQ SoC:
|
||||
|
||||
[https://github.com/skalk/genode-imx8mq]
|
||||
|
||||
:Genode support for Allwinner A64 SoC:
|
||||
|
||||
[https://github.com/nfeske/genode-allwinner]
|
||||
|
||||
The most pivotal methodological change is the way how we deal with the
|
||||
Linux-internal API now. In our previous work, we used to mimic the content of
|
||||
kernel headers by a custom-tailored emulation header _lx_emul.h_ per driver.
|
||||
Whereas these driver-specific API flavors catered our urge to keep transitive
|
||||
code complexity at bay, they required significant and boring manual labour.
|
||||
Now we changed our minds to reusing the original Linux headers, thereby
|
||||
greatly reducing the amount of repetitive work while reducing the likelihood
|
||||
for subtle bugs.
|
||||
|
||||
|
||||
Success stories
|
||||
---------------
|
||||
|
||||
Both repositories linked above employ the re-imagined DDE-Linux approach to
|
||||
resounding success. The i.MX8MQ repository features drivers for framebuffer
|
||||
output and SD-card access,
|
||||
[https://genodians.org/skalk/2021-08-02-mnt-reform2-sdcard - targeting the MNT Reform laptop].
|
||||
The Allwinner repository contains a network driver for the Pine-A64-LTS board
|
||||
and a new framebuffer driver for the Pinephone. No single line of Linux code
|
||||
had to be changed.
|
||||
|
||||
We found that the development of those driver components took only a fraction
|
||||
of time compared to our past experiences. The most unnerving aspects of the
|
||||
driver porting work have simply vanished: Subtle incompatibilities between C
|
||||
and C++ are ruled out by design now. The hunt for missing initcalls is no
|
||||
more. No dummy function must be written by hand. The compilation of arbitrary
|
||||
Linux compilation units works instantly without manual labour.
|
||||
This - in turn - brings the experimental addition or removal of kernel
|
||||
subsystems down from hours to seconds, turning the development work into an
|
||||
exploratory experience.
|
||||
|
||||
That said, it is not all roses. Components based on Linux drivers have to
|
||||
carry substantial Linux-specific bureaucracy along with them. The resulting
|
||||
components tend to be somewhat obese given their relatively narrow purpose.
|
||||
E.g., the executable binary of the framebuffer driver for the Pinephone is
|
||||
1.5 MiB in size, most of which is presumably dead weight.
|
||||
|
||||
|
||||
Transition
|
||||
----------
|
||||
|
||||
Our existing and time-tested Linux-based drivers located in the _dde_linux_
|
||||
repository have remained untouched by the current release.
|
||||
We plan to successively update or replace those drivers using the new
|
||||
approach. Until then, the original components refer to the old approach as
|
||||
"legacy". E.g., the former implementation of lx_emul has been moved to
|
||||
_dde_linux/src/include/legacy/lx_emul/_.
|
||||
|
||||
|
||||
Advancing GPU driver stack
|
||||
##########################
|
||||
|
||||
With release 21.08, we take a major leap towards 3D and GPU support on Genode.
|
||||
This topic has been on the slow burner for a while now and we were happy to be
|
||||
able to finally revive this topic. On the Mesa front, we conducted an update
|
||||
to version 21.0.0 (Section [Mesa update]), while adding more features and new
|
||||
platforms to our
|
||||
[https://genode.org/documentation/release-notes/17.08 - Intel GPU multiplexer].
|
||||
On Intel platforms, there exists no hardware distinction between the display
|
||||
controller and 3D acceleration, as both functions are provided by the GPU.
|
||||
Other platforms, e.g. ARM based SoCs, often contain a separate display and a
|
||||
GPU device, making it possible to isolate display configuration within a
|
||||
separate driver. Therefore, we are glad to report that we found a solution on
|
||||
how to separate display and 3D acceleration on Intel systems.
|
||||
|
||||
|
||||
Mesa update
|
||||
-----------
|
||||
|
||||
Genode's port of the
|
||||
[https://www.mesa3d.org - Mesa 3D graphics library] dates back to version
|
||||
11.2.2 that was released in 2016 while the current version is past 21 by now.
|
||||
Because of this version gap, we decided to start with a fresh port of Mesa
|
||||
instead of solely updating from version 11. The more recent version enabled us
|
||||
to switch from Mesa's DRI drivers (i965) to the
|
||||
[https://de.wikipedia.org/wiki/Gallium3D - Gallium] version (Iris) for Intel
|
||||
GPUs.
|
||||
[https://xdc2018.x.org/slides/optimizing-i965-for-the-future.pdf - Iris]
|
||||
is Intel's redesigned version of the dated i965 driver that aims to lower CPU
|
||||
usage and improved performance. It is the only driver that supports Gen 12
|
||||
(Intel's current Xe GPU architecture) while also removing support for old
|
||||
Intel generations. As Genode supports Gen 8 (Broadwell) platforms only, we
|
||||
felt that Iris is the driver of choice for the future.
|
||||
|
||||
|
||||
GPU multiplexer improvements
|
||||
----------------------------
|
||||
|
||||
The GPU multiplexer received stability improvements, new features required by
|
||||
Mesa's Iris driver, i.e. context isolation and sync objects, and bug fixes
|
||||
prompted by supporting newer GPU generations. These generations include Gen 9
|
||||
(Skylake) and Gen 9.5 (Kaby Lake), with more versions to come. Please note
|
||||
that this line of work is not finished and is as of now in a preliminary state
|
||||
with ongoing efforts.
|
||||
|
||||
|
||||
The GPU multiplexer as a platform service
|
||||
-----------------------------------------
|
||||
|
||||
As stated at the beginning of this chapter, Intel PC platforms have no
|
||||
distinction between the display device and the 3D rendering. Both functions
|
||||
are integrated into the GPU as display engine and render engine. This implies
|
||||
that Genode's Intel framebuffer/display driver has to share resources with the
|
||||
GPU multiplexer. The co-location of both drivers in one component, however,
|
||||
violates Genode's core principle of a minimally-complex trusted computing
|
||||
base. Whereas the complex display driver should best be a disposable component
|
||||
([https://fosdem.org/2021/schedule/event/microkernel_pluggable_device_drivers_for_genode/ - FOSDEM talk]),
|
||||
the GPU driver must ideally be realized as a low-complexity resource
|
||||
multiplexer.
|
||||
|
||||
We eventually found a way to solve this contradiction: On Genode, each driver
|
||||
requests the hardware resources to program a device from the platform driver
|
||||
via the platform session. As these resources cannot be shared, we came up with
|
||||
the idea that the GPU multiplexer requests all GPU resources and itself
|
||||
provides a platform service for the display driver. It hands out the subset of
|
||||
resources that are related to display handling and forwards display
|
||||
interrupts. This approach is completely transparent to Genode's Intel display
|
||||
driver.
|
||||
|
||||
[image gpu_architecture]
|
||||
System integration of the GPU driver/multiplexer and the framebuffer driver
|
||||
as distinct components
|
||||
|
||||
We already have implemented this solution for Gen 8 and are working on newer
|
||||
generations.
|
||||
|
||||
|
||||
Future prospects
|
||||
----------------
|
||||
|
||||
In the current state, we are still working on newer Intel (Gen9+) GPU support
|
||||
and are planning to integrate this line of work into Sculpt release 21.09 with
|
||||
a small demo scenario (e.g., [https://github.com/glmark2/glmark2 - Glmark2]
|
||||
that is now available in Genode world).
|
||||
|
||||
Additionally, there is ongoing work to support
|
||||
[https://www.verisilicon.com/en/IPPortfolio/VivanteGPUIP - Vivante] GPUs as
|
||||
utilized by i.MX SoCs. As of now Mesa's etnaviv driver is included in our
|
||||
Mesa update and a GPU multiplexer component based on the Linux DRM driver is
|
||||
available as a preview on
|
||||
[https://github.com/cnuke/genode/commits/21.08-etnaviv - this] topic branch.
|
||||
|
||||
|
||||
Base framework and OS-level infrastructure
|
||||
##########################################
|
||||
|
||||
Revised cache-maintenance interface
|
||||
===================================
|
||||
|
||||
The base library used to expose a single cache-maintenance function to
|
||||
user-level components, namely 'cache_coherent'. It is primarily needed to
|
||||
accommodate self-modifying code, e.g., for JIT compilers, to write back
|
||||
data-cache lines, and invalidate the corresponding instruction-cache lines.
|
||||
However, we found that the proper support for cached DMA buffers in Linux
|
||||
device-driver ports calls for two additional semantic flavours.
|
||||
|
||||
One is needed whenever driver code initially writes data to a DMA buffer
|
||||
before handing over the buffer to the device. Linux driver code usually issues
|
||||
a 'dma_map_*' call in this case to ensure that data gets written out to memory
|
||||
and the data cache is invalidated. This scenario is now covered by the new
|
||||
'cache_clean_invalidate_data' function.
|
||||
|
||||
The other flavor is needed to invalidate data-cache lines before reading
|
||||
device-generated content from a DMA buffer. Linux driver code usually calls a
|
||||
'dma_unmap_*' function in this case. This case is now covered by the new
|
||||
'cache_invalidate_data' function.
|
||||
|
||||
Both functions are provided for the base-hw and Fiasco.OC kernels on the ARM
|
||||
architecture.
|
||||
|
||||
|
||||
Improved host file-system access on Genode/Linux
|
||||
================================================
|
||||
|
||||
Genode has included a component for host file-system access on Linux for
|
||||
years, but the state of the implementation and the feature set limited its
|
||||
application to mere debugging or development scenarios. This release improves
|
||||
*lx_fs* in certain areas to permit common use cases and scenarios.
|
||||
|
||||
First, the file-system server gets support for the unlinking of files, which
|
||||
was left out in the past to prevent accidental deletion of files on the host.
|
||||
The current version includes a robust implementation of the feature, which is
|
||||
confined to the configured sub-directory.
|
||||
Further, sessions track client-specific consumption of resources (namely RAM
|
||||
and capabilities) and also support dynamic resource upgrades. Last, we added
|
||||
file-watching support to lx_fs, which enables monitoring files for changes
|
||||
based on the inotify interface of the Linux kernel. The implementation is
|
||||
prepared to handle bursts of changes by limiting the rate of notifications to
|
||||
the client.
|
||||
|
||||
These improvements were contributed by Pirmin Duss.
|
||||
|
||||
|
||||
New black-hole component
|
||||
========================
|
||||
|
||||
A commonly requested feature for Sculpt OS is that it would be nice to have
|
||||
the ability to wire up various sessions of a deployed component to a dummy
|
||||
version of the required service. This way, the user could easily start an
|
||||
application that would normally require, for example, an audio-out session but
|
||||
connect it to a "black hole" component that simply drops all audio data. This
|
||||
would be especially useful if no hardware driver for a specific device is
|
||||
available on a particular platform, but would also allow for more fine-grained
|
||||
privacy control.
|
||||
|
||||
For this release, we created a first version of the black-hole component,
|
||||
which provides a dummy implementation of the audio-out session when enabled in
|
||||
the configuration:
|
||||
|
||||
! <config>
|
||||
! <audio_out/>
|
||||
! </config>
|
||||
|
||||
More session types are intended to be added in future releases.
|
||||
|
||||
|
||||
NIC router
|
||||
==========
|
||||
|
||||
With this release, the NIC router receives an enhancement of its feature for
|
||||
forwarding DNS configurations via DHCP, a sensible way of dealing with
|
||||
fragmented IPv4 packets, and some minor cleanups regarding its configuration
|
||||
interface. The update changes the configuration interface of the NIC router in
|
||||
a non-compatible way. Hence, systems that integrate the router might require
|
||||
adaptation. At the end of this section, you can find an overview of how to
|
||||
adapt systems properly.
|
||||
|
||||
The NIC router now interprets the IPv4 flags "More Fragments" and "Fragment
|
||||
Offset" in order to determine whether an IPv4 packet is fragmented or not.
|
||||
Fragmented packets are dropped safely while the unfragmented ones are routed
|
||||
as usual. The decision to drop fragmented packets by default is the result of
|
||||
a long discussion among users and developers of the NIC router. That
|
||||
discussion came to the conclusion that the complexity overhead and security
|
||||
risks of routing fragmented IPv4 outrun its relevance in modern world
|
||||
networks. Therefore, we assume that for the common user of the router, a
|
||||
simple rejection of fragmented IPv4 is the better deal.
|
||||
|
||||
The consideration of IPv4 fragmentation is accompanied by several ways of
|
||||
communicating the router's decision to drop fragmented packets. If the config
|
||||
flag 'verbose_packet_drop' is set, the router prints a message "drop packet
|
||||
(fragmented IPv4 not supported)" for each dropped fragment to the log. If the
|
||||
new attribute 'dropped_fragm_ipv4' in the config tag '<report>' is set, the
|
||||
router will report the number of packets dropped due to fragmentation. Last
|
||||
but not least, the NIC router can also be instructed to inform the sender of a
|
||||
dropped IPv4 fragment by sending an ICMP "destination unreachable" reply. Like
|
||||
the other feedback mechanisms, this is deactivated by default and can be
|
||||
activated by setting the new config attribute 'icmp_type_3_code_on_fragm_ipv4'.
|
||||
The attribute must be set to a valid ICMP code number that is then used for
|
||||
the replies.
|
||||
|
||||
The run script 'nic_router_ipv4_fragm' demonstrates the router's behavior
|
||||
regarding fragmented IPv4.
|
||||
|
||||
For many years, the DHCP server of the NIC router is capable of sending DNS
|
||||
configuration attributes with its replies. At first, this was only a single
|
||||
DNS server address. With
|
||||
[https://genode.org/documentation/release-notes/21.02#NIC_router - Genode 21.02],
|
||||
this has been extended to a list of DNS server addresses. Sending such address
|
||||
lists has now been made more conforming to the RFCs in that the server will
|
||||
list them all in one option 6 field instead of adding one option 6 field per
|
||||
address. Consequently, the DHCP client of the router now also considers only
|
||||
the first option 6 field of a reply but may parse multiple addresses from it.
|
||||
|
||||
Another new feature is that the DHCP client of the router now remembers the
|
||||
domain name (option 15) of a DHCP reply that leads to an IPv4 configuration.
|
||||
Analogously, the DHCP server will send a domain name with DHCP replies if such
|
||||
a name is at hand. As with DNS server addresses, the DHCP server can obtain
|
||||
the domain name either statically through its configuration (new config tag
|
||||
'<dns-domain>') or dynamically from the results of a DHCP client of another
|
||||
domain. The latter is achieved by setting the new config attribute
|
||||
'dns_config_from' that replaces the former attribute 'dns_server_from'. If
|
||||
'dns_config_from' is set to the name of another domain, the DHCP server will
|
||||
use both the DNS server addresses and the DNS domain name of the domain.
|
||||
|
||||
DNS domain names that were stored with a dynamic IPv4 configuration in the
|
||||
router are also reported via the new report tag '<dns-domain>' whenever the
|
||||
'config' attribute in the config tag '<report>' is set. As with DNS server
|
||||
addresses, this allows for manual forwarding and filtering through individual
|
||||
management components (see
|
||||
[https://genode.org/documentation/release-notes/21.02#NIC_router - Genode 21.02]).
|
||||
|
||||
As a delayed adaption to the
|
||||
[https://genode.org/documentation/release-notes/21.02#Pluggable_network_device_drivers - introduction of the Uplink session]
|
||||
two Genode releases ago, the term "Uplink", that was used in combination with
|
||||
the NIC router to refer to NIC sessions that the router requested itself, has
|
||||
been re-named more accurately to "NIC client". This is meant to prevent
|
||||
confusion with the new session type and, most notable to users, implies that
|
||||
the tag '<uplink>' in router configurations got re-named to '<nic-client>'.
|
||||
|
||||
|
||||
How to adjust Genode 21.05 systems to the new NIC router
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* At each occurrence of the '<uplink ...>' tag in a NIC router configuration,
|
||||
replace the tag name 'uplink' with 'nic-client'. The rest of the tag stays
|
||||
the same. This does not yield any semantic changes.
|
||||
|
||||
* At each occurrence of the 'dns_server_from' attribute in a NIC router
|
||||
configuration, replace the attribute name with 'dns_config_from'. The
|
||||
attribute value remains unaltered. Be aware that this will add forwarding of
|
||||
DNS domain names to your system. Forwarding DNS server addresses but not DNS
|
||||
domain names is not supported anymore.
|
||||
|
||||
|
||||
RAM framebuffer driver for Qemu
|
||||
===============================
|
||||
|
||||
During graphical application development on ARMv8, it became obvious that
|
||||
Genode still lacked framebuffer-driver support on Qemu for ARMv8, thus
|
||||
rendering test execution on real hardware mandatory. In order to speedup test
|
||||
and development time for graphical applications, we enabled RAM framebuffer
|
||||
support for the "virt_qemu" board by adding a 'driver_interactive-virt_qemu'
|
||||
package. The package contains a 'ram_fb_drv' that configures a RAM framebuffer
|
||||
through Qemu's firmware interface and uses the capture session interface to
|
||||
provide access to the framebuffer.
|
||||
|
||||
To test drive the driver, you can execute any Genode run script that requires
|
||||
graphical applications. The following example shows how to execute the demo
|
||||
run script in Qemu:
|
||||
|
||||
* In _<genode_dir>/build/arm_v8a/etc/build.conf_ change
|
||||
! # use time-tested graphics backend
|
||||
! QEMU_OPT += -display sdl
|
||||
|
||||
to
|
||||
|
||||
! QEMU_OPT += -device ramfb
|
||||
|
||||
* In _<genode_dir>/build/arm_v8a_ execute
|
||||
! make KERNEL=hw BOARD=virt_qemu run/demo
|
||||
|
||||
|
||||
Sandbox API
|
||||
===========
|
||||
|
||||
When using [https://github.com/nfeske/goa - Goa], we noticed that using the os
|
||||
API caused binaries to be always linked against 'sandbox.lib.so' because its
|
||||
symbols were part of the api archive as well. We therefore decided to separate
|
||||
the sandbox API from the os API by moving the header files to
|
||||
_repos/os/include/sandbox/_ and providing them in a distinct api archive along
|
||||
with the library symbols.
|
||||
|
||||
|
||||
Libraries and applications
|
||||
##########################
|
||||
|
||||
Updated and improved VirtualBox
|
||||
===============================
|
||||
|
||||
Our ongoing development efforts with VirtualBox 6.1 extended the
|
||||
implementation in various aspects. With this release, we updated the version
|
||||
to 6.1.26 published in July to stay in sync with upstream developments. This
|
||||
version especially improves the audio back end for the OSS interface and
|
||||
graphics.
|
||||
|
||||
On the integration side, VirtualBox 6 now supports dynamic framebuffer
|
||||
resolutions and the capslock ROM mode. The latter is important to provide the
|
||||
user a consistent system-wide capslock state, which is controlled by a global
|
||||
capslock ROM and virtual KEY_CAPSLOCK events forwarded to guest operating
|
||||
systems. Per default, a raw mode is used and capslock input events are sent
|
||||
unfiltered to the guest. For ROM mode, VirtualBox may be configured like
|
||||
follows.
|
||||
|
||||
!<config capslock="rom">
|
||||
|
||||
The network-device model in VirtualBox 5 uses the MAC address from the
|
||||
connected NIC session. We added this behavior also to VirtualBox 6. During the
|
||||
past months, we also observed significant performance issues with the AHCI
|
||||
model, which we address in this release. The background is that our port of
|
||||
VirtualBox 6 limits changes to the original code and execution model to a bare
|
||||
minimum. This renders updates of the upstream version less expensive, but on
|
||||
the other hand, uncovers some inherent assumptions about the runtime behavior
|
||||
(i.e., scheduling of threads) in the original implementation that must be
|
||||
addressed.
|
||||
|
||||
|
||||
Qt5 and QtWebEngine
|
||||
===================
|
||||
|
||||
In this release, we enabled SSL server certificate validation and support for
|
||||
multimedia playback in our ports of QtWebEngine and the Falkon web browser.
|
||||
|
||||
More specifically, we ported the 'nss' library for the SSL certificate
|
||||
validation and the 'sndio' library as back end for the audio playback
|
||||
functionality and enhanced our OSS audio VFS plugin accordingly.
|
||||
|
||||
The following screenshot shows an example use case of Falkon as a private
|
||||
multimedia browser, which stores all session data, like cookies, in RAM only.
|
||||
In the future, we also want to enable support for multimedia input and,
|
||||
consequently, private video conferences.
|
||||
|
||||
[image falkon_youtube]
|
||||
|
||||
|
||||
Modular integration of LTE modem stack in Sculpt OS
|
||||
===================================================
|
||||
|
||||
In version [https://genode.org/documentation/release-notes/21.02#LTE_modem_stack - 21.02],
|
||||
we announced the LTE modem support as a prerequisite for using Genode on the
|
||||
Pinephone. Since most of our development laptops also come with LTE modems or
|
||||
an extension slot for installing one, we explored ways to augment the Sculpt
|
||||
scenario with mobile networking on demand, i.e., by the installation of
|
||||
additional components. The result is documented by means of an
|
||||
[https://genodians.org/jschlatow/2021-07-21-mobile-network - article on genodians.org].
|
||||
|
||||
|
||||
Webcam improvements using libuvc
|
||||
================================
|
||||
|
||||
With webcam support added by the previous release, we discovered some
|
||||
complications with devices that implement the UVC spec in version 1.5. We
|
||||
found one of those devices in a Thinkpad T490s. Since
|
||||
[https://ken.tossell.net/libuvc/doc - libuvc] did not fully implement this
|
||||
version of the spec, we added a patch for this. The main issue was the
|
||||
different size of the video probe and commit control messages. Interestingly,
|
||||
the problematic device is quite picky in this regard and only responds when
|
||||
the size was set correctly. In connection with this, we fixed a bug in our
|
||||
[https://libusb.info - libusb] back end, which caused the size of USB control
|
||||
messages being wrongly calculated.
|
||||
|
||||
Apart from these device-specific issues, the webcam driver now enables auto
|
||||
exposure in order to adapt to different lighting conditions.
|
||||
|
||||
|
||||
Sndio audio library
|
||||
===================
|
||||
|
||||
To complement the VFS OSS-plugin introduced in release
|
||||
[https://genode.org/documentation/release-notes/20.11 - 20.11], we ported the
|
||||
[https://sndio.org - sndio] library to Genode. It contains an OSS back end
|
||||
that prompted us to broaden the functionality of our VFS plugin to satisfy
|
||||
the requirements of the library. This is in line with the envisioned plan to
|
||||
extend the OSS plugin incrementally to cover more use cases.
|
||||
|
||||
The sndio framework features a server component besides the library but for
|
||||
the moment, we focus solely on using sndio in a client context. Here the
|
||||
component, e.g., cmus and Falkon, uses the library to access the sound device
|
||||
directly.
|
||||
|
||||
|
||||
Build system and tools
|
||||
######################
|
||||
|
||||
Tool-chain support for RISC-V
|
||||
=============================
|
||||
|
||||
As one might have noticed, Genode's RISC-V tool chain is absent in tool-chain
|
||||
release
|
||||
[https://sourceforge.net/projects/genode/files/genode-toolchain/21.05/genode-toolchain-21.05-x86_64.tar.xz/download - 21.05]
|
||||
because it still had issues at the release time. These issues, namely the
|
||||
problem of the dynamic linker's self relocation during program startup have
|
||||
been resolved during this release cycle. The RISC-V tool chain can now be
|
||||
built manually using Genode's regular 'tool_chain' script:
|
||||
|
||||
! <genode-dir>/tool/tool_chain riscv ENABLE_FEATURES="c c++ gdb"
|
||||
|
||||
|
||||
Run tool
|
||||
========
|
||||
|
||||
Genode's custom workflow automation tool called 'run' received the following
|
||||
enhancements.
|
||||
|
||||
To ease the hosting of driver packages outside of Genode's main repository -
|
||||
an emerging pattern for supporting new SoCs - we replaced the formerly
|
||||
built-in names of board-specific 'drivers_nic' and 'drivers_interactive' depot
|
||||
packages by the convention of appending the board name as a suffix, e.g.,
|
||||
'drivers_nic-pine_a64lts'. Hence, new hardware support can now be added
|
||||
without touching the run tool.
|
||||
|
||||
The ARM fastboot plugin can now be used on 64-bit ARM platforms in addition to
|
||||
32-bit ARM. Its formerly mandatory parameter '--load-fastboot-device' has
|
||||
become optional and can be omitted if only one device is present.
|
||||
|
||||
A new _image/uboot_fit_ plugin enables the use of U-Boot's new FIT (flattened
|
||||
image tree) image format (carrying the extension 'itb'), which supersedes the
|
||||
uImage format. The new format simplifies the booting of a Linux system, which
|
||||
typically requires not only a kernel image but also a device-tree binary and a
|
||||
RAM disk. A FIT image combines all ingredients into a single file and adds
|
||||
some metadata like checksums. Note, however, that booting an _image.itb_,
|
||||
which doesn't contain a device-tree binary may cause U-Boot's 'bootm' command
|
||||
to fail. A workaround for this is to execute the individual boot steps
|
||||
separately, which skips the Linux-specific preparatory steps that depend on
|
||||
the device-tree binary:
|
||||
|
||||
! bootm start
|
||||
! bootm loados
|
||||
! bootm go
|
||||
|
||||
|
||||
Removal of deprecated components
|
||||
################################
|
||||
|
||||
In the release notes of version
|
||||
[https://genode.org/documentation/release-notes/20.11#Retiring_the_monolithic_USB_driver - 20.11],
|
||||
we announced the retirement of our traditional monolithic USB-driver
|
||||
component, which used to combine host-controller drivers together with USB
|
||||
storage, HID, and networking drivers in a single component. With the current
|
||||
release, we ultimately completed the transition to our multi-component USB
|
||||
stack and removed the deprecated monolithic USB driver.
|
||||
@@ -1 +1 @@
|
||||
2021-03-11 d5d038d82badefdb0ec442be4dc7b23064ad2831
|
||||
2021-08-28 eec6b1e516691434c54196615af980b54428eb7e
|
||||
|
||||
@@ -17,7 +17,6 @@
|
||||
/* Genode includes */
|
||||
#include <base/cache.h>
|
||||
#include <base/ipc.h>
|
||||
#include <base/stdint.h>
|
||||
#include <base/native_capability.h>
|
||||
#include <util/touch.h>
|
||||
|
||||
@@ -26,67 +25,12 @@
|
||||
|
||||
/* core includes */
|
||||
#include <util.h>
|
||||
#include <mapping.h>
|
||||
|
||||
/* L4/Fiasco includes */
|
||||
#include <fiasco/syscall.h>
|
||||
|
||||
namespace Genode {
|
||||
|
||||
class Mapping;
|
||||
class Ipc_pager;
|
||||
}
|
||||
|
||||
|
||||
class Genode::Mapping
|
||||
{
|
||||
private:
|
||||
|
||||
addr_t _dst_addr;
|
||||
Fiasco::l4_fpage_t _fpage;
|
||||
|
||||
public:
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
Mapping(addr_t dst_addr, addr_t src_addr,
|
||||
Cache_attribute cacheability, bool,
|
||||
unsigned l2size, bool rw, bool)
|
||||
:
|
||||
_dst_addr(dst_addr),
|
||||
_fpage(Fiasco::l4_fpage(src_addr, l2size, rw, false))
|
||||
{
|
||||
if (cacheability == WRITE_COMBINED)
|
||||
_fpage.fp.cache = Fiasco::L4_FPAGE_BUFFERABLE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct invalid flexpage
|
||||
*/
|
||||
Mapping() : _dst_addr(0), _fpage(Fiasco::l4_fpage(0, 0, 0, 0)) { }
|
||||
|
||||
Fiasco::l4_umword_t dst_addr() const { return _dst_addr; }
|
||||
Fiasco::l4_fpage_t fpage() const { return _fpage; }
|
||||
|
||||
/**
|
||||
* Prepare map operation
|
||||
*
|
||||
* On Fiasco, we need to map a page locally to be able to map it to
|
||||
* another address space.
|
||||
*/
|
||||
void prepare_map_operation()
|
||||
{
|
||||
addr_t core_local_addr = _fpage.fp.page << 12;
|
||||
size_t mapping_size = 1 << _fpage.fp.size;
|
||||
|
||||
for (addr_t i = 0; i < mapping_size; i += L4_PAGESIZE) {
|
||||
if (_fpage.fp.write)
|
||||
touch_read_write((unsigned char volatile *)(core_local_addr + i));
|
||||
else
|
||||
touch_read((unsigned char const volatile *)(core_local_addr + i));
|
||||
}
|
||||
}
|
||||
};
|
||||
namespace Genode { class Ipc_pager; }
|
||||
|
||||
|
||||
class Genode::Ipc_pager
|
||||
|
||||
@@ -29,6 +29,26 @@ using namespace Genode;
|
||||
using namespace Fiasco;
|
||||
|
||||
|
||||
/**
|
||||
* Prepare map operation
|
||||
*
|
||||
* On Fiasco, we need to map a page locally to be able to map it to another
|
||||
* address space.
|
||||
*/
|
||||
void Mapping::prepare_map_operation() const
|
||||
{
|
||||
addr_t const core_local_addr = src_addr;
|
||||
size_t const mapping_size = 1UL << size_log2;
|
||||
|
||||
for (addr_t i = 0; i < mapping_size; i += L4_PAGESIZE) {
|
||||
if (writeable)
|
||||
touch_read_write((unsigned char volatile *)(core_local_addr + i));
|
||||
else
|
||||
touch_read((unsigned char const volatile *)(core_local_addr + i));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/***************
|
||||
** Ipc_pager **
|
||||
***************/
|
||||
@@ -51,11 +71,13 @@ void Ipc_pager::wait_for_fault()
|
||||
|
||||
void Ipc_pager::reply_and_wait_for_fault()
|
||||
{
|
||||
l4_msgdope_t result;
|
||||
l4_fpage_t const fpage { l4_fpage(_reply_mapping.src_addr,
|
||||
_reply_mapping.size_log2,
|
||||
_reply_mapping.writeable, false) };
|
||||
|
||||
l4_ipc_reply_and_wait(_last,
|
||||
L4_IPC_SHORT_FPAGE, _reply_mapping.dst_addr(),
|
||||
_reply_mapping.fpage().fpage, &_last,
|
||||
l4_msgdope_t result;
|
||||
l4_ipc_reply_and_wait(_last, L4_IPC_SHORT_FPAGE,
|
||||
_reply_mapping.dst_addr, fpage.fpage, &_last,
|
||||
L4_IPC_SHORT_MSG, &_pf_addr, &_pf_ip,
|
||||
L4_IPC_SEND_TIMEOUT_0, &result);
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
#include <base/allocator_avl.h>
|
||||
#include <base/sleep.h>
|
||||
#include <util/misc_math.h>
|
||||
#include <util/xml_generator.h>
|
||||
|
||||
/* base-internal includes */
|
||||
#include <base/internal/crt0.h>
|
||||
@@ -466,6 +467,29 @@ Platform::Platform()
|
||||
|
||||
init_core_log(Core_log_range { core_local_addr, log_size } );
|
||||
}
|
||||
|
||||
/* export platform specific infos */
|
||||
{
|
||||
void * phys_ptr = nullptr;
|
||||
size_t const size = 1 << get_page_size_log2();
|
||||
|
||||
if (ram_alloc().alloc_aligned(size, &phys_ptr,
|
||||
get_page_size_log2()).ok()) {
|
||||
addr_t const phys_addr = reinterpret_cast<addr_t>(phys_ptr);
|
||||
addr_t const core_local_addr = phys_addr;
|
||||
|
||||
region_alloc().remove_range(core_local_addr, size);
|
||||
|
||||
Genode::Xml_generator xml(reinterpret_cast<char *>(core_local_addr),
|
||||
size, "platform_info", [&] ()
|
||||
{
|
||||
xml.node("kernel", [&] () { xml.attribute("name", "fiasco"); });
|
||||
});
|
||||
|
||||
_rom_fs.insert(new (core_mem_alloc()) Rom_module(phys_addr, size,
|
||||
"platform_info"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
15
repos/base-foc/patches/0018-L4-enable-gcc_10.patch
Normal file
15
repos/base-foc/patches/0018-L4-enable-gcc_10.patch
Normal file
@@ -0,0 +1,15 @@
|
||||
L4: enable GCC 10
|
||||
|
||||
diff --git a/l4/mk/Makeconf b/l4/mk/Makeconf
|
||||
index eb59b51..a7b5955 100644
|
||||
--- a/l4/mk/Makeconf
|
||||
+++ b/l4/mk/Makeconf
|
||||
@@ -52,7 +52,7 @@ L4_KIP_OFFS_SYS_DEBUGGER = 0x900
|
||||
L4_STACK_ADDR ?= $(L4_STACK_ADDR_$(ARCH))
|
||||
L4_STACK_SIZE ?= $(if $(L4_STACK_SIZE_MAIN_THREAD),$(L4_STACK_SIZE_MAIN_THREAD),0x8000)
|
||||
|
||||
-CC_WHITELIST-gcc := 4.7 4.8 4.9 5 6 7 8 9
|
||||
+CC_WHITELIST-gcc := 4.7 4.8 4.9 5 6 7 8 9 10
|
||||
CC_WHITELIST-clang := 3.5 3.6 3.7 3.8 3.9
|
||||
|
||||
# This is quite bad: There is no other chance to disable the page-alignedment
|
||||
@@ -0,0 +1,162 @@
|
||||
From dd8842dbdae2bb11d4f726f8a49a6ecb4d5d6870 Mon Sep 17 00:00:00 2001
|
||||
|
||||
From: Frank Mehnert <frank.mehnert@kernkonzept.com>
|
||||
|
||||
Subject: [PATCH] Do not depend on any libstdc++ feature
|
||||
|
||||
The libc_minimal library does not provide support for libstdc++ so use
|
||||
the normal libc headers instead and do not use any 'std' functions.
|
||||
|
||||
Change-Id: I9b4e04ddba0e3f366550265a2c30ef0f37df5534
|
||||
---
|
||||
server/src/boot_modules.cc | 2 +-
|
||||
server/src/multiboot2.cc | 24 ++++++++++++------------
|
||||
server/src/platform/exynos.cc | 2 +-
|
||||
server/src/platform/x86_pc-base.h | 4 ++--
|
||||
server/src/platform_common.cc | 2 +-
|
||||
server/src/support.h | 4 ++--
|
||||
6 files changed, 19 insertions(+), 19 deletions(-)
|
||||
|
||||
diff --git a/server/src/boot_modules.cc b/server/src/boot_modules.cc
|
||||
index 2446967..6100749 100644
|
||||
--- a/server/src/boot_modules.cc
|
||||
+++ b/server/src/boot_modules.cc
|
||||
@@ -1,6 +1,6 @@
|
||||
#include "support.h"
|
||||
#include "panic.h"
|
||||
-#include <cassert>
|
||||
+#include <assert.h>
|
||||
#include "mod_info.h"
|
||||
#ifdef COMPRESS
|
||||
#include "uncompress.h"
|
||||
diff --git a/server/src/multiboot2.cc b/server/src/multiboot2.cc
|
||||
index c7255a3..17a2fdd 100644
|
||||
--- a/server/src/multiboot2.cc
|
||||
+++ b/server/src/multiboot2.cc
|
||||
@@ -18,7 +18,7 @@
|
||||
#include <l4/sys/consts.h>
|
||||
#include <l4/cxx/minmax>
|
||||
|
||||
-#include <cstring>
|
||||
+#include <string.h>
|
||||
|
||||
#include <assert.h>
|
||||
#include <stddef.h>
|
||||
@@ -62,7 +62,7 @@ public:
|
||||
// by some other tag type)
|
||||
void process_modules(l4util_mb2_tag_t *tag)
|
||||
{
|
||||
- std::size_t cnt = 0;
|
||||
+ size_t cnt = 0;
|
||||
|
||||
while (tag->type == L4UTIL_MB2_MODULE_INFO_TAG)
|
||||
{
|
||||
@@ -146,8 +146,8 @@ public:
|
||||
void finalize()
|
||||
{
|
||||
assert(sizeof(_mbi) <= _size);
|
||||
- std::memcpy(_buf, &_mbi, sizeof(_mbi));
|
||||
- std::memset(_buf + sizeof(_mbi), 0, _size - sizeof(_mbi));
|
||||
+ memcpy(_buf, &_mbi, sizeof(_mbi));
|
||||
+ memset(_buf + sizeof(_mbi), 0, _size - sizeof(_mbi));
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -157,25 +157,25 @@ private:
|
||||
{
|
||||
char buf[1024];
|
||||
|
||||
- std::size_t size = l4_round_size(tag->size, L4UTIL_MB2_TAG_ALIGN_SHIFT);
|
||||
+ size_t size = l4_round_size(tag->size, L4UTIL_MB2_TAG_ALIGN_SHIFT);
|
||||
l4util_mb2_tag_t *dst_tag =
|
||||
reinterpret_cast<l4util_mb2_tag_t *>(end() - size);
|
||||
char *_src = reinterpret_cast<char *>(tag);
|
||||
|
||||
while (size)
|
||||
{
|
||||
- std::size_t copied = cxx::min(sizeof(buf), size);
|
||||
+ size_t copied = cxx::min(sizeof(buf), size);
|
||||
char *_dst = end() - copied;
|
||||
- std::memcpy(buf, _src, copied);
|
||||
- std::memmove(_src, _src + copied, (end() - _src) - copied);
|
||||
- std::memcpy(_dst, buf, copied);
|
||||
+ memcpy(buf, _src, copied);
|
||||
+ memmove(_src, _src + copied, (end() - _src) - copied);
|
||||
+ memcpy(_dst, buf, copied);
|
||||
size -= copied;
|
||||
}
|
||||
|
||||
return dst_tag;
|
||||
}
|
||||
|
||||
- void reserve_from_end(std::size_t size)
|
||||
+ void reserve_from_end(size_t size)
|
||||
{
|
||||
size = l4_round_size(size, L4UTIL_MB2_TAG_ALIGN_SHIFT);
|
||||
assert(_size >= size);
|
||||
@@ -183,8 +183,8 @@ private:
|
||||
}
|
||||
|
||||
char *_buf;
|
||||
- std::size_t _size;
|
||||
- const std::size_t _total_size;
|
||||
+ size_t _size;
|
||||
+ const size_t _total_size;
|
||||
|
||||
l4util_mb_info_t _mbi;
|
||||
};
|
||||
diff --git a/server/src/platform/exynos.cc b/server/src/platform/exynos.cc
|
||||
index d10d70d..bcd6d02 100644
|
||||
--- a/server/src/platform/exynos.cc
|
||||
+++ b/server/src/platform/exynos.cc
|
||||
@@ -17,7 +17,7 @@
|
||||
#include "support.h"
|
||||
#include <l4/drivers/uart_s3c2410.h>
|
||||
|
||||
-#include <cstdio>
|
||||
+#include <stdio.h>
|
||||
|
||||
namespace {
|
||||
class Platform_arm_exynos : public Platform_single_region_ram
|
||||
diff --git a/server/src/platform/x86_pc-base.h b/server/src/platform/x86_pc-base.h
|
||||
index d5d53bf..fe0e0dd 100644
|
||||
--- a/server/src/platform/x86_pc-base.h
|
||||
+++ b/server/src/platform/x86_pc-base.h
|
||||
@@ -12,8 +12,8 @@
|
||||
#include <l4/util/port_io.h>
|
||||
#include <l4/cxx/static_container>
|
||||
|
||||
-#include <cassert>
|
||||
-#include <cstdio>
|
||||
+#include <assert.h>
|
||||
+#include <stdio.h>
|
||||
|
||||
/** VGA console output */
|
||||
|
||||
diff --git a/server/src/platform_common.cc b/server/src/platform_common.cc
|
||||
index 0503802..26ae0a9 100644
|
||||
--- a/server/src/platform_common.cc
|
||||
+++ b/server/src/platform_common.cc
|
||||
@@ -1,6 +1,6 @@
|
||||
#include "support.h"
|
||||
#include <l4/cxx/minmax>
|
||||
-#include <cassert>
|
||||
+#include <assert.h>
|
||||
|
||||
#ifdef RAM_SIZE_MB
|
||||
|
||||
diff --git a/server/src/support.h b/server/src/support.h
|
||||
index 472e40e..20d2c04 100644
|
||||
--- a/server/src/support.h
|
||||
+++ b/server/src/support.h
|
||||
@@ -21,8 +21,8 @@
|
||||
#include <l4/util/mb_info.h>
|
||||
#include <stdio.h>
|
||||
#include "region.h"
|
||||
-#include <cstring>
|
||||
-#include <cstdlib>
|
||||
+#include <string.h>
|
||||
+#include <stdlib.h>
|
||||
|
||||
L4::Uart *uart();
|
||||
void set_stdio_uart(L4::Uart *uart);
|
||||
@@ -0,0 +1,25 @@
|
||||
From a4d6d7877c0050308a9c28308fa8a233c86902e1 Mon Sep 17 00:00:00 2001
|
||||
From: Alexander Warg <alexander.warg@kernkonzept.com>
|
||||
Date: Mon, 29 Jul 2019 00:00:00 +0000
|
||||
Subject: [PATCH] Fix amd64 build with binutils 2.32+
|
||||
|
||||
We have to make sure that a linker script is not given twice to ld.
|
||||
|
||||
Change-Id: Ibd0f8972083f665fb7824df2a65b319183d7b1e7
|
||||
---
|
||||
server/src/Make.rules | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/server/src/Make.rules b/server/src/Make.rules
|
||||
index 43e8775..c1bbfec 100644
|
||||
--- a/server/src/Make.rules
|
||||
+++ b/server/src/Make.rules
|
||||
@@ -439,7 +439,7 @@ $(OBJ_DIR)/ARCH-amd64/libc32/OBJ-$(ARCH)_$(CPU)/libc32.a: FORCE
|
||||
bootstrap32.elf: $(OBJ32) bootstrap32.bin $(SRC_DIR)/ARCH-amd64/boot32/bootstrap32.ld $(OBJ_DIR)/ARCH-amd64/libc32/OBJ-$(ARCH)_$(CPU)/libc32.a
|
||||
@$(LINK_MESSAGE)
|
||||
$(VERBOSE)$(CC32) -o $@ -nostdlib -static \
|
||||
- -Wl,-T,$(SRC_DIR)/ARCH-amd64/boot32/bootstrap32.ld,--gc-sections $^ -lgcc
|
||||
+ -Wl,-T,$(SRC_DIR)/ARCH-amd64/boot32/bootstrap32.ld,--gc-sections $(filter-out %/bootstrap32.ld,$^) -lgcc
|
||||
$(VERBOSE)chmod 755 $@
|
||||
|
||||
bootstrap: bootstrap32.elf
|
||||
15
repos/base-foc/patches/0021-FOC-enable-gcc_10.patch
Normal file
15
repos/base-foc/patches/0021-FOC-enable-gcc_10.patch
Normal file
@@ -0,0 +1,15 @@
|
||||
FOC: enable GCC 10
|
||||
|
||||
diff --git a/src/Makeconf b/src/Makeconf
|
||||
index de5b656..7660daa 100644
|
||||
--- a/src/Makeconf
|
||||
+++ b/src/Makeconf
|
||||
@@ -244,7 +244,7 @@ ifeq ($(CC_TYPE),gcc)
|
||||
endif
|
||||
|
||||
|
||||
-CC_WHITELIST-gcc := 4.7 4.8 4.9 5 6 7 8 9
|
||||
+CC_WHITELIST-gcc := 4.7 4.8 4.9 5 6 7 8 9 10
|
||||
CC_WHITELIST-clang := 3.6 3.7 3.8 3.9 4.0 5.0 6.0 7.0 8.0 9.0
|
||||
CC_WHITELIST := $(CC_WHITELIST-$(CC_TYPE))
|
||||
|
||||
@@ -0,0 +1,234 @@
|
||||
From f29031cdbe8cebf6c39d02a72dd50c736cec3a69 Mon Sep 17 00:00:00 2001
|
||||
|
||||
From: =?UTF-8?q?Jakub=20Jerm=C3=A1=C5=99?= <jakub.jermar@kernkonzept.com>
|
||||
|
||||
Subject: [PATCH] amd64: Split _syscall_entry into code and data
|
||||
|
||||
This change makes the entire syscall entry table smaller, sparing 32
|
||||
bytes per a statically configured CPU. Note that some padding is still
|
||||
used to achieve cacheline alignment of the per-CPU entries of the data
|
||||
part of the table.
|
||||
|
||||
Furthemore, by moving the two data members into a data section and
|
||||
allowing to modify the handler offset from JDB only, the amd64 kernel is
|
||||
easier to make completely W^X in the future. The handler entry offset
|
||||
remains a part of the jump instruction opcode (there is no data
|
||||
indirection) and JDB is enhanced to be able to patch it when needed.
|
||||
|
||||
Change-Id: I22b91f9fd2b108d99e3ceea6611a15ab3db26bb6
|
||||
|
||||
Edit for Genode: UX changes not included because of more dependencies
|
||||
---
|
||||
src/jdb/ia32/jdb_trace_set-ia32-ux.cpp | 4 +-
|
||||
src/kern/ia32/64/cpu-64.cpp | 31 +++++-------------
|
||||
src/kern/ia32/64/entry.S | 29 +++++++++++++++++
|
||||
src/kern/ia32/64/syscall_entry.cpp | 54 +++++---------------------------
|
||||
4 files changed, 48 insertions(+), 70 deletions(-)
|
||||
|
||||
diff --git a/src/jdb/ia32/jdb_trace_set-ia32-ux.cpp b/src/jdb/ia32/jdb_trace_set-ia32-ux.cpp
|
||||
index ec23322..0a2f309 100644
|
||||
--- a/src/jdb/ia32/jdb_trace_set-ia32-ux.cpp
|
||||
+++ b/src/jdb/ia32/jdb_trace_set-ia32-ux.cpp
|
||||
@@ -39,7 +39,7 @@ Jdb_set_trace::set_ipc_vector()
|
||||
|
||||
Idt::set_entry(0x30, (Address) int30_entry, true);
|
||||
Jdb::on_each_cpu([fast_entry](Cpu_number cpu){
|
||||
- Cpu::cpus.cpu(cpu).set_fast_entry(fast_entry);
|
||||
+ //Cpu::cpus.cpu(cpu).set_fast_entry(fast_entry);
|
||||
});
|
||||
|
||||
if (Jdb_ipc_trace::_trace)
|
||||
@@ -98,7 +98,7 @@ struct Jdb_ipc_log_pm : Pm_object
|
||||
else
|
||||
fast_entry = entry_sys_fast_ipc_c;
|
||||
|
||||
- Cpu::cpus.cpu(cpu).set_fast_entry(fast_entry);
|
||||
+ //Cpu::cpus.cpu(cpu).set_fast_entry(fast_entry);
|
||||
}
|
||||
|
||||
void pm_on_suspend(Cpu_number) override {}
|
||||
diff --git a/src/kern/ia32/64/cpu-64.cpp b/src/kern/ia32/64/cpu-64.cpp
|
||||
index 974c677..d18ad16 100644
|
||||
--- a/src/kern/ia32/64/cpu-64.cpp
|
||||
+++ b/src/kern/ia32/64/cpu-64.cpp
|
||||
@@ -4,7 +4,8 @@ INTERFACE [amd64 && !kernel_isolation]:
|
||||
|
||||
EXTENSION class Cpu
|
||||
{
|
||||
- static Per_cpu_array<Syscall_entry> _syscall_entry;
|
||||
+ static Per_cpu_array<Syscall_entry_data>
|
||||
+ _syscall_entry_data asm("syscall_entry_data");
|
||||
};
|
||||
|
||||
|
||||
@@ -13,14 +14,7 @@ IMPLEMENTATION[amd64 && !kernel_isolation]:
|
||||
#include "mem_layout.h"
|
||||
#include "tss.h"
|
||||
|
||||
-Per_cpu_array<Syscall_entry> Cpu::_syscall_entry;
|
||||
-
|
||||
-PUBLIC
|
||||
-void
|
||||
-Cpu::set_fast_entry(void (*func)())
|
||||
-{
|
||||
- _syscall_entry[id()].set_entry(func);
|
||||
-}
|
||||
+Per_cpu_array<Syscall_entry_data> Cpu::_syscall_entry_data;
|
||||
|
||||
IMPLEMENT inline NEEDS["tss.h"]
|
||||
Address volatile &
|
||||
@@ -31,11 +25,13 @@ PUBLIC inline
|
||||
void
|
||||
Cpu::setup_sysenter()
|
||||
{
|
||||
+ extern Per_cpu_array<Syscall_entry_text> syscall_entry_text;
|
||||
+
|
||||
wrmsr(0, GDT_CODE_KERNEL | ((GDT_CODE_USER32 | 3) << 16), MSR_STAR);
|
||||
- wrmsr((Unsigned64)&_syscall_entry[id()], MSR_LSTAR);
|
||||
- wrmsr((Unsigned64)&_syscall_entry[id()], MSR_CSTAR);
|
||||
+ wrmsr((Unsigned64)&syscall_entry_text[id()], MSR_LSTAR);
|
||||
+ wrmsr((Unsigned64)&syscall_entry_text[id()], MSR_CSTAR);
|
||||
wrmsr(~0U, MSR_SFMASK);
|
||||
- _syscall_entry[id()].set_rsp((Address)&kernel_sp());
|
||||
+ _syscall_entry_data[id()].set_rsp((Address)&kernel_sp());
|
||||
}
|
||||
|
||||
IMPLEMENTATION[amd64 && kernel_isolation]:
|
||||
@@ -43,16 +39,6 @@ IMPLEMENTATION[amd64 && kernel_isolation]:
|
||||
#include "mem_layout.h"
|
||||
#include "tss.h"
|
||||
|
||||
-PUBLIC
|
||||
-void
|
||||
-Cpu::set_fast_entry(void (*func)())
|
||||
-{
|
||||
- extern char const syscall_entry_code[];
|
||||
- extern char const syscall_entry_reloc[];
|
||||
- auto ofs = syscall_entry_reloc - syscall_entry_code + 3; // 3 byte movebas
|
||||
- *reinterpret_cast<Signed32 *>(Mem_layout::Mem_layout::Kentry_cpu_page + ofs + 0xa0) = (Signed32)(Signed64)func;
|
||||
-}
|
||||
-
|
||||
PUBLIC inline
|
||||
void
|
||||
Cpu::setup_sysenter() const
|
||||
@@ -78,7 +64,6 @@ Cpu::init_sysenter()
|
||||
{
|
||||
setup_sysenter();
|
||||
wrmsr(rdmsr(MSR_EFER) | 1, MSR_EFER);
|
||||
- set_fast_entry(entry_sys_fast_ipc_c);
|
||||
}
|
||||
|
||||
|
||||
diff --git a/src/kern/ia32/64/entry.S b/src/kern/ia32/64/entry.S
|
||||
index 1cb8137..ed5a04c 100644
|
||||
--- a/src/kern/ia32/64/entry.S
|
||||
+++ b/src/kern/ia32/64/entry.S
|
||||
@@ -372,7 +372,36 @@ entry_\name:
|
||||
jmp all_syscalls
|
||||
.endm
|
||||
|
||||
+#ifndef CONFIG_KERNEL_ISOLATION
|
||||
+#ifdef CONFIG_MP
|
||||
+MAX_NUM_CPUS = CONFIG_MP_MAX_CPUS
|
||||
+#else
|
||||
+MAX_NUM_CPUS = 1
|
||||
+#endif
|
||||
+
|
||||
+#define SYSCALL_ENTRY_DATA_SIZE 64
|
||||
+#define SYSCALL_ENTRY_TEXT_SIZE (0f - 0b)
|
||||
+#define SYSCALL_ENTRY_OFFSET ((0b - syscall_entry_text) / SYSCALL_ENTRY_TEXT_SIZE)
|
||||
+#define SYSCALL_ENTRY_DATA (syscall_entry_data + SYSCALL_ENTRY_OFFSET * SYSCALL_ENTRY_DATA_SIZE)
|
||||
+#define KERN_SP (SYSCALL_ENTRY_DATA + 0)
|
||||
+#define USER_SP (SYSCALL_ENTRY_DATA + 8)
|
||||
.section ".entry.text.syscalls", "ax", @progbits
|
||||
+ .global syscall_entry_text
|
||||
+ .align 64
|
||||
+syscall_entry_text:
|
||||
+.rept MAX_NUM_CPUS
|
||||
+0:
|
||||
+ mov %rsp, USER_SP(%rip)
|
||||
+ mov KERN_SP(%rip), %rsp
|
||||
+ mov (%rsp), %rsp
|
||||
+ pushq $GDT_DATA_USER | 3
|
||||
+ pushq USER_SP(%rip)
|
||||
+ jmp entry_sys_fast_ipc_c
|
||||
+ .align 32
|
||||
+0:
|
||||
+.endr
|
||||
+#endif /* !CONFIG_KERNEL_ISOLATION */
|
||||
+
|
||||
.p2align 4
|
||||
.type all_syscalls,@function
|
||||
all_syscalls:
|
||||
diff --git a/src/kern/ia32/64/syscall_entry.cpp b/src/kern/ia32/64/syscall_entry.cpp
|
||||
index b03d1ad..3dd7db3 100644
|
||||
--- a/src/kern/ia32/64/syscall_entry.cpp
|
||||
+++ b/src/kern/ia32/64/syscall_entry.cpp
|
||||
@@ -2,58 +2,22 @@ INTERFACE [amd64]:
|
||||
|
||||
#include "types.h"
|
||||
|
||||
-class Syscall_entry
|
||||
+class Syscall_entry_data
|
||||
{
|
||||
-private:
|
||||
- template<int INSN_LEN>
|
||||
- struct Mem_insn
|
||||
- {
|
||||
- Unsigned32 _insn:INSN_LEN * 8;
|
||||
- Unsigned32 _offset;
|
||||
- Mem_insn(Unsigned32 insn, void *mem)
|
||||
- : _insn(insn),
|
||||
- _offset((Address)mem - (Address)(&_offset + 1))
|
||||
- {}
|
||||
- } __attribute__((packed));
|
||||
-
|
||||
- Mem_insn<3> _mov_rsp_user_sp;
|
||||
- Mem_insn<3> _mov_kern_sp_rsp;
|
||||
- Unsigned32 _mov_rsp_rsp;
|
||||
- Unsigned8 _push_ss, _ss_value;
|
||||
- Mem_insn<2> _push_user_rsp;
|
||||
- Unsigned8 _jmp;
|
||||
- Signed32 _entry_offset;
|
||||
- Unsigned8 _pading[33]; // pad to the next 64 byte boundary
|
||||
- Unsigned64 _kern_sp;
|
||||
- Unsigned64 _user_sp;
|
||||
-} __attribute__((packed, aligned(64)));
|
||||
+ Unsigned64 _kern_sp = 0;
|
||||
+ Unsigned64 _user_sp = 0;
|
||||
+} __attribute__((packed, aligned(64))); // Enforce cacheline alignment
|
||||
|
||||
+struct Syscall_entry_text
|
||||
+{
|
||||
+ char _res[32]; // Keep this in sync with code in syscall_entry_text!
|
||||
+} __attribute__((packed, aligned(32)));
|
||||
|
||||
IMPLEMENTATION [amd64]:
|
||||
|
||||
-#include "config_gdt.h"
|
||||
-
|
||||
-PUBLIC inline NEEDS["config_gdt.h"]
|
||||
-Syscall_entry::Syscall_entry()
|
||||
-: /* mov %rsp, _user_sp(%rip) */ _mov_rsp_user_sp(0x258948, &_user_sp),
|
||||
- /* mov _kern_sp(%rip), %rsp */ _mov_kern_sp_rsp(0x258b48, &_kern_sp),
|
||||
- /* mov (%rsp), %rsp */ _mov_rsp_rsp(0x24248b48),
|
||||
- /* pushq GDT_DATA_USER | 3 */ _push_ss(0x6a), _ss_value(GDT_DATA_USER | 3),
|
||||
- /* pushq _user_sp(%rip) */ _push_user_rsp(0x35ff, &_user_sp),
|
||||
- /* jmp *_entry_offset */ _jmp(0xe9)
|
||||
-{}
|
||||
-
|
||||
-PUBLIC inline
|
||||
-void
|
||||
-Syscall_entry::set_entry(void (*func)(void))
|
||||
-{
|
||||
- _entry_offset = (Address)func
|
||||
- - ((Address)&_entry_offset + sizeof(_entry_offset));
|
||||
-}
|
||||
-
|
||||
PUBLIC inline
|
||||
void
|
||||
-Syscall_entry::set_rsp(Address rsp)
|
||||
+Syscall_entry_data::set_rsp(Address rsp)
|
||||
{
|
||||
_kern_sp = rsp;
|
||||
}
|
||||
@@ -0,0 +1,94 @@
|
||||
ARM: link bootstrap as ET_REL not ET_EXEC
|
||||
|
||||
From: Frank Mehnert <frank.mehnert@kernkonzept.com>
|
||||
|
||||
Support for linking of ET_EXEC section was deprecated in binutils 2.35
|
||||
and dropped in binutils 2.36.
|
||||
|
||||
Instead, extract the raw section of the fully linked bootstrap object
|
||||
and create a relocatable object which can be linked to the kernel. The
|
||||
required symbols for the linker are extracted separately.
|
||||
|
||||
Fixes ticket #CD-301.
|
||||
|
||||
Change-Id: I0cdc2aacb5dbd01677d93e2bb1103940ac60e848
|
||||
|
||||
Edit: fixed merge error for Genode
|
||||
---
|
||||
src/Makeconf.arm | 6 ++++++
|
||||
src/kern/arm/Makerules.KERNEL | 20 ++++++++++++++++----
|
||||
src/kernel.arm.ld | 4 ++--
|
||||
3 files changed, 24 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/src/Makeconf.arm b/src/Makeconf.arm
|
||||
index 7c66a8d..89b9e7d 100644
|
||||
--- a/src/Makeconf.arm
|
||||
+++ b/src/Makeconf.arm
|
||||
@@ -31,3 +31,9 @@ LDFLAGS += $(LDFLAGS-y)
|
||||
LD_EMULATION_CHOICE-$(CONFIG_BIT32) := armelf armelf_linux_eabi armelf_fbsd
|
||||
LD_EMULATION_CHOICE-$(CONFIG_BIT64) := aarch64linux aarch64elf
|
||||
LD_EMULATION_CHOICE := $(LD_EMULATION_CHOICE-y)
|
||||
+OBJCOPY_BFDNAME-$(CONFIG_BIT32) := elf32-littlearm
|
||||
+OBJCOPY_BFDNAME-$(CONFIG_BIT64) := elf64-littleaarch64
|
||||
+OBJCOPY_BFDNAME := $(OBJCOPY_BFDNAME-y)
|
||||
+OBJCOPY_BFDARCH-$(CONFIG_BIT32) := arm
|
||||
+OBJCOPY_BFDARCH-$(CONFIG_BIT64) := aarch64
|
||||
+OBJCOPY_BFDARCH := $(OBJCOPY_BFDARCH-y)
|
||||
diff --git a/src/kern/arm/Makerules.KERNEL b/src/kern/arm/Makerules.KERNEL
|
||||
index d706444..fae3013 100644
|
||||
--- a/src/kern/arm/Makerules.KERNEL
|
||||
+++ b/src/kern/arm/Makerules.KERNEL
|
||||
@@ -21,16 +21,28 @@ bootstrap_ldflags += -T$(bootstrap_lds)
|
||||
|
||||
bootstrap_export = _start start_of_loader end_of_bootstrap_info
|
||||
bootstrap_strip = --strip-all $(addprefix --keep-symbol=,$(bootstrap_export))
|
||||
+bootstrap_syms = end_of_bootstrap_info|_start|start_of_loader
|
||||
+bootstrap_sed = 's/^0*([0-9a-f]*) [a-zA-Z] ($(bootstrap_syms))/\2 = 0x\1;/p'
|
||||
|
||||
bootstrap.$(KERNEL).pre.o: $(OBJ_BOOTSTRAP) $(LIBGCC) $(bootstrap_lds)
|
||||
$(LINK_MESSAGE)
|
||||
$(VERBOSE)$(LD) $(bootstrap_ldflags) $(OBJ_BOOTSTRAP) $(LIBGCC) -o $@
|
||||
|
||||
-bootstrap.$(KERNEL).o: bootstrap.$(KERNEL).pre.o
|
||||
- $(LINK_MESSAGE)
|
||||
- $(VERBOSE)$(OBJCOPY) $(bootstrap_strip) $< $@
|
||||
+bootstrap.$(KERNEL).bin: bootstrap.$(KERNEL).pre.o
|
||||
+ $(COMP_MESSAGE)
|
||||
+ $(VERBOSE)$(OBJCOPY) -O binary --only-section=.bootstrap.text $< $@
|
||||
+
|
||||
+bootstrap.$(KERNEL).rel: bootstrap.$(KERNEL).bin
|
||||
+ $(COMP_MESSAGE)
|
||||
+ $(VERBOSE)$(OBJCOPY) -I binary -O $(OBJCOPY_BFDNAME) -B $(OBJCOPY_BFDARCH) \
|
||||
+ --rename-section .data=.bootstrap.text $< $@
|
||||
+
|
||||
+# The linker will treat this file as linker script.
|
||||
+bootstrap.$(KERNEL).sym: bootstrap.$(KERNEL).pre.o
|
||||
+ $(COMP_MESSAGE)
|
||||
+ $(VERBOSE)$(NM) $< | sed -n -E $(bootstrap_sed) > $@
|
||||
|
||||
-$(KERNEL).image: kernel.arm.lds $(CRT0) bootstrap.$(KERNEL).o $(OBJ_KERNEL_noboot) $(JDB) $(LIBK) $(KERNEL_EXTRA_LIBS) $(LIBDISASM) $(ABI) libdrivers.a $(LIBUART) $(CXXLIB) $(MINILIBC) $(LIBGCC) $(MINILIBC) libgluedriverslibc.a
|
||||
+$(KERNEL).image: kernel.arm.lds $(CRT0) bootstrap.$(KERNEL).rel bootstrap.$(KERNEL).sym $(OBJ_KERNEL_noboot) $(JDB) $(LIBK) $(KERNEL_EXTRA_LIBS) $(LIBDISASM) $(ABI) libdrivers.a $(LIBUART) $(CXXLIB) $(MINILIBC) $(LIBGCC) $(MINILIBC) libgluedriverslibc.a
|
||||
$(LINK_MESSAGE)
|
||||
$(VERBOSE)$(LD) $(LDFLAGS) -m $(LD_EMULATION) $(KERNEL_LDFLAGS) -N -defsym kernel_load_addr=$(CONFIG_KERNEL_LOAD_ADDR) \
|
||||
-T $< -o $@ $(filter-out $<,$+)
|
||||
diff --git a/src/kernel.arm.ld b/src/kernel.arm.ld
|
||||
index 1e3ec75..86c16b3 100644
|
||||
--- a/src/kernel.arm.ld
|
||||
+++ b/src/kernel.arm.ld
|
||||
@@ -61,14 +61,14 @@ SECTIONS {
|
||||
|
||||
. = kernel_load_addr + 0x1000;
|
||||
|
||||
- .text : {
|
||||
+ .text kernel_load_addr + 0x1000 : {
|
||||
MWORD(_start_kernel)
|
||||
MWORD(my_kernel_info_page)
|
||||
KEEP(*(.bootstrap.info))
|
||||
ASSERT (ABSOLUTE(.) == end_of_bootstrap_info, "invalid size of bootstrap.info");
|
||||
|
||||
. = ABSOLUTE(start_of_loader);
|
||||
- *(.bootstrap.text)
|
||||
+ KEEP(*(.bootstrap.text))
|
||||
} :bstrap
|
||||
|
||||
. = ALIGN(4K);
|
||||
@@ -1 +1 @@
|
||||
2e8cbb44d4c009238d96b66a9fc085e038f22e61
|
||||
abe2de76835f33297ca4e4ac687e69bc04f83dc5
|
||||
|
||||
@@ -37,5 +37,11 @@ PATCH_OPT(patches/0014-Always-enable-user-mode-access-for-performance-monit.patc
|
||||
PATCH_OPT(patches/0015-VMX-disable-event-injection-if-requested-by-VMM.patch) := -p3 -d${DIR(foc)}
|
||||
PATCH_OPT(patches/0016-svm-provide-cr0-to-guest-if-np-enabled.patch) := -p3 -d${DIR(foc)}
|
||||
PATCH_OPT(patches/0017-svm-avoid-forceful-exit-on-task-switch.patch) := -p3 -d${DIR(foc)}
|
||||
PATCH_OPT(patches/0018-L4-enable-gcc_10.patch) := -p2 -d${DIR(mk)}
|
||||
PATCH_OPT(patches/0019-Bootstrap-do-not-depend-on-any-libstdcxx-feature.patch) := -p1 -d${DIR(bootstrap)}
|
||||
PATCH_OPT(patches/0020-Bootstrap-fix-amd64-build-with-binutils-2_32.patch) := -p1 -d${DIR(bootstrap)}
|
||||
PATCH_OPT(patches/0021-FOC-enable-gcc_10.patch) := -p1 -d${DIR(foc)}
|
||||
PATCH_OPT(patches/0022-FOC-amd64-split-_syscall_entry-into-code-and-data.patch) := -p1 -d${DIR(foc)}
|
||||
PATCH_OPT(patches/0023-FOC-arm-link-bootstrap-as-et_rel.patch) := -p1 -d${DIR(foc)}
|
||||
|
||||
$(call check_tool,gawk)
|
||||
|
||||
@@ -1 +1 @@
|
||||
2021-03-11 c1f7d1de07d3a55d5e43f6ab5fb67b502ab1d0bb
|
||||
2021-08-28 29757bf5413bf396d085bafbc700268e2d1156c4
|
||||
|
||||
@@ -1 +1 @@
|
||||
2021-03-11 9383498670ce6668c8b99da3e62008b21a5932aa
|
||||
2021-08-28 60c1ff4c8efe8caa105ff16fdd7fd09ef1ef6991
|
||||
|
||||
@@ -1 +1 @@
|
||||
2021-03-11 50104241d20d23e928d3b27d0931d14112c68e82
|
||||
2021-08-28 038ab57adceb64cf49000518343c3e14b8481851
|
||||
|
||||
@@ -1 +1 @@
|
||||
2021-03-11 43cc39f70c8bfe4df3427c94d096d7e218b7b24c
|
||||
2021-08-28 ba949187f071c5af50467ab054d8841788e48548
|
||||
|
||||
@@ -1 +1 @@
|
||||
2021-03-11 742459157b61720e96c17bb6cfbf7ac085a4df2f
|
||||
2021-08-28 52379c07bda990554cf5e18e81d3c3de449b9197
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
#define _CORE__INCLUDE__IPC_PAGER_H_
|
||||
|
||||
/* Genode includes */
|
||||
#include <base/cache.h>
|
||||
#include <base/ipc.h>
|
||||
#include <base/stdint.h>
|
||||
#include <base/native_capability.h>
|
||||
@@ -28,67 +27,15 @@
|
||||
/* base-internal includes */
|
||||
#include <base/internal/native_thread.h>
|
||||
|
||||
/* core-local includes */
|
||||
#include <mapping.h>
|
||||
|
||||
/* Fiasco.OC includes */
|
||||
#include <foc/syscall.h>
|
||||
|
||||
namespace Genode {
|
||||
|
||||
class Mapping;
|
||||
class Ipc_pager;
|
||||
}
|
||||
namespace Genode { class Ipc_pager; }
|
||||
|
||||
|
||||
class Genode::Mapping
|
||||
{
|
||||
private:
|
||||
|
||||
addr_t _dst_addr;
|
||||
Foc::l4_fpage_t _fpage { };
|
||||
Cache_attribute _cacheability;
|
||||
bool _iomem;
|
||||
|
||||
public:
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
Mapping(addr_t dst_addr, addr_t src_addr,
|
||||
Cache_attribute c, bool io_mem,
|
||||
unsigned log2size, bool write, bool executable)
|
||||
:
|
||||
_dst_addr(dst_addr), _cacheability(c), _iomem(io_mem)
|
||||
{
|
||||
typedef Foc::L4_fpage_rights Rights;
|
||||
Rights rights = ( write && executable) ? Foc::L4_FPAGE_RWX :
|
||||
( write && !executable) ? Foc::L4_FPAGE_RW :
|
||||
(!write && !executable) ? Foc::L4_FPAGE_RO :
|
||||
Foc::L4_FPAGE_RX;
|
||||
|
||||
_fpage = Foc::l4_fpage(src_addr, log2size, rights);
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct invalid flexpage
|
||||
*/
|
||||
Mapping() : _dst_addr(0), _fpage(Foc::l4_fpage_invalid()),
|
||||
_cacheability(UNCACHED), _iomem(false) { }
|
||||
|
||||
Foc::l4_umword_t dst_addr() const { return _dst_addr; }
|
||||
bool grant() const { return false; }
|
||||
Foc::l4_fpage_t fpage() const { return _fpage; }
|
||||
Cache_attribute cacheability() const { return _cacheability; }
|
||||
bool iomem() const { return _iomem; }
|
||||
/**
|
||||
* Prepare map operation is not needed on Fiasco.OC, since we clear the
|
||||
* dataspace before this function is called.
|
||||
*/
|
||||
void prepare_map_operation() { }
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Special paging server class
|
||||
*/
|
||||
class Genode::Ipc_pager : public Native_capability
|
||||
{
|
||||
public:
|
||||
@@ -97,14 +44,14 @@ class Genode::Ipc_pager : public Native_capability
|
||||
|
||||
private:
|
||||
|
||||
Native_thread _last { }; /* origin of last fault */
|
||||
addr_t _pf_addr { 0 }; /* page-fault address */
|
||||
addr_t _pf_ip { 0 }; /* ip of faulter */
|
||||
Mapping _reply_mapping { }; /* page-fault answer */
|
||||
unsigned long _badge; /* badge of faulting thread */
|
||||
Native_thread _last { }; /* origin of last fault */
|
||||
addr_t _pf_addr { 0 }; /* page-fault address */
|
||||
addr_t _pf_ip { 0 }; /* ip of faulter */
|
||||
Mapping _reply_mapping { }; /* page-fault answer */
|
||||
unsigned long _badge; /* badge of faulting thread */
|
||||
Foc::l4_msgtag_t _tag { }; /* receive message tag */
|
||||
Foc::l4_exc_regs_t _regs { }; /* exception registers */
|
||||
Msg_type _type { PAGEFAULT };
|
||||
Msg_type _type { PAGEFAULT };
|
||||
|
||||
void _parse_msg_type(void);
|
||||
void _parse_exception(void);
|
||||
|
||||
@@ -29,6 +29,13 @@ using namespace Genode;
|
||||
using namespace Foc;
|
||||
|
||||
|
||||
/*
|
||||
* There is no preparation needed because the entire physical memory is known
|
||||
* to be mapped within core.
|
||||
*/
|
||||
void Mapping::prepare_map_operation() const { }
|
||||
|
||||
|
||||
void Ipc_pager::_parse(unsigned long label)
|
||||
{
|
||||
_badge = label & ~0x3;
|
||||
@@ -94,31 +101,35 @@ void Ipc_pager::reply_and_wait_for_fault()
|
||||
l4_umword_t label;
|
||||
l4_msgtag_t snd_tag = l4_msgtag(0, 0, 1, 0);
|
||||
|
||||
l4_umword_t grant = _reply_mapping.grant() ? L4_MAP_ITEM_GRANT : 0;
|
||||
l4_utcb_mr()->mr[0] = _reply_mapping.dst_addr() | L4_ITEM_MAP | grant;
|
||||
l4_utcb_mr()->mr[0] = _reply_mapping.dst_addr | L4_ITEM_MAP;
|
||||
|
||||
switch (_reply_mapping.cacheability()) {
|
||||
bool const bufferable = !_reply_mapping.io_mem || _reply_mapping.write_combined;
|
||||
|
||||
case WRITE_COMBINED:
|
||||
l4_utcb_mr()->mr[0] |= L4_FPAGE_BUFFERABLE << 4;
|
||||
break;
|
||||
l4_fpage_cacheability_opt_t const
|
||||
cacheability = _reply_mapping.cached ? L4_FPAGE_CACHEABLE
|
||||
: bufferable ? L4_FPAGE_BUFFERABLE
|
||||
: L4_FPAGE_UNCACHEABLE;
|
||||
|
||||
case CACHED:
|
||||
l4_utcb_mr()->mr[0] |= L4_FPAGE_CACHEABLE << 4;
|
||||
break;
|
||||
l4_utcb_mr()->mr[0] |= cacheability << 4;
|
||||
|
||||
case UNCACHED:
|
||||
if (!_reply_mapping.iomem())
|
||||
l4_utcb_mr()->mr[0] |= L4_FPAGE_BUFFERABLE << 4;
|
||||
else
|
||||
l4_utcb_mr()->mr[0] |= L4_FPAGE_UNCACHEABLE << 4;
|
||||
break;
|
||||
}
|
||||
l4_utcb_mr()->mr[1] = _reply_mapping.fpage().raw;
|
||||
auto rights = [] (bool writeable, bool executable)
|
||||
{
|
||||
if ( writeable && executable) return L4_FPAGE_RWX;
|
||||
if ( writeable && !executable) return L4_FPAGE_RW;
|
||||
if (!writeable && !executable) return L4_FPAGE_RO;
|
||||
return L4_FPAGE_RX;
|
||||
};
|
||||
|
||||
l4_fpage_t const fpage = l4_fpage(_reply_mapping.src_addr,
|
||||
_reply_mapping.size_log2,
|
||||
rights(_reply_mapping.writeable,
|
||||
_reply_mapping.executable));
|
||||
|
||||
l4_utcb_mr()->mr[1] = fpage.raw;
|
||||
|
||||
_tag = l4_ipc_send_and_wait(_last.kcap, l4_utcb(), snd_tag,
|
||||
&label, L4_IPC_SEND_TIMEOUT_0);
|
||||
int err = l4_ipc_error(_tag, l4_utcb());
|
||||
int const err = l4_ipc_error(_tag, l4_utcb());
|
||||
if (err) {
|
||||
error("Ipc error ", err, " in pagefault from ", Hex(label & ~0x3));
|
||||
wait_for_fault();
|
||||
@@ -139,7 +150,7 @@ void Ipc_pager::acknowledge_wakeup()
|
||||
|
||||
void Ipc_pager::acknowledge_exception()
|
||||
{
|
||||
_regs = *l4_utcb_exc();
|
||||
*l4_utcb_exc() = _regs;
|
||||
l4_cap_idx_t dst = Foc::Capability::valid(_last.kcap)
|
||||
? _last.kcap : (l4_cap_idx_t)L4_SYSF_REPLY;
|
||||
Foc::l4_msgtag_t const msg_tag =
|
||||
|
||||
@@ -493,7 +493,11 @@ Platform::Platform()
|
||||
pages << get_page_size_log2(),
|
||||
"platform_info", [&] ()
|
||||
{
|
||||
xml.node("kernel", [&] () { xml.attribute("name", "foc"); });
|
||||
xml.node("kernel", [&] () {
|
||||
xml.attribute("name", "foc");
|
||||
xml.attribute("acpi", true);
|
||||
xml.attribute("msi" , true);
|
||||
});
|
||||
xml.node("hardware", [&] () {
|
||||
_setup_platform_info(xml, sigma0_map_kip()); });
|
||||
|
||||
|
||||
@@ -21,3 +21,15 @@ void Genode::cache_coherent(addr_t addr, size_t size)
|
||||
{
|
||||
Foc::l4_cache_coherent(addr, addr + size);
|
||||
}
|
||||
|
||||
|
||||
void Genode::cache_clean_invalidate_data(Genode::addr_t addr, Genode::size_t size)
|
||||
{
|
||||
Foc::l4_cache_flush_data(addr, addr + size);
|
||||
}
|
||||
|
||||
|
||||
void Genode::cache_invalidate_data(Genode::addr_t addr, Genode::size_t size)
|
||||
{
|
||||
Foc::l4_cache_inv_data(addr, addr + size);
|
||||
}
|
||||
|
||||
@@ -37,13 +37,15 @@ namespace Kernel {
|
||||
constexpr Call_arg call_id_ack_signal() { return 11; }
|
||||
constexpr Call_arg call_id_print_char() { return 12; }
|
||||
constexpr Call_arg call_id_cache_coherent_region() { return 13; }
|
||||
constexpr Call_arg call_id_ack_cap() { return 14; }
|
||||
constexpr Call_arg call_id_delete_cap() { return 15; }
|
||||
constexpr Call_arg call_id_timeout() { return 16; }
|
||||
constexpr Call_arg call_id_timeout_max_us() { return 17; }
|
||||
constexpr Call_arg call_id_time() { return 18; }
|
||||
constexpr Call_arg call_id_run_vm() { return 19; }
|
||||
constexpr Call_arg call_id_pause_vm() { return 20; }
|
||||
constexpr Call_arg call_id_cache_clean_inv_region() { return 14; }
|
||||
constexpr Call_arg call_id_cache_inv_region() { return 15; }
|
||||
constexpr Call_arg call_id_ack_cap() { return 16; }
|
||||
constexpr Call_arg call_id_delete_cap() { return 17; }
|
||||
constexpr Call_arg call_id_timeout() { return 18; }
|
||||
constexpr Call_arg call_id_timeout_max_us() { return 19; }
|
||||
constexpr Call_arg call_id_time() { return 20; }
|
||||
constexpr Call_arg call_id_run_vm() { return 21; }
|
||||
constexpr Call_arg call_id_pause_vm() { return 22; }
|
||||
|
||||
|
||||
/*****************************************************************
|
||||
@@ -188,6 +190,32 @@ namespace Kernel {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Clean and invalidate D-Cache lines of the given memory region
|
||||
*
|
||||
* \param base base of the region within the current domain
|
||||
* \param size size of the region
|
||||
*/
|
||||
inline void cache_clean_invalidate_data_region(addr_t const base,
|
||||
size_t const size)
|
||||
{
|
||||
call(call_id_cache_clean_inv_region(), (Call_arg)base, (Call_arg)size);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Invalidate D-Cache lines of the given memory region
|
||||
*
|
||||
* \param base base of the region within the current domain
|
||||
* \param size size of the region
|
||||
*/
|
||||
inline void cache_invalidate_data_region(addr_t const base,
|
||||
size_t const size)
|
||||
{
|
||||
call(call_id_cache_inv_region(), (Call_arg)base, (Call_arg)size);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Send request message and await receipt of corresponding reply message
|
||||
*
|
||||
|
||||
@@ -15,6 +15,7 @@ SRC_CC += spec/arm/kernel/cpu.cc
|
||||
SRC_CC += spec/arm/kernel/pd.cc
|
||||
SRC_CC += spec/arm/cpu.cc
|
||||
SRC_CC += spec/arm/kernel/thread.cc
|
||||
SRC_CC += spec/arm/kernel/thread_caches.cc
|
||||
SRC_CC += spec/arm/platform_support.cc
|
||||
|
||||
# add assembly sources
|
||||
|
||||
@@ -7,6 +7,7 @@ SRC_CC += kernel/cpu_mp.cc
|
||||
SRC_CC += spec/64bit/memory_map.cc
|
||||
SRC_CC += spec/arm/generic_timer.cc
|
||||
SRC_CC += spec/arm/kernel/lock.cc
|
||||
SRC_CC += spec/arm/kernel/thread_caches.cc
|
||||
SRC_CC += spec/arm/platform_support.cc
|
||||
SRC_CC += spec/arm_v8/cpu.cc
|
||||
SRC_CC += spec/arm_v8/kernel/cpu.cc
|
||||
|
||||
@@ -1 +1 @@
|
||||
2021-02-22 8418c32c327c1c69414891ae813d904cbf7f9c64
|
||||
2021-06-24 5626884aba14848b98e9aad4d00714fa5ea7c84a
|
||||
|
||||
@@ -1 +1 @@
|
||||
2021-03-11 5f70d9ee12b71eeda56fed778219365271c78934
|
||||
2021-08-28 7bb57a2e769700abf6fd2057d9e003abfa98299b
|
||||
|
||||
@@ -1 +1 @@
|
||||
2021-03-11 d370add0c416bc0f2e7ae83de6d2f10f9ea59823
|
||||
2021-08-28 76c6eeb920f7d892be4ed670b8ee88f1ddb6706d
|
||||
|
||||
@@ -1 +1 @@
|
||||
2021-03-11 be82a7e08f0a16f93f689b8d3d747ea90fab396f
|
||||
2021-08-28 2ff3b759c6df9a5c461e9c259909e9804ad17ed7
|
||||
|
||||
@@ -1 +1 @@
|
||||
2021-03-11 0f3db9a963d53504843478924551bc619667d8d4
|
||||
2021-08-28 a78c91c4f6fbcdad8e5cb77c4995c306f6e7f383
|
||||
|
||||
@@ -1 +1 @@
|
||||
2021-03-28 d4983186c11a48fecfc87fbc15f16f6bb45d91e5
|
||||
2021-08-28 f1a2ea4fa36605cc76483a40040c7e0bd1921695
|
||||
|
||||
@@ -1 +1 @@
|
||||
2021-03-11 8176ee1808ba28e0e84ad00154d88ecf8d0cbfff
|
||||
2021-08-28 c0c4cabd03be175d380f036de30106881eeb6651
|
||||
|
||||
@@ -1 +1 @@
|
||||
2021-03-11 76290d876f3ca43436d7cfd0558b264be0aac69a
|
||||
2021-08-28 a8c4f0782c8653dc18e5ecd20bb3eb11a8d2984b
|
||||
|
||||
@@ -1 +1 @@
|
||||
2021-03-11 b399a660467f8107c0297cb502f80f64432d6ef6
|
||||
2021-08-28 67253c6a4c652664896221c8b79fb82fff01dc57
|
||||
|
||||
@@ -1 +1 @@
|
||||
2021-03-11 6bc53d97397ed97bd275b81a4af771e59f0a29db
|
||||
2021-08-28 d0b3d729f5a549c885dab4dd7b4bc930daa5f6dc
|
||||
|
||||
@@ -1 +1 @@
|
||||
2021-03-11 37a51e7eeed1c8902b6a12a7e6f9ba0c4857fb45
|
||||
2021-08-28 c850168cfba0ff5bbfb1048c2a58552dd36dfb0f
|
||||
|
||||
@@ -1 +1 @@
|
||||
2021-03-11 d722eae5ebbafea313995f3443f903c0c965be9f
|
||||
2021-08-28 e4de82cc87762b272d28d6d632c967a575197e11
|
||||
|
||||
@@ -1 +1 @@
|
||||
2021-03-11 06c48030f17bcd7ba888145b208e27146c6ea687
|
||||
2021-08-28 0e5bcaca15c5738839c7bae0bcdc1cbace99018b
|
||||
|
||||
@@ -1 +1 @@
|
||||
2021-03-11 7eed185acd78e556e5cc69ecd1db6ce43a724238
|
||||
2021-08-28 2e6f58ac4d73642b0241f211c0738ad2b47b5f6a
|
||||
|
||||
@@ -175,7 +175,7 @@ Platform::Platform()
|
||||
using namespace Genode;
|
||||
|
||||
/* prepare the ram allocator */
|
||||
board.early_ram_regions.for_each([this] (Memory_region const & region) {
|
||||
board.early_ram_regions.for_each([this] (unsigned, Memory_region const & region) {
|
||||
ram_alloc.add(region); });
|
||||
ram_alloc.remove(bootstrap_region);
|
||||
|
||||
@@ -207,6 +207,6 @@ Platform::Platform()
|
||||
/* add all left RAM to bootinfo */
|
||||
ram_alloc.for_each_free_region([&] (Memory_region const & r) {
|
||||
bootinfo.ram_regions.add(r); });
|
||||
board.late_ram_regions.for_each([&] (Memory_region const & r) {
|
||||
board.late_ram_regions.for_each([&] (unsigned, Memory_region const & r) {
|
||||
bootinfo.ram_regions.add(r); });
|
||||
}
|
||||
|
||||
@@ -726,6 +726,8 @@ void Thread::_call()
|
||||
unsigned const call_id = user_arg_0();
|
||||
switch (call_id) {
|
||||
case call_id_cache_coherent_region(): _call_cache_coherent_region(); return;
|
||||
case call_id_cache_clean_inv_region(): _call_cache_clean_invalidate_data_region(); return;
|
||||
case call_id_cache_inv_region(): _call_cache_invalidate_data_region(); return;
|
||||
case call_id_stop_thread(): _call_stop_thread(); return;
|
||||
case call_id_restart_thread(): _call_restart_thread(); return;
|
||||
case call_id_yield_thread(): _call_yield_thread(); return;
|
||||
|
||||
@@ -225,6 +225,8 @@ class Kernel::Thread : private Kernel::Object, public Cpu_job, private Timeout
|
||||
void _call_send_reply_msg();
|
||||
void _call_invalidate_tlb();
|
||||
void _call_cache_coherent_region();
|
||||
void _call_cache_clean_invalidate_data_region();
|
||||
void _call_cache_invalidate_data_region();
|
||||
void _call_print_char();
|
||||
void _call_await_signal();
|
||||
void _call_pending_signal();
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
/* core-local includes */
|
||||
#include <kernel/signal_receiver.h>
|
||||
#include <hw/mapping.h>
|
||||
#include <mapping.h>
|
||||
#include <object.h>
|
||||
#include <rpc_cap_factory.h>
|
||||
|
||||
@@ -56,28 +57,6 @@ namespace Genode {
|
||||
}
|
||||
|
||||
|
||||
struct Genode::Mapping : Hw::Mapping
|
||||
{
|
||||
Mapping() {}
|
||||
|
||||
Mapping(addr_t virt,
|
||||
addr_t phys,
|
||||
Cache_attribute cacheable,
|
||||
bool io,
|
||||
unsigned size_log2,
|
||||
bool writeable,
|
||||
bool executable)
|
||||
:
|
||||
Hw::Mapping(phys, virt, 1 << size_log2,
|
||||
{ writeable ? Hw::RW : Hw::RO,
|
||||
executable ? Hw::EXEC : Hw::NO_EXEC, Hw::USER,
|
||||
Hw::NO_GLOBAL, io ? Hw::DEVICE : Hw::RAM, cacheable })
|
||||
{ }
|
||||
|
||||
void prepare_map_operation() const {}
|
||||
};
|
||||
|
||||
|
||||
class Genode::Ipc_pager
|
||||
{
|
||||
protected:
|
||||
|
||||
@@ -67,7 +67,7 @@ void Platform::_init_io_mem_alloc()
|
||||
{
|
||||
/* add entire adress space minus the RAM memory regions */
|
||||
_io_mem_alloc.add_range(0, ~0x0UL);
|
||||
_boot_info().ram_regions.for_each([this] (Hw::Memory_region const &r) {
|
||||
_boot_info().ram_regions.for_each([this] (unsigned, Hw::Memory_region const &r) {
|
||||
_io_mem_alloc.remove_range(r.base, r.size); });
|
||||
};
|
||||
|
||||
@@ -82,7 +82,7 @@ Hw::Memory_region_array const & Platform::_core_virt_regions()
|
||||
addr_t Platform::core_phys_addr(addr_t virt)
|
||||
{
|
||||
addr_t ret = 0;
|
||||
_boot_info().elf_mappings.for_each([&] (Hw::Mapping const & m)
|
||||
_boot_info().elf_mappings.for_each([&] (unsigned, Hw::Mapping const & m)
|
||||
{
|
||||
if (virt >= m.virt() && virt < (m.virt() + m.size()))
|
||||
ret = (virt - m.virt()) + m.phys();
|
||||
@@ -132,7 +132,10 @@ void Platform::_init_platform_info()
|
||||
Genode::Xml_generator xml(reinterpret_cast<char *>(virt_addr),
|
||||
rom_size, rom_name, [&] ()
|
||||
{
|
||||
xml.node("kernel", [&] () { xml.attribute("name", "hw"); });
|
||||
xml.node("kernel", [&] () {
|
||||
xml.attribute("name", "hw");
|
||||
xml.attribute("acpi", true);
|
||||
});
|
||||
_init_additional_platform_info(xml);
|
||||
xml.node("affinity-space", [&] () {
|
||||
xml.attribute("width", affinity_space().width());
|
||||
@@ -162,11 +165,11 @@ Platform::Platform()
|
||||
|
||||
_core_mem_alloc.virt_alloc().add_range(Hw::Mm::core_heap().base,
|
||||
Hw::Mm::core_heap().size);
|
||||
_core_virt_regions().for_each([this] (Hw::Memory_region const & r) {
|
||||
_core_virt_regions().for_each([this] (unsigned, Hw::Memory_region const & r) {
|
||||
_core_mem_alloc.virt_alloc().remove_range(r.base, r.size); });
|
||||
_boot_info().elf_mappings.for_each([this] (Hw::Mapping const & m) {
|
||||
_boot_info().elf_mappings.for_each([this] (unsigned, Hw::Mapping const & m) {
|
||||
_core_mem_alloc.virt_alloc().remove_range(m.virt(), m.size()); });
|
||||
_boot_info().ram_regions.for_each([this] (Hw::Memory_region const & region) {
|
||||
_boot_info().ram_regions.for_each([this] (unsigned, Hw::Memory_region const & region) {
|
||||
_core_mem_alloc.phys_alloc().add_range(region.base, region.size); });
|
||||
|
||||
_init_io_port_alloc();
|
||||
|
||||
@@ -61,11 +61,24 @@ void Pager_entrypoint::entry()
|
||||
if (!locked_ptr.valid()) continue;
|
||||
|
||||
Hw::Address_space * as = static_cast<Hw::Address_space*>(&*locked_ptr);
|
||||
as->insert_translation(_mapping.virt(), _mapping.phys(),
|
||||
_mapping.size(), _mapping.flags());
|
||||
|
||||
Hw::Page_flags const flags {
|
||||
.writeable = _mapping.writeable ? Hw::RW : Hw::RO,
|
||||
.executable = _mapping.executable ? Hw::EXEC : Hw::NO_EXEC,
|
||||
.privileged = Hw::USER,
|
||||
.global = Hw::NO_GLOBAL,
|
||||
.type = _mapping.io_mem ? Hw::DEVICE : Hw::RAM,
|
||||
.cacheable = _mapping.cached ? Genode::CACHED : Genode::UNCACHED
|
||||
};
|
||||
|
||||
as->insert_translation(_mapping.dst_addr, _mapping.src_addr,
|
||||
1UL << _mapping.size_log2, flags);
|
||||
}
|
||||
|
||||
/* let pager object go back to no-fault state */
|
||||
po->wake_up();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Mapping::prepare_map_operation() const { }
|
||||
|
||||
@@ -152,16 +152,24 @@ void Arm_cpu::cache_coherent_region(addr_t const base,
|
||||
}
|
||||
|
||||
|
||||
void Arm_cpu::clean_data_cache_by_virt_region(addr_t const base,
|
||||
size_t const size)
|
||||
void Arm_cpu::cache_invalidate_data_region(addr_t const base,
|
||||
size_t const size)
|
||||
{
|
||||
auto lambda = [] (addr_t const base) { Dcimvac::write(base); };
|
||||
cache_maintainance(base, size, Cpu::data_cache_line_size(), lambda);
|
||||
}
|
||||
|
||||
|
||||
void Arm_cpu::cache_clean_data_region(addr_t const base,
|
||||
size_t const size)
|
||||
{
|
||||
auto lambda = [] (addr_t const base) { Dccmvac::write(base); };
|
||||
cache_maintainance(base, size, Cpu::data_cache_line_size(), lambda);
|
||||
}
|
||||
|
||||
|
||||
void Arm_cpu::clean_invalidate_data_cache_by_virt_region(addr_t const base,
|
||||
size_t const size)
|
||||
void Arm_cpu::cache_clean_invalidate_data_region(addr_t const base,
|
||||
size_t const size)
|
||||
{
|
||||
auto lambda = [] (addr_t const base) { Dccimvac::write(base); };
|
||||
cache_maintainance(base, size, Cpu::data_cache_line_size(), lambda);
|
||||
@@ -197,7 +205,7 @@ void Arm_cpu::clear_memory_region(addr_t const addr,
|
||||
* DMA memory, which needs to be evicted from the D-cache
|
||||
*/
|
||||
if (changed_cache_properties) {
|
||||
Cpu::clean_invalidate_data_cache_by_virt_region(addr, size);
|
||||
Cpu::cache_clean_invalidate_data_region(addr, size);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -70,19 +70,6 @@ struct Genode::Arm_cpu : public Hw::Arm_cpu
|
||||
static void invalidate_instr_cache() {
|
||||
asm volatile ("mcr p15, 0, %0, c7, c5, 0" :: "r" (0) : ); }
|
||||
|
||||
/**
|
||||
* Clean data-cache for virtual region 'base' - 'base + size'
|
||||
*/
|
||||
static void clean_data_cache_by_virt_region(addr_t const base,
|
||||
size_t const size);
|
||||
|
||||
/**
|
||||
* Clean and invalidate data-cache for virtual region
|
||||
* 'base' - 'base + size'
|
||||
*/
|
||||
static void clean_invalidate_data_cache_by_virt_region(addr_t const base,
|
||||
size_t const size);
|
||||
|
||||
static void clear_memory_region(addr_t const addr,
|
||||
size_t const size,
|
||||
bool changed_cache_properties);
|
||||
@@ -90,6 +77,15 @@ struct Genode::Arm_cpu : public Hw::Arm_cpu
|
||||
static void cache_coherent_region(addr_t const addr,
|
||||
size_t const size);
|
||||
|
||||
static void cache_clean_data_region(addr_t const base,
|
||||
size_t const size);
|
||||
|
||||
static void cache_clean_invalidate_data_region(addr_t const addr,
|
||||
size_t const size);
|
||||
|
||||
static void cache_invalidate_data_region(addr_t const addr,
|
||||
size_t const size);
|
||||
|
||||
/**
|
||||
* Invalidate TLB regarding the given address space id
|
||||
*/
|
||||
|
||||
@@ -55,36 +55,6 @@ void Thread::exception(Cpu & cpu)
|
||||
}
|
||||
|
||||
|
||||
void Kernel::Thread::_call_cache_coherent_region()
|
||||
{
|
||||
addr_t base = (addr_t) user_arg_1();
|
||||
size_t const size = (size_t) user_arg_2();
|
||||
|
||||
/**
|
||||
* sanity check that only one small page is affected,
|
||||
* because we only want to lookup one page in the page tables
|
||||
* to limit execution time within the kernel
|
||||
*/
|
||||
if (Hw::trunc_page(base) != Hw::trunc_page(base+size-1)) {
|
||||
Genode::raw(*this, " tried to make cross-page region cache coherent ",
|
||||
(void*)base, " ", size);
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* Lookup whether the page is backed, and if so make the memory coherent
|
||||
* in between I-, and D-cache
|
||||
*/
|
||||
addr_t phys = 0;
|
||||
if (pd().platform_pd().lookup_translation(base, phys)) {
|
||||
Cpu::cache_coherent_region(base, size);
|
||||
} else {
|
||||
Genode::raw(*this, " tried to make invalid address ",
|
||||
base, " cache coherent");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* on ARM with multiprocessing extensions, maintainance operations on TLB,
|
||||
* and caches typically work coherently across CPUs when using the correct
|
||||
|
||||
74
repos/base-hw/src/core/spec/arm/kernel/thread_caches.cc
Normal file
74
repos/base-hw/src/core/spec/arm/kernel/thread_caches.cc
Normal file
@@ -0,0 +1,74 @@
|
||||
/*
|
||||
* \brief Kernel backend for threads - cache maintainance
|
||||
* \author Stefan Kalkowski
|
||||
* \date 2021-06-24
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2021 Genode Labs GmbH
|
||||
*
|
||||
* This file is part of the Genode OS framework, which is distributed
|
||||
* under the terms of the GNU Affero General Public License version 3.
|
||||
*/
|
||||
|
||||
#include <cpu.h>
|
||||
#include <platform_pd.h>
|
||||
#include <kernel/pd.h>
|
||||
#include <kernel/thread.h>
|
||||
|
||||
using namespace Kernel;
|
||||
|
||||
|
||||
template <typename FN>
|
||||
static void for_cachelines(addr_t base,
|
||||
size_t const size,
|
||||
Kernel::Thread & thread,
|
||||
FN const & fn)
|
||||
{
|
||||
/**
|
||||
* sanity check that only one small page is affected,
|
||||
* because we only want to lookup one page in the page tables
|
||||
* to limit execution time within the kernel
|
||||
*/
|
||||
if (Hw::trunc_page(base) != Hw::trunc_page(base+size-1)) {
|
||||
Genode::raw(thread, " tried to make cross-page region cache coherent ",
|
||||
(void*)base, " ", size);
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* Lookup whether the page is backed, and if so make the memory coherent
|
||||
* in between I-, and D-cache
|
||||
*/
|
||||
addr_t phys = 0;
|
||||
if (thread.pd().platform_pd().lookup_translation(base, phys)) {
|
||||
fn(base, size);
|
||||
} else {
|
||||
Genode::raw(thread, " tried to make invalid address ",
|
||||
(void*)base, " cache coherent");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Kernel::Thread::_call_cache_coherent_region()
|
||||
{
|
||||
for_cachelines((addr_t)user_arg_1(), (size_t)user_arg_2(), *this,
|
||||
[] (addr_t addr, size_t size) {
|
||||
Genode::Cpu::cache_coherent_region(addr, size); });
|
||||
}
|
||||
|
||||
|
||||
void Kernel::Thread::_call_cache_clean_invalidate_data_region()
|
||||
{
|
||||
for_cachelines((addr_t)user_arg_1(), (size_t)user_arg_2(), *this,
|
||||
[] (addr_t addr, size_t size) {
|
||||
Genode::Cpu::cache_clean_invalidate_data_region(addr, size); });
|
||||
}
|
||||
|
||||
|
||||
void Kernel::Thread::_call_cache_invalidate_data_region()
|
||||
{
|
||||
for_cachelines((addr_t)user_arg_1(), (size_t)user_arg_2(), *this,
|
||||
[] (addr_t addr, size_t size) {
|
||||
Genode::Cpu::cache_invalidate_data_region(addr, size); });
|
||||
}
|
||||
@@ -29,7 +29,7 @@ constexpr bool Hw::Page_table::Descriptor_base::_smp() { return false; }
|
||||
|
||||
void Hw::Page_table::_table_changed(unsigned long addr, unsigned long size)
|
||||
{
|
||||
Genode::Arm_cpu::clean_data_cache_by_virt_region(addr, size);
|
||||
Genode::Arm_cpu::cache_clean_data_region(addr, size);
|
||||
}
|
||||
|
||||
#endif /* _CORE__SPEC__ARM_V6__TRANSLATION_TABLE_H_ */
|
||||
|
||||
@@ -39,7 +39,7 @@ Kernel::Vm::Vm(unsigned,
|
||||
void Vm::exception(Cpu & cpu)
|
||||
{
|
||||
switch(_state.cpu_exception) {
|
||||
case Genode::Cpu_state::INTERRUPT_REQUEST: [[fallthrough]]
|
||||
case Genode::Cpu_state::INTERRUPT_REQUEST: [[fallthrough]];
|
||||
case Genode::Cpu_state::FAST_INTERRUPT_REQUEST:
|
||||
_interrupt(cpu.id());
|
||||
return;
|
||||
|
||||
@@ -101,7 +101,7 @@ static inline void cache_maintainance(Genode::addr_t const base,
|
||||
|
||||
|
||||
void Genode::Cpu::cache_coherent_region(addr_t const base,
|
||||
size_t const size)
|
||||
size_t const size)
|
||||
{
|
||||
Genode::memory_barrier();
|
||||
|
||||
@@ -117,6 +117,36 @@ void Genode::Cpu::cache_coherent_region(addr_t const base,
|
||||
}
|
||||
|
||||
|
||||
void Genode::Cpu::cache_clean_invalidate_data_region(addr_t const base,
|
||||
size_t const size)
|
||||
{
|
||||
Genode::memory_barrier();
|
||||
|
||||
auto lambda = [] (addr_t const base) {
|
||||
asm volatile("dc civac, %0" :: "r" (base));
|
||||
asm volatile("dsb ish");
|
||||
asm volatile("isb");
|
||||
};
|
||||
|
||||
cache_maintainance(base, size, lambda);
|
||||
}
|
||||
|
||||
|
||||
void Genode::Cpu::cache_invalidate_data_region(addr_t const base,
|
||||
size_t const size)
|
||||
{
|
||||
Genode::memory_barrier();
|
||||
|
||||
auto lambda = [] (addr_t const base) {
|
||||
asm volatile("dc ivac, %0" :: "r" (base));
|
||||
asm volatile("dsb ish");
|
||||
asm volatile("isb");
|
||||
};
|
||||
|
||||
cache_maintainance(base, size, lambda);
|
||||
}
|
||||
|
||||
|
||||
void Genode::Cpu::clear_memory_region(addr_t const addr,
|
||||
size_t const size,
|
||||
bool changed_cache_properties)
|
||||
|
||||
@@ -56,7 +56,8 @@ struct Genode::Cpu : Hw::Arm_64_cpu
|
||||
struct alignas(16) Fpu_state
|
||||
{
|
||||
Genode::uint128_t q[32];
|
||||
Genode::uint32_t fpsr;
|
||||
Genode::uint64_t fpsr;
|
||||
Genode::uint64_t fpcr;
|
||||
};
|
||||
|
||||
struct alignas(8) Context : Cpu_state
|
||||
@@ -95,6 +96,10 @@ struct Genode::Cpu : Hw::Arm_64_cpu
|
||||
|
||||
static void cache_coherent_region(addr_t const addr,
|
||||
size_t const size);
|
||||
static void cache_clean_invalidate_data_region(addr_t const addr,
|
||||
size_t const size);
|
||||
static void cache_invalidate_data_region(addr_t const addr,
|
||||
size_t const size);
|
||||
};
|
||||
|
||||
#endif /* _CORE__SPEC__ARM_V8__CPU_H_ */
|
||||
|
||||
@@ -60,8 +60,9 @@ _kernel_entry:
|
||||
stp q26, q27, [x0], #32
|
||||
stp q28, q29, [x0], #32
|
||||
stp q30, q31, [x0], #32
|
||||
mrs x1, fpcr
|
||||
mrs x2, fpsr
|
||||
str x2, [x0]
|
||||
stp x1, x2, [x0], #16
|
||||
msr fpsr, xzr
|
||||
ldr x0, [sp, #-16]
|
||||
ldr x1, [sp, #-32]
|
||||
@@ -111,8 +112,9 @@ _kernel_entry:
|
||||
ldp q26, q27, [x1], #32
|
||||
ldp q28, q29, [x1], #32
|
||||
ldp q30, q31, [x1], #32
|
||||
ldr x1, [x1]
|
||||
msr fpsr, x1
|
||||
ldp x2, x3, [x1], #16
|
||||
msr fpcr, x2
|
||||
msr fpsr, x3
|
||||
add x0, x0, #8
|
||||
ldp x1, x2, [x0], #16
|
||||
ldp x3, x4, [x0], #16
|
||||
|
||||
@@ -107,36 +107,6 @@ bool Kernel::Pd::invalidate_tlb(Cpu &, addr_t addr, size_t size)
|
||||
}
|
||||
|
||||
|
||||
void Kernel::Thread::_call_cache_coherent_region()
|
||||
{
|
||||
addr_t base = (addr_t) user_arg_1();
|
||||
size_t const size = (size_t) user_arg_2();
|
||||
|
||||
/**
|
||||
* sanity check that only one small page is affected,
|
||||
* because we only want to lookup one page in the page tables
|
||||
* to limit execution time within the kernel
|
||||
*/
|
||||
if (Hw::trunc_page(base) != Hw::trunc_page(base+size-1)) {
|
||||
Genode::raw(*this, " tried to make cross-page region cache coherent ",
|
||||
(void*)base, " ", size);
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* Lookup whether the page is backed, and if so make the memory coherent
|
||||
* in between I-, and D-cache
|
||||
*/
|
||||
addr_t phys = 0;
|
||||
if (pd().platform_pd().lookup_translation(base, phys)) {
|
||||
Cpu::cache_coherent_region(base, size);
|
||||
} else {
|
||||
Genode::raw(*this, " tried to make invalid address ",
|
||||
base, " cache coherent");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Thread::proceed(Cpu & cpu)
|
||||
{
|
||||
cpu.switch_to(*regs, pd().mmu_regs);
|
||||
|
||||
@@ -37,7 +37,7 @@ void Hw::Page_table::_table_changed(unsigned long addr, unsigned long size)
|
||||
* page table entry is added. We only do this as core as the kernel
|
||||
* adds translations solely before MMU and caches are enabled.
|
||||
*/
|
||||
Genode::Cpu::clean_data_cache_by_virt_region(addr, size);
|
||||
Genode::Cpu::cache_clean_data_region(addr, size);
|
||||
}
|
||||
|
||||
#endif /* _CORE__SPEC__CORTEX_A8__TRANSLATION_TABLE_H_ */
|
||||
|
||||
@@ -28,10 +28,10 @@ struct Genode::Cpu : Arm_v7_cpu
|
||||
* Clean and invalidate data-cache for virtual region
|
||||
* 'base' - 'base + size'
|
||||
*/
|
||||
static void clean_invalidate_data_cache_by_virt_region(addr_t const base,
|
||||
size_t const size)
|
||||
static void cache_clean_invalidate_data_region(addr_t const base,
|
||||
size_t const size)
|
||||
{
|
||||
Arm_cpu::clean_invalidate_data_cache_by_virt_region(base, size);
|
||||
Arm_cpu::cache_clean_invalidate_data_region(base, size);
|
||||
Board::l2_cache().clean_invalidate();
|
||||
}
|
||||
|
||||
|
||||
@@ -92,6 +92,12 @@ void Thread::exception(Cpu & cpu)
|
||||
void Thread::_call_cache_coherent_region() { }
|
||||
|
||||
|
||||
void Kernel::Thread::_call_cache_clean_invalidate_data_region() { }
|
||||
|
||||
|
||||
void Kernel::Thread::_call_cache_invalidate_data_region() { }
|
||||
|
||||
|
||||
void Kernel::Thread::proceed(Cpu & cpu)
|
||||
{
|
||||
cpu.switch_to(_pd->mmu_regs);
|
||||
|
||||
@@ -35,6 +35,12 @@ void Kernel::Thread::Tlb_invalidation::execute()
|
||||
void Kernel::Thread::_call_cache_coherent_region() { }
|
||||
|
||||
|
||||
void Kernel::Thread::_call_cache_clean_invalidate_data_region() { }
|
||||
|
||||
|
||||
void Kernel::Thread::_call_cache_invalidate_data_region() { }
|
||||
|
||||
|
||||
void Kernel::Thread::proceed(Cpu & cpu)
|
||||
{
|
||||
cpu.switch_to(*regs, pd().mmu_regs);
|
||||
|
||||
@@ -65,8 +65,7 @@ Capability<Vm_session::Native_vcpu> Vm_session_component::create_vcpu(Thread_cap
|
||||
Vcpu & vcpu = *_vcpus[_vcpu_id_alloc];
|
||||
|
||||
try {
|
||||
vcpu.ds_cap = _constrained_md_ram_alloc.alloc(_ds_size(),
|
||||
Cache_attribute::UNCACHED);
|
||||
vcpu.ds_cap = _constrained_md_ram_alloc.alloc(_ds_size(), Cache::UNCACHED);
|
||||
vcpu.ds_addr = _region_map.attach(vcpu.ds_cap);
|
||||
} catch (...) {
|
||||
if (vcpu.ds_cap.valid())
|
||||
|
||||
@@ -1,63 +0,0 @@
|
||||
/*
|
||||
* \brief Array class with static size
|
||||
* \author Stefan Kalkowski
|
||||
* \date 2016-09-30
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2016-2017 Genode Labs GmbH
|
||||
*
|
||||
* This file is part of the Genode OS framework, which is distributed
|
||||
* under the terms of the GNU Affero General Public License version 3.
|
||||
*/
|
||||
|
||||
#ifndef _SRC__LIB__HW__ARRAY_H_
|
||||
#define _SRC__LIB__HW__ARRAY_H_
|
||||
|
||||
#include <base/log.h>
|
||||
|
||||
namespace Hw { template <typename, unsigned> class Array; }
|
||||
|
||||
|
||||
template <typename T, unsigned MAX>
|
||||
class Hw::Array
|
||||
{
|
||||
private:
|
||||
|
||||
unsigned _count = 0;
|
||||
T _objs[MAX];
|
||||
|
||||
void _init(unsigned i, T obj) { _objs[i] = obj; }
|
||||
|
||||
template <typename ... TAIL>
|
||||
void _init(unsigned i, T obj, TAIL ... tail)
|
||||
{
|
||||
_objs[i] = obj;
|
||||
_init(i+1, tail...);
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
Array() {}
|
||||
|
||||
template<typename ... ARGS>
|
||||
Array(ARGS ... args) : _count(sizeof...(ARGS))
|
||||
{
|
||||
static_assert(sizeof...(ARGS) <= MAX, "Array too small!");
|
||||
_init(0, args...);
|
||||
}
|
||||
|
||||
void add(T const & obj)
|
||||
{
|
||||
if (_count == MAX) Genode::error("Array too small!");
|
||||
else _objs[_count++] = obj;
|
||||
}
|
||||
|
||||
template <typename FUNC>
|
||||
void for_each(FUNC f) const {
|
||||
for (unsigned i = 0; i < _count; i++) f(_objs[i]); }
|
||||
|
||||
unsigned count() const { return _count; }
|
||||
};
|
||||
|
||||
#endif /* _SRC__LIB__HW__ARRAY_H_ */
|
||||
@@ -22,7 +22,7 @@ namespace Hw { template <typename> struct Boot_info; }
|
||||
template <typename PLAT_INFO>
|
||||
struct Hw::Boot_info
|
||||
{
|
||||
using Mapping_pool = Array<Mapping, 32>;
|
||||
using Mapping_pool = Genode::Array<Mapping, 32>;
|
||||
|
||||
addr_t const table;
|
||||
addr_t const table_allocator;
|
||||
|
||||
@@ -45,7 +45,7 @@ struct Hw::Mmio_space : Hw::Memory_region_array
|
||||
void for_each_mapping(FUNC f) const
|
||||
{
|
||||
addr_t virt_base = Mm::core_mmio().base;
|
||||
auto lambda = [&] (Memory_region const & r) {
|
||||
auto lambda = [&] (unsigned, Memory_region const & r) {
|
||||
f(Mapping { r.base, virt_base, r.size, PAGE_FLAGS_KERN_IO });
|
||||
virt_base += r.size + get_page_size();
|
||||
};
|
||||
|
||||
@@ -15,13 +15,13 @@
|
||||
#define _SRC__LIB__HW__MEMORY_REGION_H_
|
||||
|
||||
#include <base/output.h>
|
||||
#include <hw/array.h>
|
||||
#include <util/array.h>
|
||||
#include <hw/util.h>
|
||||
|
||||
namespace Hw {
|
||||
|
||||
struct Memory_region;
|
||||
using Memory_region_array = Array<Memory_region, 16>;
|
||||
using Memory_region_array = Genode::Array<Memory_region, 16>;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -31,12 +31,12 @@ namespace Hw {
|
||||
|
||||
struct Hw::Page_flags
|
||||
{
|
||||
Writeable writeable;
|
||||
Executeable executable;
|
||||
Privileged privileged;
|
||||
Global global;
|
||||
Type type;
|
||||
Genode::Cache_attribute cacheable;
|
||||
Writeable writeable;
|
||||
Executeable executable;
|
||||
Privileged privileged;
|
||||
Global global;
|
||||
Type type;
|
||||
Genode::Cache cacheable;
|
||||
|
||||
void print(Genode::Output & out) const
|
||||
{
|
||||
|
||||
@@ -206,6 +206,9 @@ struct Hw::Arm_cpu
|
||||
/* Branch predictor invalidate all */
|
||||
ARM_CP15_REGISTER_32BIT(Bpimva, c7, c5, 0, 7);
|
||||
|
||||
/* Data Cache Invalidate by MVA to PoC */
|
||||
ARM_CP15_REGISTER_32BIT(Dcimvac, c7, c6, 0, 1);
|
||||
|
||||
/* Data Cache Clean by MVA to PoC */
|
||||
ARM_CP15_REGISTER_32BIT(Dccmvac, c7, c10, 0, 1);
|
||||
|
||||
|
||||
@@ -199,8 +199,8 @@ class Hw::Long_translation_table
|
||||
struct Attribute_index : Base::template Bitfield<2, 3>
|
||||
{
|
||||
enum {
|
||||
UNCACHED = Genode::Cache_attribute::UNCACHED,
|
||||
CACHED = Genode::Cache_attribute::CACHED,
|
||||
UNCACHED = Genode::Cache::UNCACHED,
|
||||
CACHED = Genode::Cache::CACHED,
|
||||
DEVICE
|
||||
};
|
||||
|
||||
|
||||
@@ -122,7 +122,7 @@ class Hw::Level_4_translation_table
|
||||
|
||||
static access_t create(Page_flags const &flags, addr_t const pa)
|
||||
{
|
||||
bool const wc = flags.cacheable == Genode::Cache_attribute::WRITE_COMBINED;
|
||||
bool const wc = flags.cacheable == Genode::Cache::WRITE_COMBINED;
|
||||
|
||||
return Common::create(flags)
|
||||
| G::bits(flags.global)
|
||||
@@ -303,7 +303,7 @@ class Hw::Page_directory
|
||||
static typename Base::access_t create(Page_flags const &flags,
|
||||
addr_t const pa)
|
||||
{
|
||||
bool const wc = flags.cacheable == Genode::Cache_attribute::WRITE_COMBINED;
|
||||
bool const wc = flags.cacheable == Genode::Cache::WRITE_COMBINED;
|
||||
|
||||
return Base::create(flags)
|
||||
| Base::Ps::bits(1)
|
||||
|
||||
@@ -17,22 +17,44 @@
|
||||
#include <cpu/cache.h>
|
||||
#include <util/misc_math.h>
|
||||
|
||||
using namespace Genode;
|
||||
|
||||
void Genode::cache_coherent(Genode::addr_t addr, Genode::size_t size)
|
||||
|
||||
template <typename FN>
|
||||
static void for_cachelines(addr_t addr, size_t size, FN const & fn)
|
||||
{
|
||||
using namespace Genode;
|
||||
|
||||
/**
|
||||
* The kernel accepts the 'cache_coherent_region' call for one designated
|
||||
* The kernel accepts the cache maintainance calls for one designated
|
||||
* page only. Otherwise, it just ignores the call to limit the time being
|
||||
* uninteruppptible in the kernel. Therefor, we have to loop if more than
|
||||
* uninteruppptible in the kernel. Therefore, we have to loop if more than
|
||||
* one page is affected by the given region.
|
||||
*/
|
||||
while (size) {
|
||||
addr_t next_page = align_addr(addr+1, get_page_size_log2());
|
||||
size_t s = min(size, next_page - addr);
|
||||
Kernel::cache_coherent_region(addr, s);
|
||||
fn(addr, s);
|
||||
addr += s;
|
||||
size -= s;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Genode::cache_coherent(addr_t addr, size_t size)
|
||||
{
|
||||
for_cachelines(addr, size, [] (addr_t addr, size_t size) {
|
||||
Kernel::cache_coherent_region(addr, size); });
|
||||
}
|
||||
|
||||
|
||||
void Genode::cache_clean_invalidate_data(addr_t addr, size_t size)
|
||||
{
|
||||
for_cachelines(addr, size, [] (addr_t addr, size_t size) {
|
||||
Kernel::cache_clean_invalidate_data_region(addr, size); });
|
||||
}
|
||||
|
||||
|
||||
void Genode::cache_invalidate_data(addr_t addr, size_t size)
|
||||
{
|
||||
for_cachelines(addr, size, [] (addr_t addr, size_t size) {
|
||||
Kernel::cache_invalidate_data_region(addr, size); });
|
||||
}
|
||||
|
||||
34
repos/base-linux/include/spec/arm_64/trace/timestamp.h
Normal file
34
repos/base-linux/include/spec/arm_64/trace/timestamp.h
Normal file
@@ -0,0 +1,34 @@
|
||||
/*
|
||||
* \brief Trace timestamp
|
||||
* \author Norman Feske
|
||||
* \date 2021-05-01
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2021 Genode Labs GmbH
|
||||
*
|
||||
* This file is part of the Genode OS framework, which is distributed
|
||||
* under the terms of the GNU Affero General Public License version 3.
|
||||
*/
|
||||
|
||||
#ifndef _INCLUDE__SPEC__ARM_64__TRACE__TIMESTAMP_H_
|
||||
#define _INCLUDE__SPEC__ARM_64__TRACE__TIMESTAMP_H_
|
||||
|
||||
#include <base/fixed_stdint.h>
|
||||
|
||||
namespace Genode { namespace Trace {
|
||||
|
||||
typedef uint64_t Timestamp;
|
||||
|
||||
/*
|
||||
* In Linux/AARCH64, the 'mrs' instruction cannot be executed in user land.
|
||||
* It triggers the abort of the program with an illegal-instruction
|
||||
* exception.
|
||||
*
|
||||
* By returning 0, we discharge the timestamp-based interpolation of
|
||||
* 'Timer::Connection::curr_time', falling back to a precision of 1 ms.
|
||||
*/
|
||||
inline Timestamp timestamp() { return 0; }
|
||||
} }
|
||||
|
||||
#endif /* _INCLUDE__SPEC__ARM_64__TRACE__TIMESTAMP_H_ */
|
||||
@@ -74,7 +74,7 @@ EXT_OBJECTS += $(shell $(CUSTOM_CC) $(CC_MARCH) -print-file-name=crtbegin.o)
|
||||
EXT_OBJECTS += $(shell $(CUSTOM_CC) $(CC_MARCH) -print-file-name=crtend.o)
|
||||
EXT_OBJECTS += $(shell $(CUSTOM_HOST_CC) $(CC_MARCH) -print-file-name=crtn.o)
|
||||
|
||||
LX_LIBS_OPT += -lgcc -lgcc_s -lsupc++ -lc -lpthread
|
||||
LX_LIBS_OPT += -lgcc_s -lsupc++ -lc -lpthread -lgcc
|
||||
|
||||
USE_HOST_LD_SCRIPT = yes
|
||||
|
||||
@@ -98,6 +98,11 @@ CXX_LINK_OPT += -Wl,--dynamic-linker=/lib/ld-linux.so.3
|
||||
LD_SCRIPT_STATIC = ldscripts/armelf_linux_eabi.xc
|
||||
endif
|
||||
|
||||
ifeq (arm_64,$(findstring arm_64,$(SPECS)))
|
||||
CXX_LINK_OPT += -Wl,--dynamic-linker=/lib/ld-linux-aarch64.so.1
|
||||
LD_SCRIPT_STATIC = /usr/lib/aarch64-linux-gnu/ldscripts/aarch64elf.xc
|
||||
endif
|
||||
|
||||
#
|
||||
# Because we use the host compiler's libgcc, omit the Genode toolchain's
|
||||
# version and put all libraries here we depend on.
|
||||
|
||||
@@ -11,6 +11,7 @@ HOST_INC_DIR += /usr/include/$(shell $(CUSTOM_HOST_CC) -dumpmachine)
|
||||
#
|
||||
HOST_INC_DIR += /usr/include/i386-linux-gnu
|
||||
HOST_INC_DIR += /usr/include/x86_64-linux-gnu
|
||||
HOST_INC_DIR += /usr/include/aarch64-linux-gnu
|
||||
|
||||
#
|
||||
# Some header files installed on GNU/Linux test for the GNU compiler. For
|
||||
|
||||
69
repos/base-linux/lib/mk/core-linux.inc
Normal file
69
repos/base-linux/lib/mk/core-linux.inc
Normal file
@@ -0,0 +1,69 @@
|
||||
GEN_CORE_DIR := $(BASE_DIR)/src/core
|
||||
LIBS := syscall-linux
|
||||
BOARD ?= unknown
|
||||
|
||||
SRC_CC := main.cc \
|
||||
platform.cc \
|
||||
platform_thread.cc \
|
||||
platform_services.cc \
|
||||
pd_session_component.cc \
|
||||
ram_dataspace_support.cc \
|
||||
rom_session_component.cc \
|
||||
cpu_session_component.cc \
|
||||
cpu_session_support.cc \
|
||||
cpu_thread_component.cc \
|
||||
pd_session_support.cc \
|
||||
dataspace_component.cc \
|
||||
native_pd_component.cc \
|
||||
native_cpu_component.cc \
|
||||
capability_space.cc \
|
||||
rpc_cap_factory_linux.cc \
|
||||
ram_dataspace_factory.cc \
|
||||
core_rpc_cap_alloc.cc \
|
||||
io_mem_session_component.cc \
|
||||
irq_session_component.cc \
|
||||
signal_source_component.cc \
|
||||
signal_transmitter_proxy.cc \
|
||||
signal_receiver.cc \
|
||||
trace_session_component.cc \
|
||||
thread_linux.cc \
|
||||
stack_area.cc \
|
||||
core_log.cc \
|
||||
core_log_out.cc \
|
||||
default_log.cc \
|
||||
env_reinit.cc \
|
||||
heartbeat.cc \
|
||||
thread.cc \
|
||||
thread_myself.cc
|
||||
|
||||
INC_DIR += $(REP_DIR)/src/core/include \
|
||||
$(GEN_CORE_DIR)/include \
|
||||
$(REP_DIR)/src/platform \
|
||||
$(REP_DIR)/src/include \
|
||||
$(BASE_DIR)/src/include
|
||||
|
||||
vpath main.cc $(GEN_CORE_DIR)
|
||||
vpath pd_session_component.cc $(GEN_CORE_DIR)
|
||||
vpath core_log.cc $(GEN_CORE_DIR)
|
||||
vpath cpu_session_component.cc $(GEN_CORE_DIR)
|
||||
vpath cpu_session_support.cc $(GEN_CORE_DIR)
|
||||
vpath cpu_thread_component.cc $(GEN_CORE_DIR)
|
||||
vpath pd_upgrade_ram_quota.cc $(GEN_CORE_DIR)
|
||||
vpath pd_session_support.cc $(GEN_CORE_DIR)
|
||||
vpath capability_space.cc $(GEN_CORE_DIR)
|
||||
vpath ram_dataspace_factory.cc $(GEN_CORE_DIR)
|
||||
vpath signal_source_component.cc $(GEN_CORE_DIR)
|
||||
vpath signal_transmitter_proxy.cc $(GEN_CORE_DIR)
|
||||
vpath signal_receiver.cc $(GEN_CORE_DIR)
|
||||
vpath trace_session_component.cc $(GEN_CORE_DIR)
|
||||
vpath default_log.cc $(GEN_CORE_DIR)
|
||||
vpath heartbeat.cc $(GEN_CORE_DIR)
|
||||
vpath thread.cc $(BASE_DIR)/src/lib/base
|
||||
vpath thread_myself.cc $(BASE_DIR)/src/lib/base
|
||||
vpath trace.cc $(BASE_DIR)/src/lib/base
|
||||
vpath env_reinit.cc $(REP_DIR)/src/lib/base
|
||||
vpath dataspace_component.cc $(REP_DIR)/src/core/spec/$(BOARD)
|
||||
vpath io_mem_session_component.cc $(REP_DIR)/src/core/spec/$(BOARD)
|
||||
vpath irq_session_component.cc $(REP_DIR)/src/core/spec/$(BOARD)
|
||||
vpath platform_services.cc $(REP_DIR)/src/core/spec/$(BOARD)
|
||||
vpath %.cc $(REP_DIR)/src/core
|
||||
1
repos/base-linux/lib/mk/core-linux.mk
Normal file
1
repos/base-linux/lib/mk/core-linux.mk
Normal file
@@ -0,0 +1 @@
|
||||
include $(REP_DIR)/lib/mk/core-linux.inc
|
||||
3
repos/base-linux/lib/mk/spec/arm_64/base-linux.mk
Normal file
3
repos/base-linux/lib/mk/spec/arm_64/base-linux.mk
Normal file
@@ -0,0 +1,3 @@
|
||||
LIBS += timeout-arm
|
||||
|
||||
include $(REP_DIR)/lib/mk/base-linux.mk
|
||||
3
repos/base-linux/lib/mk/spec/arm_64/ld-linux.mk
Normal file
3
repos/base-linux/lib/mk/spec/arm_64/ld-linux.mk
Normal file
@@ -0,0 +1,3 @@
|
||||
BASE_LIBS += base-linux-common base-linux
|
||||
|
||||
include $(BASE_DIR)/lib/mk/spec/arm_64/ld-platform.inc
|
||||
3
repos/base-linux/lib/mk/spec/arm_64/seccomp.mk
Normal file
3
repos/base-linux/lib/mk/spec/arm_64/seccomp.mk
Normal file
@@ -0,0 +1,3 @@
|
||||
SRC_BIN += seccomp_bpf_policy.bin
|
||||
|
||||
vpath seccomp_bpf_policy.bin $(REP_DIR)/src/lib/seccomp/spec/arm_64
|
||||
1
repos/base-linux/lib/mk/spec/arm_64/startup-linux.mk
Normal file
1
repos/base-linux/lib/mk/spec/arm_64/startup-linux.mk
Normal file
@@ -0,0 +1 @@
|
||||
include $(BASE_DIR)/lib/mk/spec/arm_64/startup.inc
|
||||
5
repos/base-linux/lib/mk/spec/arm_64/syscall-linux.mk
Normal file
5
repos/base-linux/lib/mk/spec/arm_64/syscall-linux.mk
Normal file
@@ -0,0 +1,5 @@
|
||||
SRC_S += lx_clone.S
|
||||
SRC_S += lx_syscall.S
|
||||
|
||||
vpath lx_clone.S $(REP_DIR)/src/lib/syscall/spec/arm_64
|
||||
vpath lx_syscall.S $(REP_DIR)/src/lib/syscall/spec/arm_64
|
||||
7
repos/base-linux/lib/mk/spec/x86/core-linux.mk
Normal file
7
repos/base-linux/lib/mk/spec/x86/core-linux.mk
Normal file
@@ -0,0 +1,7 @@
|
||||
include $(REP_DIR)/lib/mk/core-linux.inc
|
||||
|
||||
SRC_CC += io_port_session_support.cc \
|
||||
io_port_session_component.cc
|
||||
|
||||
vpath io_port_session_support.cc $(GEN_CORE_DIR)/spec/x86
|
||||
vpath io_port_session_component.cc $(REP_DIR)/src/core/spec/$(BOARD)
|
||||
@@ -1,4 +1,4 @@
|
||||
FROM_BASE_LINUX := etc src/lib/syscall src/lib/lx_hybrid lib/import
|
||||
FROM_BASE_LINUX := etc src/lib/syscall src/lib/lx_hybrid lib/import include
|
||||
FROM_BASE_LINUX_AND_BASE := lib/mk src/lib/base src/include
|
||||
FROM_BASE := src/lib/timeout
|
||||
|
||||
|
||||
@@ -1 +1 @@
|
||||
2021-03-11 4ab4ab408aa38109d6f12f402f477667c90229da
|
||||
2021-08-17 c3bcd7753faa8b48d9013a45b69edfa2a16695e4
|
||||
|
||||
@@ -6,10 +6,10 @@ lib/import src/ld:
|
||||
$(mirror_from_rep_dir)
|
||||
|
||||
content:
|
||||
for spec in x86_32 x86_64 arm; do \
|
||||
for spec in x86_32 x86_64 arm arm_64; do \
|
||||
mv lib/mk/spec/$$spec/ld-linux.mk lib/mk/spec/$$spec/ld.mk; done;
|
||||
sed -i "s/core-linux/core/" src/core/linux/target.mk
|
||||
sed -i "s/BOARD.*unknown/BOARD := linux/" src/core/linux/target.mk
|
||||
sed -i "/TARGET/s/core-linux/core/" src/core/linux/target.mk
|
||||
sed -i "s/BOARD.*unknown/BOARD := linux/" lib/mk/core-linux.inc
|
||||
sed -i "s/ld-linux/ld/" src/lib/ld/linux/target.mk
|
||||
sed -i "s/linux_timer_drv/timer/" src/timer/linux/target.mk
|
||||
rm -rf src/lib/initramfs
|
||||
|
||||
@@ -1 +1 @@
|
||||
2021-03-11 2847f916b65cee82243e88b9ac37550148f46dc5
|
||||
2021-08-28 6b854a47a41ca0e70bf06c52f158f50a444e6a18
|
||||
|
||||
@@ -51,9 +51,10 @@ install_config {
|
||||
}
|
||||
|
||||
#
|
||||
# Create test-directory structure
|
||||
# Create test-directory structure and ensure it is empty
|
||||
#
|
||||
|
||||
exec rm -rf bin/libc_vfs
|
||||
exec mkdir -p bin/libc_vfs
|
||||
|
||||
#
|
||||
|
||||
436
repos/base-linux/run/lx_fs_notify.run
Normal file
436
repos/base-linux/run/lx_fs_notify.run
Normal file
@@ -0,0 +1,436 @@
|
||||
#
|
||||
# \brief Test for using the lx_fs_notify plugin with the Linux file system
|
||||
# \author Pirmin Duss
|
||||
# \date 2019-12-05
|
||||
#
|
||||
|
||||
assert_spec linux
|
||||
|
||||
#
|
||||
# Build
|
||||
#
|
||||
|
||||
create_boot_directory
|
||||
|
||||
import_from_depot [depot_user]/src/[base_src]
|
||||
import_from_depot [depot_user]/src/chroot
|
||||
import_from_depot [depot_user]/src/fs_rom
|
||||
import_from_depot [depot_user]/src/init
|
||||
import_from_depot [depot_user]/src/libc
|
||||
import_from_depot [depot_user]/src/stdcxx
|
||||
import_from_depot [depot_user]/src/posix
|
||||
import_from_depot [depot_user]/src/vfs
|
||||
|
||||
build {
|
||||
server/lx_fs
|
||||
test/lx_fs_notify/rom_log
|
||||
test/lx_fs_notify/file_writer
|
||||
}
|
||||
|
||||
#
|
||||
# init config
|
||||
#
|
||||
install_config {
|
||||
<config>
|
||||
<parent-provides>
|
||||
<service name="CPU"/>
|
||||
<service name="LOG"/>
|
||||
<service name="PD"/>
|
||||
<service name="RM"/>
|
||||
<service name="ROM"/>
|
||||
</parent-provides>
|
||||
<default-route>
|
||||
<any-service> <parent/> <any-child/> </any-service>
|
||||
</default-route>
|
||||
<default caps="100"/>
|
||||
|
||||
<start name="lx_fs" caps="200" ld="no">
|
||||
<resource name="RAM" quantum="4M"/>
|
||||
<provides> <service name="File_system"/> </provides>
|
||||
<config>
|
||||
<policy label_prefix="fs_rom_config" root="/lx_fs_notify" writeable="no"/>
|
||||
<policy label_prefix="fs_rom_test" root="/lx_fs_notify/test" writeable="no"/>
|
||||
<policy label_suffix="templates" root="/lx_fs_notify/templates" writeable="yes"/>
|
||||
<policy label_suffix="test" root="/lx_fs_notify/test" writeable="yes"/>
|
||||
</config>
|
||||
</start>
|
||||
|
||||
<start name="fs_rom_config">
|
||||
<binary name="fs_rom"/>
|
||||
<resource name="RAM" quantum="8M"/>
|
||||
<provides> <service name="ROM"/> </provides>
|
||||
<route>
|
||||
<service name="File_system"> <child name="lx_fs"/> </service>
|
||||
<any-service> <parent/> <any-child/> </any-service>
|
||||
</route>
|
||||
</start>
|
||||
|
||||
<start name="fs_rom_test">
|
||||
<binary name="fs_rom"/>
|
||||
<resource name="RAM" quantum="40M"/>
|
||||
<provides> <service name="ROM"/> </provides>
|
||||
<route>
|
||||
<service name="File_system"> <child name="lx_fs"/> </service>
|
||||
<any-service> <parent/> <any-child/> </any-service>
|
||||
</route>
|
||||
</start>
|
||||
|
||||
<start name="test-rom_log">
|
||||
<resource name="RAM" quantum="8M"/>
|
||||
<route>
|
||||
<service name="ROM" label="outfile.txt"> <child name="fs_rom_test"/> </service>
|
||||
<any-service> <parent/> <any-child/> </any-service>
|
||||
</route>
|
||||
</start>
|
||||
|
||||
<start name="init" caps="4000">
|
||||
<resource name="RAM" quantum="300M"/>
|
||||
<route>
|
||||
<service name="File_system"> <child name="lx_fs"/> </service>
|
||||
<service name="ROM" label="config"> <child name="fs_rom_config" label="init.config"/> </service>
|
||||
<any-service> <parent/> <any-child/> </any-service>
|
||||
</route>
|
||||
</start>
|
||||
|
||||
</config>
|
||||
}
|
||||
|
||||
#
|
||||
# configurations for the sub init
|
||||
#
|
||||
set init_run_fwrite_test {
|
||||
<config>
|
||||
<parent-provides>
|
||||
<service name="CPU"/>
|
||||
<service name="LOG"/>
|
||||
<service name="PD"/>
|
||||
<service name="RM"/>
|
||||
<service name="ROM"/>
|
||||
<service name="Timer"/>
|
||||
<service name="File_system"/>
|
||||
</parent-provides>
|
||||
<default-route>
|
||||
<any-service> <parent/> <any-child/> </any-service>
|
||||
</default-route>
|
||||
<default caps="100"/>
|
||||
|
||||
<start name="test-file_writer" caps="300" version="1">
|
||||
<resource name="RAM" quantum="16M"/>
|
||||
<config>
|
||||
<libc stdout="/dev/log" stderr="/dev/log"/>
|
||||
<vfs>
|
||||
<dir name="dev">
|
||||
<log/>
|
||||
<null/>
|
||||
</dir>
|
||||
<dir name="templates"> <fs label="templates"/> </dir>
|
||||
<dir name="test"> <fs label="test"/> </dir>
|
||||
</vfs>
|
||||
<arg value="test-file_writer"/>
|
||||
<arg value="--fwrite"/>
|
||||
<arg value="templates/infile.txt"/>
|
||||
<arg value="test/outfile.txt"/>
|
||||
</config>
|
||||
</start>
|
||||
</config>
|
||||
}
|
||||
|
||||
set init_run_write_test {
|
||||
<config>
|
||||
<parent-provides>
|
||||
<service name="CPU"/>
|
||||
<service name="LOG"/>
|
||||
<service name="PD"/>
|
||||
<service name="RM"/>
|
||||
<service name="ROM"/>
|
||||
<service name="Timer"/>
|
||||
<service name="File_system"/>
|
||||
</parent-provides>
|
||||
<default-route>
|
||||
<any-service> <parent/> <any-child/> </any-service>
|
||||
</default-route>
|
||||
<default caps="100"/>
|
||||
|
||||
<start name="test-file_writer" caps="300" version="2">
|
||||
<resource name="RAM" quantum="16M"/>
|
||||
<config>
|
||||
<libc stdout="/dev/log" stderr="/dev/log"/>
|
||||
<vfs>
|
||||
<dir name="dev">
|
||||
<log/>
|
||||
<null/>
|
||||
</dir>
|
||||
<dir name="templates"> <fs label="templates"/> </dir>
|
||||
<dir name="test"> <fs label="test"/> </dir>
|
||||
</vfs>
|
||||
<arg value="test-file_writer"/>
|
||||
<arg value="--write"/>
|
||||
<arg value="templates/infile.txt"/>
|
||||
<arg value="test/outfile.txt"/>
|
||||
</config>
|
||||
</start>
|
||||
</config>
|
||||
}
|
||||
|
||||
set test_iterations 10
|
||||
set input_file_name "bin/lx_fs_notify/templates/infile.txt"
|
||||
set output_file_name "bin/lx_fs_notify/test/outfile.txt"
|
||||
|
||||
#
|
||||
# print text in colors
|
||||
#
|
||||
proc color {foreground text} {
|
||||
# tput is a little Unix utility that lets you use the termcap database
|
||||
# *much* more easily...
|
||||
return [exec tput setaf $foreground]$text[exec tput sgr0]
|
||||
}
|
||||
|
||||
#
|
||||
# write the desired config for the sub init
|
||||
#
|
||||
proc write_init_config { config } {
|
||||
set fd [open "bin/lx_fs_notify/init.config" "w"]
|
||||
puts $fd $config
|
||||
close $fd
|
||||
}
|
||||
|
||||
#
|
||||
# clear the content of the init config
|
||||
#
|
||||
proc write_empty_init_config { } {
|
||||
set fd [open "bin/lx_fs_notify/init.config" "w"]
|
||||
puts $fd ""
|
||||
close $fd
|
||||
}
|
||||
|
||||
#
|
||||
# wait for an update to the test file and check
|
||||
#
|
||||
proc wait_file_changed { file_size additional_filter } {
|
||||
global spawn_id
|
||||
|
||||
puts [color 3 "wait for file change with size=$file_size"]
|
||||
set timeout 5
|
||||
expect {
|
||||
-i $spawn_id -re ".*init -> test-rom_log.*updated ROM content: size=$file_size.*\n" { }
|
||||
timeout {
|
||||
puts [color 1 "ERROR no file change or wrong file size reported. expected size was $file_size"]
|
||||
exit -4
|
||||
}
|
||||
}
|
||||
|
||||
if { $additional_filter != {} } {
|
||||
set wait_re ".*$additional_filter\n"
|
||||
set timeout 3
|
||||
expect {
|
||||
-i $spawn_id -re $wait_re { }
|
||||
timeout { }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#
|
||||
# wait for a defined time
|
||||
#
|
||||
proc wait_and_consume_log { delay_sec } {
|
||||
global spawn_id
|
||||
|
||||
set timeout $delay_sec
|
||||
expect {
|
||||
-i $spawn_id -re { text that never is printed during the test } { }
|
||||
timeout { }
|
||||
}
|
||||
after 10
|
||||
}
|
||||
|
||||
#
|
||||
# create the input file for a test
|
||||
#
|
||||
proc create_test_file { input_file_name } {
|
||||
exec seq -w [expr int(rand()*4000)+1] > $input_file_name
|
||||
set file_size [exec stat -c%s $input_file_name]
|
||||
return $file_size
|
||||
}
|
||||
|
||||
#
|
||||
# create output file
|
||||
#
|
||||
proc create_output_file { output_file_name } {
|
||||
exec seq -w [expr int(rand()*400)+1] > $output_file_name
|
||||
set file_size [exec stat -c%s $output_file_name]
|
||||
return $file_size
|
||||
}
|
||||
|
||||
#
|
||||
# compute the size of the ROM from the file size
|
||||
#
|
||||
proc rom_size { file_size } {
|
||||
if { [expr $file_size % 4096] == 0 } {
|
||||
return $file_size
|
||||
} else {
|
||||
return [expr $file_size + (4096 - ($file_size % 4096))]
|
||||
}
|
||||
}
|
||||
|
||||
#
|
||||
# Create test-directory structure
|
||||
#
|
||||
exec rm -Rf bin/lx_fs_notify
|
||||
exec mkdir -p bin/lx_fs_notify/templates
|
||||
exec mkdir -p bin/lx_fs_notify/test
|
||||
exec mkdir -p bin/lx_fs_notify/mnt
|
||||
|
||||
#
|
||||
# Boot modules
|
||||
#
|
||||
build_boot_image { lx_fs test-rom_log test-file_writer lx_fs_notify }
|
||||
|
||||
#
|
||||
# build the test program for Linux
|
||||
# this wil bel located in /tmp/bin
|
||||
#
|
||||
exec make -C [genode_dir]/repos/os/src/test/lx_fs_notify/file_writer/
|
||||
|
||||
#
|
||||
# Test cases
|
||||
#
|
||||
proc test_libc_fwrite_in_genode { test_iterations init_run_fwrite_test input_file_name output_file_name } {
|
||||
puts [color 2 ">>> run libc fwrite test in Genode ($test_iterations iterations)"]
|
||||
set size [create_output_file $output_file_name]
|
||||
for { set it 0 } { $it < $test_iterations } { incr it } {
|
||||
set size [create_test_file $input_file_name]
|
||||
wait_and_consume_log 1
|
||||
write_init_config $init_run_fwrite_test
|
||||
wait_file_changed $size {child "test-file_writer" exited with exit value 0}
|
||||
write_empty_init_config
|
||||
}
|
||||
}
|
||||
|
||||
proc test_libc_write_in_genode { test_iterations init_run_write_test input_file_name output_file_name } {
|
||||
puts [color 2 ">>> run libc write test in Genode ($test_iterations iterations)"]
|
||||
set size [create_output_file $output_file_name]
|
||||
for { set it 0 } { $it < $test_iterations } { incr it } {
|
||||
set size [expr max([create_test_file $input_file_name], $size)]
|
||||
wait_and_consume_log 1
|
||||
write_init_config $init_run_write_test
|
||||
wait_file_changed $size {child "test-file_writer" exited with exit value 0}
|
||||
write_empty_init_config
|
||||
}
|
||||
}
|
||||
|
||||
proc test_libc_fwrite_on_linux { test_iterations input_file_name output_file_name } {
|
||||
puts [color 2 ">>> run libc fwrite test on Linux ($test_iterations iterations)"]
|
||||
write_empty_init_config
|
||||
create_output_file $output_file_name
|
||||
for { set it 0 } { $it < $test_iterations } { incr it } {
|
||||
set size [create_test_file $input_file_name]
|
||||
wait_and_consume_log 1
|
||||
exec /tmp/bin/file_writer --fwrite [run_dir]/genode/lx_fs_notify/templates/infile.txt [run_dir]/genode/lx_fs_notify/test/outfile.txt
|
||||
wait_file_changed $size {}
|
||||
}
|
||||
}
|
||||
|
||||
proc test_libc_write_on_linux { test_iterations input_file_name output_file_name } {
|
||||
puts [color 2 ">>> run libc write test on Linux ($test_iterations iterations)"]
|
||||
write_empty_init_config
|
||||
set size [create_output_file $output_file_name]
|
||||
for { set it 0 } { $it < $test_iterations } { incr it } {
|
||||
set size [expr max([create_test_file $input_file_name], $size)]
|
||||
wait_and_consume_log 1
|
||||
exec /tmp/bin/file_writer --write [run_dir]/genode/lx_fs_notify/templates/infile.txt [run_dir]/genode/lx_fs_notify/test/outfile.txt
|
||||
wait_file_changed $size {}
|
||||
}
|
||||
}
|
||||
|
||||
proc test_tcl_file_copy { test_iterations input_file_name output_file_name} {
|
||||
puts [color 2 ">>> run TCL 'file copy' test ($test_iterations iterations)"]
|
||||
for { set it 0 } { $it < $test_iterations } { incr it } {
|
||||
set size [create_test_file $input_file_name]
|
||||
file copy -force $input_file_name $output_file_name
|
||||
wait_file_changed $size {}
|
||||
}
|
||||
}
|
||||
|
||||
proc test_shell_cp { test_iterations input_file_name output_file_name } {
|
||||
puts [color 2 ">>> run shell 'cp' test ($test_iterations iterations)"]
|
||||
for { set it 0 } { $it < $test_iterations } { incr it } {
|
||||
set size [create_test_file $input_file_name]
|
||||
exec cp -f $input_file_name $output_file_name
|
||||
wait_file_changed $size {}
|
||||
}
|
||||
}
|
||||
|
||||
proc test_shell_mv_overwrite { test_iterations input_file_name output_file_name } {
|
||||
create_output_file $output_file_name
|
||||
puts [color 2 ">>> run shell 'mv' overwrite test ($test_iterations iterations)"]
|
||||
for { set it 0 } { $it < $test_iterations } { incr it } {
|
||||
set size [create_test_file $input_file_name]
|
||||
exec mv $input_file_name $output_file_name
|
||||
wait_file_changed $size {}
|
||||
}
|
||||
}
|
||||
|
||||
proc test_shell_mv_rename { test_iterations } {
|
||||
global output_file_name
|
||||
puts [color 2 ">>> run 'mv' rename watched file test ($test_iterations iterations)"]
|
||||
for { set it 0 } { $it < $test_iterations } { incr it } {
|
||||
puts "create watched file"
|
||||
set size [create_output_file $output_file_name]
|
||||
wait_file_changed $size {}
|
||||
puts "move watched file away"
|
||||
exec mv $output_file_name $output_file_name.out
|
||||
wait_file_changed 0 {}
|
||||
}
|
||||
}
|
||||
|
||||
proc test_shell_mv_move_other_dir { test_iterations } {
|
||||
global input_file_name
|
||||
global output_file_name
|
||||
puts [color 2 ">>> run 'mv' move watched file to other directory test ($test_iterations iterations)"]
|
||||
for { set it 0 } { $it < $test_iterations } { incr it } {
|
||||
puts "create watched file"
|
||||
set size [create_output_file $output_file_name]
|
||||
wait_file_changed $size {}
|
||||
puts "move watched file away"
|
||||
exec mv $output_file_name $input_file_name
|
||||
wait_file_changed 0 {}
|
||||
}
|
||||
}
|
||||
|
||||
proc test_shell_rm { test_iterations output_file_name } {
|
||||
puts [color 2 ">>> run 'rm' remove watched file test ($test_iterations iterations)"]
|
||||
for { set it 0 } { $it < $test_iterations } { incr it } {
|
||||
puts "create watched file"
|
||||
set size [create_output_file $output_file_name]
|
||||
wait_file_changed $size {}
|
||||
puts "remove watched file"
|
||||
exec rm -f $output_file_name
|
||||
wait_file_changed 0 {}
|
||||
}
|
||||
}
|
||||
|
||||
#
|
||||
# Execute test cases
|
||||
#
|
||||
# wait until the test program has started
|
||||
run_genode_until ".*wait for ROM update.*\n" 6
|
||||
set spawn_id [output_spawn_id]
|
||||
wait_and_consume_log 3
|
||||
|
||||
test_libc_fwrite_in_genode $test_iterations $init_run_fwrite_test $input_file_name $output_file_name
|
||||
test_libc_write_in_genode $test_iterations $init_run_write_test $input_file_name $output_file_name
|
||||
test_libc_fwrite_on_linux $test_iterations $input_file_name $output_file_name
|
||||
test_libc_write_on_linux $test_iterations $input_file_name $output_file_name
|
||||
test_tcl_file_copy $test_iterations $input_file_name $output_file_name
|
||||
test_shell_cp $test_iterations $input_file_name $output_file_name
|
||||
test_shell_mv_overwrite $test_iterations $input_file_name $output_file_name
|
||||
test_shell_mv_rename $test_iterations
|
||||
test_shell_mv_move_other_dir $test_iterations
|
||||
test_shell_rm $test_iterations $output_file_name
|
||||
|
||||
#
|
||||
# Cleanup test-directory structure
|
||||
#
|
||||
exec rm -Rf bin/lx_fs_notify
|
||||
|
||||
# vi: set ft=tcl :
|
||||
@@ -32,7 +32,7 @@
|
||||
|
||||
inline int lx_mkdir(char const *pathname, mode_t mode)
|
||||
{
|
||||
return lx_syscall(SYS_mkdir, pathname, mode);
|
||||
return lx_syscall(SYS_mkdirat, AT_FDCWD, pathname, mode);
|
||||
}
|
||||
|
||||
|
||||
@@ -44,7 +44,7 @@ inline int lx_ftruncate(int fd, unsigned long length)
|
||||
|
||||
inline int lx_unlink(const char *fname)
|
||||
{
|
||||
return lx_syscall(SYS_unlink, fname);
|
||||
return lx_syscall(SYS_unlinkat, AT_FDCWD, fname, 0);
|
||||
}
|
||||
|
||||
|
||||
@@ -52,19 +52,30 @@ inline int lx_unlink(const char *fname)
|
||||
** Functions used by core's rom-session support code **
|
||||
*******************************************************/
|
||||
|
||||
inline int lx_open(const char *pathname, int flags, mode_t mode = 0)
|
||||
inline int lx_open(char const *pathname, int flags, mode_t mode = 0)
|
||||
{
|
||||
return lx_syscall(SYS_open, pathname, flags, mode);
|
||||
return lx_syscall(SYS_openat, AT_FDCWD, pathname, flags, mode);
|
||||
}
|
||||
|
||||
|
||||
inline int lx_stat(const char *path, struct stat64 *buf)
|
||||
inline int lx_stat_size(char const *path, Genode::uint64_t &out_size)
|
||||
{
|
||||
#ifdef _LP64
|
||||
return lx_syscall(SYS_stat, path, buf);
|
||||
#ifdef __aarch64__
|
||||
struct statx buf { };
|
||||
int result = lx_syscall(SYS_statx, AT_FDCWD, path, 0, STATX_SIZE, &buf);
|
||||
out_size = buf.stx_size;
|
||||
#else
|
||||
return lx_syscall(SYS_stat64, path, buf);
|
||||
#ifdef _LP64
|
||||
struct stat buf { };
|
||||
int result = lx_syscall(SYS_stat, path, &buf);
|
||||
out_size = buf.st_size;
|
||||
#else
|
||||
struct stat64 buf { };
|
||||
int result = lx_syscall(SYS_stat64, path, &buf);
|
||||
out_size = buf.st_size;
|
||||
#endif
|
||||
#endif
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
@@ -119,7 +130,7 @@ inline int lx_kill(int pid, int signal)
|
||||
}
|
||||
|
||||
|
||||
inline int lx_create_process(int (*entry)(void *), void *stack, void *arg)
|
||||
inline int lx_create_process(int (*entry)(), void *stack)
|
||||
{
|
||||
/*
|
||||
* The low byte of the flags denotes the signal to be sent to the parent
|
||||
@@ -127,7 +138,7 @@ inline int lx_create_process(int (*entry)(void *), void *stack, void *arg)
|
||||
* this condition.
|
||||
*/
|
||||
int const flags = CLONE_VFORK | LX_SIGCHLD;
|
||||
return lx_clone((int (*)(void *))entry, stack, flags, arg);
|
||||
return lx_clone((int (*)())entry, stack, flags);
|
||||
}
|
||||
|
||||
|
||||
@@ -253,7 +264,7 @@ inline int lx_connect(int sockfd, const struct sockaddr *serv_addr,
|
||||
|
||||
inline int lx_pipe(int pipefd[2])
|
||||
{
|
||||
return lx_syscall(SYS_pipe, pipefd);
|
||||
return lx_syscall(SYS_pipe2, pipefd, 0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -74,8 +74,7 @@ class Genode::Dataspace_component : public Rpc_object<Linux_dataspace>
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
Dataspace_component(size_t size, addr_t addr,
|
||||
Cache_attribute, bool writable,
|
||||
Dataspace_component(size_t size, addr_t addr, Cache, bool writable,
|
||||
Dataspace_owner * owner)
|
||||
:
|
||||
_size(size), _addr(addr), _cap(), _writable(writable), _owner(owner)
|
||||
@@ -94,7 +93,7 @@ class Genode::Dataspace_component : public Rpc_object<Linux_dataspace>
|
||||
* reasons and should not be used.
|
||||
*/
|
||||
Dataspace_component(size_t size, addr_t, addr_t phys_addr,
|
||||
Cache_attribute, bool writable, Dataspace_owner *_owner);
|
||||
Cache, bool writable, Dataspace_owner *_owner);
|
||||
|
||||
/**
|
||||
* This constructor is especially used for ROM dataspaces
|
||||
|
||||
@@ -34,9 +34,9 @@ class Genode::Io_mem_session_component : public Rpc_object<Io_mem_session>
|
||||
Rpc_entrypoint &_ds_ep;
|
||||
Io_mem_dataspace_capability _ds_cap;
|
||||
|
||||
size_t get_arg_size(const char *);
|
||||
addr_t get_arg_phys(const char *);
|
||||
Cache_attribute get_arg_wc(const char *);
|
||||
size_t get_arg_size(char const *);
|
||||
addr_t get_arg_phys(char const *);
|
||||
Cache get_arg_wc (char const *);
|
||||
|
||||
public:
|
||||
|
||||
|
||||
@@ -75,7 +75,7 @@ class Genode::Platform : public Platform_generic
|
||||
bool valid_addr(addr_t ) const override { ASSERT_NEVER_CALLED; }
|
||||
bool alloc(size_t, void **) override { ASSERT_NEVER_CALLED; }
|
||||
|
||||
Alloc_return alloc_aligned(size_t, void **, int, addr_t, addr_t) override
|
||||
Alloc_return alloc_aligned(size_t, void **, unsigned, Range) override
|
||||
{ ASSERT_NEVER_CALLED; }
|
||||
|
||||
Alloc_return alloc_addr(size_t, addr_t) override
|
||||
@@ -94,10 +94,9 @@ class Genode::Platform : public Platform_generic
|
||||
return true;
|
||||
}
|
||||
|
||||
Alloc_return alloc_aligned(size_t, void **out_addr, int,
|
||||
addr_t, addr_t) override
|
||||
Alloc_return alloc_aligned(size_t, void **out, unsigned, Range) override
|
||||
{
|
||||
*out_addr = 0;
|
||||
*out = 0;
|
||||
return Alloc_return::OK;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,83 +1,10 @@
|
||||
TARGET = core-linux
|
||||
REQUIRES = linux
|
||||
LIBS = cxx base-linux-common syscall-linux startup-linux
|
||||
TARGET := core-linux
|
||||
REQUIRES := linux
|
||||
LIBS := cxx base-linux-common startup-linux core-linux
|
||||
BOARD ?= unknown
|
||||
|
||||
BOARD ?= unknown
|
||||
include $(BASE_DIR)/src/core/version.inc
|
||||
|
||||
GEN_CORE_DIR = $(BASE_DIR)/src/core
|
||||
|
||||
SRC_CC = main.cc \
|
||||
platform.cc \
|
||||
platform_thread.cc \
|
||||
platform_services.cc \
|
||||
pd_session_component.cc \
|
||||
ram_dataspace_support.cc \
|
||||
rom_session_component.cc \
|
||||
cpu_session_component.cc \
|
||||
cpu_session_support.cc \
|
||||
cpu_thread_component.cc \
|
||||
pd_session_support.cc \
|
||||
dataspace_component.cc \
|
||||
native_pd_component.cc \
|
||||
native_cpu_component.cc \
|
||||
capability_space.cc \
|
||||
rpc_cap_factory_linux.cc \
|
||||
ram_dataspace_factory.cc \
|
||||
core_rpc_cap_alloc.cc \
|
||||
io_mem_session_component.cc \
|
||||
io_port_session_component.cc \
|
||||
io_port_session_support.cc \
|
||||
irq_session_component.cc \
|
||||
signal_source_component.cc \
|
||||
signal_transmitter_proxy.cc \
|
||||
signal_receiver.cc \
|
||||
trace_session_component.cc \
|
||||
thread_linux.cc \
|
||||
stack_area.cc \
|
||||
core_log.cc \
|
||||
core_log_out.cc \
|
||||
default_log.cc \
|
||||
env_reinit.cc \
|
||||
heartbeat.cc \
|
||||
thread.cc \
|
||||
thread_myself.cc
|
||||
|
||||
INC_DIR += $(REP_DIR)/src/core/include \
|
||||
$(GEN_CORE_DIR)/include \
|
||||
$(REP_DIR)/src/platform \
|
||||
$(REP_DIR)/src/include \
|
||||
$(BASE_DIR)/src/include
|
||||
|
||||
LD_TEXT_ADDR ?= 0x01000000
|
||||
LD_SCRIPT_STATIC = $(BASE_DIR)/src/ld/genode.ld \
|
||||
$(call select_from_repositories,src/ld/stack_area.ld)
|
||||
|
||||
include $(GEN_CORE_DIR)/version.inc
|
||||
|
||||
vpath main.cc $(GEN_CORE_DIR)
|
||||
vpath pd_session_component.cc $(GEN_CORE_DIR)
|
||||
vpath core_log.cc $(GEN_CORE_DIR)
|
||||
vpath cpu_session_component.cc $(GEN_CORE_DIR)
|
||||
vpath cpu_session_support.cc $(GEN_CORE_DIR)
|
||||
vpath cpu_thread_component.cc $(GEN_CORE_DIR)
|
||||
vpath pd_upgrade_ram_quota.cc $(GEN_CORE_DIR)
|
||||
vpath pd_session_support.cc $(GEN_CORE_DIR)
|
||||
vpath capability_space.cc $(GEN_CORE_DIR)
|
||||
vpath ram_dataspace_factory.cc $(GEN_CORE_DIR)
|
||||
vpath signal_source_component.cc $(GEN_CORE_DIR)
|
||||
vpath signal_transmitter_proxy.cc $(GEN_CORE_DIR)
|
||||
vpath signal_receiver.cc $(GEN_CORE_DIR)
|
||||
vpath trace_session_component.cc $(GEN_CORE_DIR)
|
||||
vpath default_log.cc $(GEN_CORE_DIR)
|
||||
vpath heartbeat.cc $(GEN_CORE_DIR)
|
||||
vpath io_port_session_support.cc $(GEN_CORE_DIR)/spec/x86
|
||||
vpath thread.cc $(BASE_DIR)/src/lib/base
|
||||
vpath thread_myself.cc $(BASE_DIR)/src/lib/base
|
||||
vpath trace.cc $(BASE_DIR)/src/lib/base
|
||||
vpath env_reinit.cc $(REP_DIR)/src/lib/base
|
||||
vpath dataspace_component.cc $(REP_DIR)/src/core/spec/$(BOARD)
|
||||
vpath io_mem_session_component.cc $(REP_DIR)/src/core/spec/$(BOARD)
|
||||
vpath irq_session_component.cc $(REP_DIR)/src/core/spec/$(BOARD)
|
||||
vpath io_port_session_component.cc $(REP_DIR)/src/core/spec/$(BOARD)
|
||||
vpath platform_services.cc $(REP_DIR)/src/core/spec/$(BOARD)
|
||||
vpath %.cc $(REP_DIR)/src/core
|
||||
LD_TEXT_ADDR ?= 0x01000000
|
||||
LD_SCRIPT_STATIC = $(BASE_DIR)/src/ld/genode.ld \
|
||||
$(call select_from_repositories,src/ld/stack_area.ld)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user