diff --git a/Cargo.lock b/Cargo.lock index fa39129d36..9387e39945 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11,7 +11,7 @@ dependencies = [ "redox-daemon", "redox-log", "redox_event", - "redox_syscall 0.3.4", + "redox_syscall 0.3.5", "spin", ] @@ -20,6 +20,7 @@ name = "acpid" version = "0.1.0" dependencies = [ "aml", + "amlserde", "log", "num-derive", "num-traits", @@ -27,8 +28,9 @@ dependencies = [ "plain", "redox-daemon", "redox-log", - "redox_syscall 0.3.4", + "redox_syscall 0.3.5", "rustc-hash", + "serde_json", "thiserror", ] @@ -43,7 +45,7 @@ dependencies = [ "partitionlib", "redox-daemon", "redox-log", - "redox_syscall 0.3.4", + "redox_syscall 0.3.5", ] [[package]] @@ -54,13 +56,13 @@ dependencies = [ "netutils", "redox-daemon", "redox_event", - "redox_syscall 0.3.4", + "redox_syscall 0.3.5", ] [[package]] name = "aml" version = "0.16.3" -source = "git+https://github.com/rw-vanc/acpi.git?branch=cumulative#ac37b03f974ca58f3c024a058224ffd5b77fed31" +source = "git+https://github.com/rw-vanc/acpi.git?branch=cumulative#e4eb93891367e73d3633804002aa050edfbacb6e" dependencies = [ "bit_field", "bitvec", @@ -69,6 +71,25 @@ dependencies = [ "spinning_top", ] +[[package]] +name = "amlserde" +version = "0.0.1" +dependencies = [ + "aml", + "rustc-hash", + "serde", + "toml 0.7.3", +] + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "ansi_term" version = "0.12.1" @@ -136,7 +157,7 @@ version = "0.1.0" dependencies = [ "orbclient", "redox-daemon", - "redox_syscall 0.3.4", + "redox_syscall 0.3.5", ] [[package]] @@ -150,9 +171,9 @@ dependencies = [ [[package]] name = "bit_field" -version = "0.10.1" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcb6dd1c2376d2e096796e234a70e17e94cc2d5d54ff8ce42b28cef1d0d359a4" +checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" [[package]] name = "bitflags" @@ -184,9 +205,9 @@ checksum = "b4ae4235e6dac0694637c763029ecea1a2ec9e4e06ec2729bd21ba4d9c863eb7" [[package]] name = "bumpalo" -version = "3.10.0" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37ccbd214614c6783386c1af30caf03192f17891059cecc394b4fb119e363de3" +checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" [[package]] name = "byteorder" @@ -202,9 +223,9 @@ checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "cc" -version = "1.0.73" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" [[package]] name = "cfg-if" @@ -230,14 +251,16 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.19" +version = "0.4.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" +checksum = "4e3c5919066adf22df73762e50cffcde3a758f2a848b113b586d1f86728b673b" dependencies = [ - "libc", + "iana-time-zone", + "js-sys", "num-integer", "num-traits", "time", + "wasm-bindgen", "winapi 0.3.9", ] @@ -267,13 +290,29 @@ dependencies = [ [[package]] name = "cmake" -version = "0.1.48" +version = "0.1.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8ad8cef104ac57b68b89df3208164d228503abbdce70f6880ffa3d970e7443a" +checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130" dependencies = [ "cc", ] +[[package]] +name = "codespan-reporting" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" +dependencies = [ + "termcolor", + "unicode-width", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" + [[package]] name = "crc" version = "1.8.1" @@ -295,12 +334,12 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.6" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" +checksum = "cf2b3e8478797446514c91ef04bafcb59faba183e621ad488df88983cc14128c" dependencies = [ "cfg-if 1.0.0", - "crossbeam-utils 0.8.11", + "crossbeam-utils 0.8.15", ] [[package]] @@ -316,12 +355,11 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.11" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51887d4adc7b564537b15adcfb307936f8075dfcd5f00dde9a9f1d29383682bc" +checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b" dependencies = [ "cfg-if 1.0.0", - "once_cell", ] [[package]] @@ -330,6 +368,50 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35" +[[package]] +name = "cxx" +version = "1.0.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f61f1b6389c3fe1c316bf8a4dccc90a38208354b330925bce1f74a6c4756eb93" +dependencies = [ + "cc", + "cxxbridge-flags", + "cxxbridge-macro", + "link-cplusplus", +] + +[[package]] +name = "cxx-build" +version = "1.0.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12cee708e8962df2aeb38f594aae5d827c022b6460ac71a7a3e2c3c2aae5a07b" +dependencies = [ + "cc", + "codespan-reporting", + "once_cell", + "proc-macro2", + "quote", + "scratch", + "syn 2.0.11", +] + +[[package]] +name = "cxxbridge-flags" +version = "1.0.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7944172ae7e4068c533afbb984114a56c46e9ccddda550499caa222902c7f7bb" + +[[package]] +name = "cxxbridge-macro" +version = "1.0.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2345488264226bf682893e25de0769f3360aac9957980ec49361b083ddaa5bc5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.11", +] + [[package]] name = "e1000d" version = "0.1.0" @@ -338,7 +420,7 @@ dependencies = [ "netutils", "redox-daemon", "redox_event", - "redox_syscall 0.3.4", + "redox_syscall 0.3.5", ] [[package]] @@ -376,9 +458,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.21" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f73fe65f54d1e12b726f517d3e2135ca3125a437b6d998caf1962961f7172d9e" +checksum = "531ac96c6ff5fd7c62263c5e3c67a603af4fcaee2e1a0ae5565ba3a11e69e549" dependencies = [ "futures-channel", "futures-core", @@ -391,9 +473,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.21" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010" +checksum = "164713a5a0dcc3e7b4b1ed7d3b433cabc18025386f9339346e8daf15963cf7ac" dependencies = [ "futures-core", "futures-sink", @@ -401,15 +483,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.21" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" +checksum = "86d7a0c1aa76363dac491de0ee99faf6941128376f1cf96f07db7603b7de69dd" [[package]] name = "futures-executor" -version = "0.3.21" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9420b90cfa29e327d0429f19be13e7ddb68fa1cccb09d65e5706b8c7a749b8a6" +checksum = "1997dd9df74cdac935c76252744c1ed5794fac083242ea4fe77ef3ed60ba0f83" dependencies = [ "futures-core", "futures-task", @@ -418,38 +500,38 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.21" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc4045962a5a5e935ee2fdedaa4e08284547402885ab326734432bed5d12966b" +checksum = "89d422fa3cbe3b40dca574ab087abb5bc98258ea57eea3fd6f1fa7162c778b91" [[package]] name = "futures-macro" -version = "0.3.21" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33c1e13800337f4d4d7a316bf45a567dbcb6ffe087f16424852d97e97a91f512" +checksum = "3eb14ed937631bd8b8b8977f2c198443447a8355b6e3ca599f38c975e5a963b6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "futures-sink" -version = "0.3.21" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" +checksum = "ec93083a4aecafb2a80a885c9de1f0ccae9dbd32c2bb54b0c3a65690e0b8d2f2" [[package]] name = "futures-task" -version = "0.3.21" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a" +checksum = "fd65540d33b37b16542a0438c12e6aeead10d4ac5d05bd3f805b8f35ab592879" [[package]] name = "futures-util" -version = "0.3.21" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a" +checksum = "3ef6b17e481503ec85211fed8f39d1970f128935ca1f814cd32ac4a6842e84ab" dependencies = [ "futures-channel", "futures-core", @@ -474,6 +556,12 @@ dependencies = [ "uuid", ] +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + [[package]] name = "heck" version = "0.3.3" @@ -492,6 +580,30 @@ dependencies = [ "libc", ] +[[package]] +name = "iana-time-zone" +version = "0.1.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c17cc76786e99f8d2f055c11159e7f0091c42474dcc3189fbab96072e873e6d" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0703ae284fc167426161c2e3f1da3ea71d94b21bedbcc9494e92b28e334e3dca" +dependencies = [ + "cxx", + "cxx-build", +] + [[package]] name = "ided" version = "0.1.0" @@ -502,7 +614,7 @@ dependencies = [ "pcid", "redox-daemon", "redox-log", - "redox_syscall 0.3.4", + "redox_syscall 0.3.5", ] [[package]] @@ -526,10 +638,20 @@ dependencies = [ "redox-daemon", "redox-log", "redox_event", - "redox_syscall 0.3.4", + "redox_syscall 0.3.5", "spin", ] +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg 1.1.0", + "hashbrown", +] + [[package]] name = "instant" version = "0.1.12" @@ -550,9 +672,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.2" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" +checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" [[package]] name = "ixgbed" @@ -562,14 +684,14 @@ dependencies = [ "netutils", "redox-daemon", "redox_event", - "redox_syscall 0.3.4", + "redox_syscall 0.3.5", ] [[package]] name = "js-sys" -version = "0.3.59" +version = "0.3.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "258451ab10b34f8af53416d1fdab72c22e805f0c92a1136d59470ec0b11138b2" +checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" dependencies = [ "wasm-bindgen", ] @@ -598,9 +720,18 @@ checksum = "a6f08839bc70ef4a3fe1d566d5350f519c5912ea86be0df1740a7d247c7fc0ef" [[package]] name = "libc" -version = "0.2.139" +version = "0.2.140" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79" +checksum = "99227334921fae1a979cf0bfdfcc6b3e5ce376ef57e16fb6fb3ea2ed6095f80c" + +[[package]] +name = "link-cplusplus" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecd207c9c713c34f95a097a5b029ac2ce6010530c7b49d7fea24d977dede04f5" +dependencies = [ + "cc", +] [[package]] name = "linked-hash-map" @@ -610,9 +741,9 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "lock_api" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53" +checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" dependencies = [ "autocfg 1.1.0", "scopeguard", @@ -629,9 +760,9 @@ dependencies = [ [[package]] name = "matches" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" [[package]] name = "maybe-uninit" @@ -688,7 +819,7 @@ dependencies = [ [[package]] name = "netutils" version = "0.1.0" -source = "git+https://gitlab.redox-os.org/redox-os/netutils.git?branch=redox-unix#34d1ec9c2e9f7904b57547ca16d4c3145c109880" +source = "git+https://gitlab.redox-os.org/redox-os/netutils.git?branch=redox-unix#105ed1ea43413a91152b289fbe76e7efc996e933" dependencies = [ "arg_parser", "extra", @@ -728,7 +859,7 @@ checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -770,21 +901,22 @@ dependencies = [ "pcid", "redox-daemon", "redox-log", - "redox_syscall 0.3.4", - "smallvec 1.9.0", + "redox_syscall 0.3.5", + "smallvec 1.10.0", ] [[package]] name = "once_cell" -version = "1.13.0" +version = "1.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18a6dbe30758c9f83eb00cbea4ac95966305f5a7772f3f42ebfc7fc7eddbd8e1" +checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" [[package]] name = "orbclient" -version = "0.3.32" -source = "git+https://gitlab.redox-os.org/redox-os/orbclient.git#192dc30edbad43ee8c5348411b162600d43dfaf9" +version = "0.3.43" +source = "git+https://gitlab.redox-os.org/redox-os/orbclient.git#f5f5d5cc761b61a9ee15a68b086c4967857ba805" dependencies = [ + "cfg-if 1.0.0", "libc", "raw-window-handle 0.3.4", "redox_syscall 0.2.16", @@ -821,7 +953,7 @@ checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" dependencies = [ "instant", "lock_api", - "parking_lot_core 0.8.5", + "parking_lot_core 0.8.6", ] [[package]] @@ -838,15 +970,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" +checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" dependencies = [ "cfg-if 1.0.0", "instant", "libc", "redox_syscall 0.2.16", - "smallvec 1.9.0", + "smallvec 1.10.0", "winapi 0.3.9", ] @@ -878,7 +1010,7 @@ checksum = "0f35583365be5d148e959284f42526841917b7bfa09e2d1a7ad5dde2cf0eaa39" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -889,13 +1021,12 @@ checksum = "7f0b59668fe80c5afe998f0c0bf93322bf2cd66cafeeb80581f291716f3467f2" [[package]] name = "pbr" -version = "1.0.4" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff5751d87f7c00ae6403eb1fcbba229b9c76c9a30de8c1cf87182177b168cea2" +checksum = "ed5827dfa0d69b6c92493d6c38e633bbaa5937c153d0d7c28bf12313f8c6d514" dependencies = [ - "crossbeam-channel 0.5.6", + "crossbeam-channel 0.5.7", "libc", - "time", "winapi 0.3.9", ] @@ -911,13 +1042,13 @@ dependencies = [ "paw", "plain", "redox-log", - "redox_syscall 0.3.4", + "redox_syscall 0.3.5", "serde", "serde_json", - "smallvec 1.9.0", + "smallvec 1.10.0", "structopt", "thiserror", - "toml", + "toml 0.5.11", ] [[package]] @@ -925,7 +1056,7 @@ name = "pcspkrd" version = "0.1.0" dependencies = [ "redox-daemon", - "redox_syscall 0.3.4", + "redox_syscall 0.3.5", ] [[package]] @@ -961,7 +1092,7 @@ dependencies = [ "proc-macro-error-attr", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "version_check", ] @@ -978,9 +1109,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.42" +version = "1.0.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c278e965f1d8cf32d6e0e96de3d3e79712178ae67986d9cf9151f51e95aac89b" +checksum = "e472a104799c74b514a57226160104aa483546de37e839ec50e3c2e41dd87534" dependencies = [ "unicode-ident", ] @@ -992,14 +1123,14 @@ dependencies = [ "bitflags", "orbclient", "redox-daemon", - "redox_syscall 0.3.4", + "redox_syscall 0.3.5", ] [[package]] name = "quote" -version = "1.0.20" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bcdf212e9776fbcb2d23ab029360416bb1706b1aea2d1a5ba002727cbcab804" +checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" dependencies = [ "proc-macro2", ] @@ -1131,9 +1262,9 @@ dependencies = [ [[package]] name = "ransid" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22b9af151b0590163dfa64e1c92c0831377d61942df4c19820c704390ebc3045" +checksum = "86e40bb0bbe3ec5efa241ed57fad611b2c1642f1c60550f647201acee2494553" dependencies = [ "log", "vte", @@ -1185,7 +1316,7 @@ checksum = "cbf6d33a003a5c0b94ec11f10c7c797303f236592964ddb1bfb93e1b438a1557" dependencies = [ "chrono", "log", - "smallvec 1.9.0", + "smallvec 1.10.0", "termion", ] @@ -1194,7 +1325,7 @@ name = "redox_event" version = "0.1.0" source = "git+https://gitlab.redox-os.org/redox-os/event.git#f7db3d25ca5e282c12ded12bf6c720087b570132" dependencies = [ - "redox_syscall 0.3.4", + "redox_syscall 0.3.5", ] [[package]] @@ -1208,9 +1339,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb02a9aee8e8c7ad8d86890f1e16b49e0bbbffc9961ff3788c31d57c98bcbf03" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ "bitflags", ] @@ -1235,7 +1366,7 @@ dependencies = [ "redox-daemon", "redox-log", "redox_event", - "redox_syscall 0.3.4", + "redox_syscall 0.3.5", ] [[package]] @@ -1257,9 +1388,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.10" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695" +checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" [[package]] name = "sb16d" @@ -1270,7 +1401,7 @@ dependencies = [ "redox-daemon", "redox-log", "redox_event", - "redox_syscall 0.3.4", + "redox_syscall 0.3.5", "spin", ] @@ -1280,6 +1411,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +[[package]] +name = "scratch" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1792db035ce95be60c3f8853017b3999209281c24e2ba5bc8e59bf97a0c590c1" + [[package]] name = "scroll" version = "0.10.2" @@ -1297,7 +1434,7 @@ checksum = "aaaae8f38bb311444cfb7f1979af0bc9240d95795f75f9ceddf6a59b79ceffa0" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1327,29 +1464,29 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.140" +version = "1.0.159" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc855a42c7967b7c369eb5860f7164ef1f6f81c20c7cc1141f2a604e18723b03" +checksum = "3c04e8343c3daeec41f58990b9d77068df31209f2af111e059e9fe9646693065" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.140" +version = "1.0.159" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f2122636b9fe3b81f1cb25099fcf2d3f542cdb1d45940d56c713158884a05da" +checksum = "4c614d17805b093df4b147b51339e7e44bf05ef59fba1e45d83500bcfb4d8585" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.11", ] [[package]] name = "serde_json" -version = "1.0.82" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82c2c1fdcd807d1098552c5b9a36e425e42e9fbd7c6a37a8425f390f781f7fa7" +checksum = "d721eca97ac802aa7777b701877c8004d950fc142651367300d21c1cc0194744" dependencies = [ "itoa", "ryu", @@ -1357,10 +1494,19 @@ dependencies = [ ] [[package]] -name = "slab" -version = "0.4.7" +name = "serde_spanned" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" +checksum = "0efd8caf556a6cebd3b285caf480045fcc1ac04f6bd786b09a6f11af30c4fcf4" +dependencies = [ + "serde", +] + +[[package]] +name = "slab" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" dependencies = [ "autocfg 1.1.0", ] @@ -1376,27 +1522,27 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fd0db749597d91ff862fd1d55ea87f7855a744a8425a64695b6fca237d1dad1" +checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" dependencies = [ "serde", ] [[package]] name = "spin" -version = "0.9.4" +version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f6002a767bff9e83f8eeecf883ecb8011875a21ae8da43bffb817a57e78cc09" +checksum = "c0959fd6f767df20b231736396e4f602171e00d95205676286e79d4a4eb67bef" dependencies = [ "lock_api", ] [[package]] name = "spinning_top" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75adad84ee84b521fb2cca2d4fd0f1dab1d8d026bda3c5bea4ca63b5f9f9293c" +checksum = "5b9eb1a2f4c41445a3a0ff9abc5221c5fcd28e1f13cd7c0397706f9ac938ddb0" dependencies = [ "lock_api", ] @@ -1453,14 +1599,25 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "syn" -version = "1.0.98" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c50aef8a904de4c23c788f104b7dddc7d6f79c647c7c8ce4cc8f73eb0ca773dd" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21e3787bb71465627110e7d87ed4faaa36c1f61042ee67badb9e2ef173accc40" dependencies = [ "proc-macro2", "quote", @@ -1473,6 +1630,15 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" +[[package]] +name = "termcolor" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" +dependencies = [ + "winapi-util", +] + [[package]] name = "termion" version = "1.5.6" @@ -1496,29 +1662,29 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.31" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a" +checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.31" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a" +checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.11", ] [[package]] name = "time" -version = "0.1.44" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" +checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a" dependencies = [ "libc", "wasi", @@ -1536,51 +1702,85 @@ dependencies = [ [[package]] name = "tinyvec_macros" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "toml" -version = "0.5.9" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" dependencies = [ "serde", ] [[package]] -name = "unicode-bidi" -version = "0.3.8" +name = "toml" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" +checksum = "b403acf6f2bb0859c93c7f0d967cb4a75a7ac552100f9322faf64dc047669b21" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ab8ed2edee10b50132aed5f331333428b011c99402b5a534154ed15746f9622" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.19.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "239410c8609e8125456927e6707163a3b1fdb40561e4b803bc041f466ccfdc13" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" [[package]] name = "unicode-ident" -version = "1.0.2" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15c61ba63f9235225a22310255a29b806b907c9b8c964bcbd0a2c70f3f2deea7" +checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" [[package]] name = "unicode-normalization" -version = "0.1.21" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "854cbdc4f7bc6ae19c820d44abdc3277ac3e1b2b93db20a636825d9322fb60e6" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" dependencies = [ "tinyvec", ] [[package]] name = "unicode-segmentation" -version = "1.9.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99" +checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" [[package]] name = "unicode-width" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" +checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" [[package]] name = "url" @@ -1609,7 +1809,7 @@ dependencies = [ "log", "orbclient", "redox-log", - "redox_syscall 0.3.4", + "redox_syscall 0.3.5", "ux", "xhcid", ] @@ -1621,7 +1821,7 @@ dependencies = [ "base64", "plain", "redox-daemon", - "redox_syscall 0.3.4", + "redox_syscall 0.3.5", "thiserror", "xhcid", ] @@ -1643,9 +1843,9 @@ dependencies = [ [[package]] name = "ux" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5efdcf885b33bb81bc9336e66cebc10d503288449466c0e43e51250ddc93a3d8" +checksum = "2cb3ff47e36907a6267572c1e398ff32ef78ac5131de8aa272e53846592c207e" [[package]] name = "vboxd" @@ -1654,7 +1854,7 @@ dependencies = [ "orbclient", "redox-daemon", "redox_event", - "redox_syscall 0.3.4", + "redox_syscall 0.3.5", ] [[package]] @@ -1665,9 +1865,9 @@ checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" [[package]] name = "version-compare" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe88247b92c1df6b6de80ddc290f3976dbdf2f5f5d3fd049a9fb598c6dd5ca73" +checksum = "579a42fc0b8e0c63b76519a339be31bed574929511fa53c1a3acae26eb258f29" [[package]] name = "version_check" @@ -1682,7 +1882,7 @@ dependencies = [ "orbclient", "ransid", "redox-daemon", - "redox_syscall 0.3.4", + "redox_syscall 0.3.5", "rusttype", ] @@ -1703,9 +1903,9 @@ checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" [[package]] name = "wasm-bindgen" -version = "0.2.82" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7652e3f6c4706c8d9cd54832c4a4ccb9b5336e2c3bd154d5cccfbf1c1f5f7d" +checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" dependencies = [ "cfg-if 1.0.0", "wasm-bindgen-macro", @@ -1713,24 +1913,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.82" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "662cd44805586bd52971b9586b1df85cdbbd9112e4ef4d8f41559c334dc6ac3f" +checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.82" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b260f13d3012071dfb1512849c033b1925038373aea48ced3012c09df952c602" +checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1738,28 +1938,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.82" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5be8e654bdd9b79216c2929ab90721aa82faf65c48cdf08bdc4e7f51357b80da" +checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.82" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6598dd0bd3c7d51095ff6531a5b23e02acdc81804e30d8f07afb77b7215a140a" +checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "web-sys" -version = "0.3.59" +version = "0.3.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed055ab27f941423197eb86b2035720b1a3ce40504df082cac2ecc6ed73335a1" +checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97" dependencies = [ "js-sys", "wasm-bindgen", @@ -1793,12 +1993,96 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi 0.3.9", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdacb41e6a96a052c6cb63a144f24900236121c6f63f4f8219fef5977ecb0c25" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "winnow" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae8970b36c66498d8ff1d66685dc86b91b29db0c7739899012f63a63814b4b28" +dependencies = [ + "memchr", +] + [[package]] name = "ws2_32-sys" version = "0.2.1" @@ -1833,10 +2117,10 @@ dependencies = [ "redox-daemon", "redox-log", "redox_event", - "redox_syscall 0.3.4", + "redox_syscall 0.3.5", "serde", "serde_json", - "smallvec 1.9.0", + "smallvec 1.10.0", "thiserror", - "toml", + "toml 0.5.11", ] diff --git a/acpid/Cargo.toml b/acpid/Cargo.toml index c9829bbf69..f093a1e284 100644 --- a/acpid/Cargo.toml +++ b/acpid/Cargo.toml @@ -18,3 +18,5 @@ redox-log = "0.1.1" redox_syscall = "0.3" rustc-hash = "1.1.0" thiserror = "1" +serde_json = "1.0.94" +amlserde = { path = "../amlserde" } \ No newline at end of file diff --git a/acpid/src/acpi.rs b/acpid/src/acpi.rs index 2d8ecf87ec..5b72fb1d26 100644 --- a/acpid/src/acpi.rs +++ b/acpid/src/acpi.rs @@ -1,9 +1,9 @@ use rustc_hash::FxHashMap; use std::convert::{TryFrom, TryInto}; +use std::fmt::Write; use std::ops::Deref; use std::sync::Arc; use std::{fmt, mem}; -use std::fmt::Write; use syscall::flag::PhysmapFlags; @@ -13,7 +13,9 @@ use syscall::io::{Io, Pio}; use parking_lot::{RwLock, RwLockReadGuard, RwLockWriteGuard}; use thiserror::Error; -use aml::{AmlContext, AmlName, AmlHandle, AmlValue}; +use aml::{AmlContext, AmlError, AmlHandle, AmlName}; +use amlserde::aml_serde_name::aml_to_symbol; +use amlserde::{AmlHandleLookup, AmlSerde}; pub mod dmar; use self::dmar::Dmar; @@ -52,8 +54,7 @@ impl SdtHeader { } } pub fn length(&self) -> usize { - self - .length + self.length .try_into() .expect("expected usize to be at least 32 bits") } @@ -68,7 +69,13 @@ pub struct SdtSignature { impl fmt::Display for SdtSignature { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{}-{}-{}", String::from_utf8_lossy(&self.signature), String::from_utf8_lossy(&self.oem_id), String::from_utf8_lossy(&self.oem_table_id)) + write!( + f, + "{}-{}-{}", + String::from_utf8_lossy(&self.signature), + String::from_utf8_lossy(&self.oem_id), + String::from_utf8_lossy(&self.oem_table_id) + ) } } @@ -112,9 +119,7 @@ impl Deref for PhysmapGuard { type Target = [u8]; fn deref(&self) -> &Self::Target { - unsafe { - std::slice::from_raw_parts(self.virt as *const u8, self.size) - } + unsafe { std::slice::from_raw_parts(self.virt as *const u8, self.size) } } } impl Drop for PhysmapGuard { @@ -133,14 +138,19 @@ impl Sdt { let header = match plain::from_bytes::(&slice) { Ok(header) => header, Err(plain::Error::TooShort) => return Err(InvalidSdtError::InvalidSize), - Err(plain::Error::BadAlignment) => panic!("plain::from_bytes failed due to alignment, but SdtHeader is #[repr(packed)]!"), + Err(plain::Error::BadAlignment) => panic!( + "plain::from_bytes failed due to alignment, but SdtHeader is #[repr(packed)]!" + ), }; if header.length() != slice.len() { return Err(InvalidSdtError::InvalidSize); } - let checksum = slice.iter().copied().fold(0_u8, |current_sum, item| current_sum.wrapping_add(item)); + let checksum = slice + .iter() + .copied() + .fold(0_u8, |current_sum, item| current_sum.wrapping_add(item)); if checksum != 0 { return Err(InvalidSdtError::BadChecksum); @@ -154,7 +164,9 @@ impl Sdt { // Begin by reading and validating the header first. The SDT header is always 36 bytes // long, and can thus span either one or two page table frames. - let needs_extra_page = (PAGE_SIZE - physaddr_page_offset).checked_sub(mem::size_of::()).is_none(); + let needs_extra_page = (PAGE_SIZE - physaddr_page_offset) + .checked_sub(mem::size_of::()) + .is_none(); let page_table_count = 1 + if needs_extra_page { 1 } else { 0 }; let pages = PhysmapGuard::map(physaddr_start_page, page_table_count)?; @@ -223,13 +235,6 @@ impl fmt::Debug for Sdt { pub struct Dsdt(Sdt); pub struct Ssdt(Sdt); - -#[derive(Debug, Error)] -pub enum SymbolListError { - #[error("Aml Internal Error")] - AmlInternalError, -} - // Current AML implementation builds the aml_context.namespace at startup, // but the cache for symbols is lazy-loaded when someone // reads from the acpi:/symbols scheme. @@ -239,138 +244,107 @@ pub enum SymbolListError { pub struct AmlSymbols { aml_context: AmlContext, // k = name, v = description - symbols_cache: FxHashMap, - pub symbols_str: String, + cache: FxHashMap, + list: String, } impl AmlSymbols { - pub fn to_str(&self) -> &str { - &self.symbols_str - } - - /// Format a value as toml, to use as file contents - pub fn format_value(name: &str, value: &AmlValue, handle_lookup: &AmlHandleLookup) -> String { - let mut value_str = String::with_capacity(256); - let _ = write!(value_str, "[symbol]\nname = \"{}\"\n\n[value]\n", name); - let _ = match value { - AmlValue::Integer(n) => - write!(value_str, "type = \"Integer\"\nvalue = \"{:#x}\"\n", n), - AmlValue::String(s) => - write!(value_str, "type = \"String\"\nvalue = \"{}\"\n", s), - AmlValue::Processor { id, pblk_address, pblk_len } => - write!(value_str, "type = \"Processor\"\nid = \"{}\"\npblk_address = \"{}\"\npblk_len = \"{}\"\n", - id, pblk_address, pblk_len), - AmlValue::Method { flags, code } => - write!(value_str, "type = \"Method\"\nflags = \"{:?}\"\ncode = {}\n", flags, AmlSymbols::code_as_string(code)), - AmlValue::OpRegion { region, offset, length, parent_device } => - write!(value_str, "type = \"OpRegion\"\nregion = \"{:?}\"\noffset = \"{:#x}\"\nlength = \"{:#x}\"\ndevice = \"{}\"\n", - region, offset, length, AmlSymbols::device_option_as_string(parent_device)), - AmlValue::Field { region, flags, offset, length } => - write!(value_str, "type = \"Field\"\nregion = \"{}\"\nflags = \"{:?}\"\noffset = \"{:#x}\"\nlength = \"{:#x}\"\n", - handle_lookup.get_as_str(region), flags, offset, length), - AmlValue::Package(contents) => - write!(value_str, "type = \"Package\"\ncontents = {}\n", - AmlSymbols::contents_as_string(contents)), - AmlValue::Device => write!(value_str, "type = \"Device\"\n"), - AmlValue::Buffer(_) => write!(value_str, "type = \"Buffer\"\n"), - other => - write!(value_str, "type = \"Other\"\ndebug = \"{:.64?}\"\n", other), - }; - - value_str.shrink_to_fit(); - value_str - } - - fn device_option_as_string(device: &Option) -> String { - if let Some(name) = device { - format!("\"{}\"", AmlSymbols::pretty_name(name)) - } else { - "\"None\"".to_string() - } - } - - fn code_as_string(code: &aml::value::MethodCode) -> String { - match code { - aml::value::MethodCode::Aml(bytes) => - if bytes.len() > 15 { - format!("\"AML({:x?}...)\"", &bytes[..15]) - } else { - format!("\"AML({:x?})\"", bytes) - }, - aml::value::MethodCode::Native(_) => format!("(native method)"), - } - } - - fn contents_as_string(contents: &Vec) -> String { - let mut buf = String::with_capacity(128); - let _ = write!(buf, "[ "); - for value in contents { - match value { - AmlValue::Integer(n) => { let _ = write!(buf, "{:x}, ", n); }, - AmlValue::String(s) => { let _ = write!(buf, "\"{}\",", s); } - _ => { let _ = write!(buf, "{:?}", value); }, - } - if buf.len() > 58 { - let _ = write!(buf, "..."); - break; - } - } - let _ = write!(buf, "]"); - buf - } - - /// Remove trailing underscores from each name segment - pub fn pretty_name(level_aml_name: &AmlName) -> String { - let mut name = level_aml_name.as_string(); - // remove unnecessary underscores - while let Some(index) = name.find("_.") { - name.remove(index); - } - while name.len() > 0 && &name[name.len() - 1..] == "_" { - name.pop(); - } - name.shrink_to_fit(); - name - } - - pub fn child_symbol(level_name: &str, value_name: &str) -> String { - format!("{}.{}", level_name, value_name.trim_end_matches('_')) - } - - pub fn root_symbol(value_name: &str) -> String { - format!("\\{}", value_name.trim_end_matches('_')) - } - -} - -pub struct AmlHandleLookup { - map: FxHashMap, -} - -impl AmlHandleLookup { pub fn new() -> Self { - Self { map: FxHashMap::default() } - } - - fn handle_to_key(&self, handle: &AmlHandle) -> String { - format!("{:?}", handle) - } - - pub fn insert(&mut self, handle: &AmlHandle, name: &String) { - self.map.insert(self.handle_to_key(handle), name.to_owned()); - } - - pub fn get(&self, handle: &AmlHandle) -> Option<&String> { - self.map.get(&self.handle_to_key(handle)) - } - - pub fn get_as_str(&self, handle: &AmlHandle) -> &str { - if let Some(name) = self.get(handle) { - &name[..] - } else { - "Unrecognized" + Self { + aml_context: AmlContext::new(Box::new(AmlPhysMemHandler), aml::DebugVerbosity::None), + cache: FxHashMap::default(), + list: "".to_string(), } } + + pub fn mut_aml_context(&mut self) -> &mut AmlContext { + &mut self.aml_context + } + + pub fn symbols_str(&self) -> &String { + &self.list + } + + pub fn symbols_cache(&self) -> &FxHashMap { + &self.cache + } + + pub fn parse_table(&mut self, aml: &[u8]) -> Result<(), AmlError> { + self.aml_context.parse_table(aml) + } + + pub fn lookup(&self, symbol: &str) -> Option { + if let Some(description) = self.cache.get(symbol) { + log::trace!("Found symbol in cache, {}, {}", symbol, description); + return Some(description.to_owned()); + } + None + } + + pub fn build_cache(&mut self) { + let mut symbol_list: Vec<(AmlName, String, AmlHandle)> = Vec::with_capacity(5000); + + if self + .aml_context + .namespace + .traverse(|level_aml_name, level| { + for (child_seg, handle) in level.values.iter() { + if let Ok(aml_name) = + AmlName::from_name_seg(child_seg.to_owned()).resolve(level_aml_name) + { + let name = aml_to_symbol(&aml_name); + symbol_list.push((aml_name, name, handle.to_owned())); + } else { + log::error!( + "AmlName resolve failed, {:?}:{:?}", + level_aml_name, + child_seg + ); + } + } + Ok(true) + }) + .is_err() + { + log::error!("Namespace traverse failed"); + return; + } + + let mut symbols_str = String::with_capacity(symbol_list.len() * 10); + let mut handle_lookup = AmlHandleLookup::new(); + + for (aml_name, name, handle) in &symbol_list { + let _ = writeln!(symbols_str, "{}", &name); + handle_lookup.insert(handle.to_owned(), aml_name.to_owned()); + } + + symbols_str.shrink_to_fit(); + + let mut symbol_cache: FxHashMap = FxHashMap::default(); + + for (aml_name, name, handle) in &symbol_list { + // create an empty entry, in case something goes wrong with serialization + symbol_cache.insert(name.to_owned(), "".to_owned()); + if let Some(ser_value) = AmlSerde::from_aml( + &mut self.aml_context, + &handle_lookup, + &aml_to_symbol(aml_name), + aml_name, + handle, + ) { + if let Ok(ser_string) = serde_json::to_string_pretty(&ser_value) { + // replace the empty entry + symbol_cache.insert(name.to_owned(), ser_string); + } + } + } + + // Cache the new list + log::trace!("Updating symbols list"); + + self.list = symbols_str; + self.cache = symbol_cache; + } } pub struct AcpiContext { @@ -383,7 +357,6 @@ pub struct AcpiContext { // TODO: The kernel ACPI code seemed to use load_table quite ubiquitously, however ACPI 5.1 // states that DDBHandles can only be obtained when loading XSDT-pointed tables. So, we'll // generate an index only for those. - sdt_order: RwLock>>, pub next_ctx: RwLock, @@ -391,16 +364,17 @@ pub struct AcpiContext { impl AcpiContext { pub fn init(rxsdt_physaddrs: impl Iterator) -> Self { - let tables = rxsdt_physaddrs.map(|physaddr| { - let physaddr: usize = physaddr - .try_into() - .expect("expected ACPI addresses to be compatible with the current word size"); + let tables = rxsdt_physaddrs + .map(|physaddr| { + let physaddr: usize = physaddr + .try_into() + .expect("expected ACPI addresses to be compatible with the current word size"); - log::trace!("TABLE AT {:#>08X}", physaddr); + log::trace!("TABLE AT {:#>08X}", physaddr); - Sdt::load_from_physical(physaddr) - .expect("failed to load physical SDT") - }).collect::>(); + Sdt::load_from_physical(physaddr).expect("failed to load physical SDT") + }) + .collect::>(); let mut this = Self { tables, @@ -408,11 +382,7 @@ impl AcpiContext { fadt: None, // Temporary values - aml_symbols: RwLock::new(AmlSymbols { - aml_context: AmlContext::new(Box::new(AmlPhysMemHandler), aml::DebugVerbosity::None), - symbols_cache: FxHashMap::default(), - symbols_str: "".to_string(), - }), + aml_symbols: RwLock::new(AmlSymbols::new()), next_ctx: RwLock::new(0), @@ -426,17 +396,16 @@ impl AcpiContext { Fadt::init(&mut this); //TODO (hangs on real hardware): Dmar::init(&this); - - this.aml_symbols.write().aml_context = AcpiContext::build_aml_context(&this); + AcpiContext::build_aml_context(&this); this } - fn build_aml_context(acpi: &AcpiContext) -> AmlContext { - let mut aml_context = AmlContext::new(Box::new(AmlPhysMemHandler), aml::DebugVerbosity::None); + fn build_aml_context(acpi: &AcpiContext) { + let mut aml_symbols = acpi.aml_symbols.write(); if let Some(dsdt) = acpi.dsdt() { - match aml_context.parse_table(dsdt.aml()) { + match aml_symbols.parse_table(dsdt.aml()) { Ok(_) => log::trace!("Parsed DSDT"), Err(e) => { log::error!("DSDT: {:?}", e); @@ -447,48 +416,69 @@ impl AcpiContext { } for ssdt in acpi.ssdts() { - match aml_context.parse_table(ssdt.aml()) { + match aml_symbols.parse_table(ssdt.aml()) { Ok(_) => log::trace!("Parsed SSDT"), Err(e) => { log::error!("SSDT: {:?}", e); } } } - aml_context } pub fn dsdt(&self) -> Option<&Dsdt> { self.dsdt.as_ref() } pub fn ssdts(&self) -> impl Iterator + '_ { - self.find_multiple_sdts(*b"SSDT").map(|sdt| Ssdt(sdt.clone())) + self.find_multiple_sdts(*b"SSDT") + .map(|sdt| Ssdt(sdt.clone())) } fn find_single_sdt_pos(&self, signature: [u8; 4]) -> Option { - let count = self.tables.iter().filter(|sdt| sdt.signature == signature).count(); + let count = self + .tables + .iter() + .filter(|sdt| sdt.signature == signature) + .count(); if count > 1 { - log::warn!("Expected only a single SDT of signature `{}` ({:?}), but there were {}", String::from_utf8_lossy(&signature), signature, count); + log::warn!( + "Expected only a single SDT of signature `{}` ({:?}), but there were {}", + String::from_utf8_lossy(&signature), + signature, + count + ); } - self.tables.iter().position(|sdt| sdt.signature == signature) + self.tables + .iter() + .position(|sdt| sdt.signature == signature) } pub fn find_multiple_sdts<'a>(&'a self, signature: [u8; 4]) -> impl Iterator { - self.tables.iter().filter(move |sdt| sdt.signature == signature) + self.tables + .iter() + .filter(move |sdt| sdt.signature == signature) } pub fn take_single_sdt(&self, signature: [u8; 4]) -> Option { - self.find_single_sdt_pos(signature).map(|pos| self.tables[pos].clone()) + self.find_single_sdt_pos(signature) + .map(|pos| self.tables[pos].clone()) } pub fn fadt(&self) -> Option<&Fadt> { self.fadt.as_ref() } pub fn sdt_from_signature(&self, signature: &SdtSignature) -> Option<&Sdt> { - self.tables.iter().find(|sdt| sdt.signature == signature.signature && sdt.oem_id == signature.oem_id && sdt.oem_table_id == signature.oem_table_id) + self.tables.iter().find(|sdt| { + sdt.signature == signature.signature + && sdt.oem_id == signature.oem_id + && sdt.oem_table_id == signature.oem_table_id + }) } pub fn get_signature_from_index(&self, index: usize) -> Option { self.sdt_order.read().get(index).copied().flatten() } pub fn get_index_from_signature(&self, signature: &SdtSignature) -> Option { - self.sdt_order.read().iter().rposition(|sig| sig.map_or(false, |sig| &sig == signature)) + self.sdt_order + .read() + .iter() + .rposition(|sig| sig.map_or(false, |sig| &sig == signature)) } pub fn tables(&self) -> &[Sdt] { &self.tables @@ -499,19 +489,16 @@ impl AcpiContext { pub fn aml_lookup(&self, symbol: &str) -> Option { if let Ok(aml_symbols) = self.aml_symbols() { - if let Some(description) = aml_symbols.symbols_cache.get(symbol) { - log::trace!("Found symbol in cache, {}, {}", symbol, description); - return Some(description.to_owned()); - } + aml_symbols.lookup(symbol) + } else { + None } - None } - pub fn aml_symbols(&self) -> Result, SymbolListError> { - + pub fn aml_symbols(&self) -> Result, AmlError> { // return the cached value if it exists let symbols = self.aml_symbols.read(); - if !symbols.symbols_cache.is_empty() { + if !symbols.symbols_cache().is_empty() { return Ok(symbols); } // free the read lock @@ -520,62 +507,9 @@ impl AcpiContext { // List has not been initialized, we have to build it log::trace!("Creating symbols list"); - let mut symbols_str: String = String::with_capacity(30000); - - let mut symbols_list: Vec<(String, AmlHandle)> = Vec::with_capacity(3000); - let mut aml_symbols = self.aml_symbols.write(); - let root = aml::AmlName::root(); - let traverse = aml_symbols.aml_context.namespace - .traverse(| level_aml_name, level | { - let level_is_root = level_aml_name.eq(&root); - let level_name = AmlSymbols::pretty_name(level_aml_name); - for (name, handle) in level.values.iter() { - // Create the name of the symbol as "\levelname.symbolname" - let symbol = if level_is_root { - AmlSymbols::root_symbol(name.as_str()) - } else { - AmlSymbols::child_symbol(&level_name, name.as_str()) - }; - symbols_str.push_str(&symbol); - symbols_str.push('\n'); - symbols_list.push((symbol, handle.to_owned())); - } - Ok(true) - }); - - match traverse { - Err(error) => { - log::error!("Traverse failed, {:?}", error); - return Err(SymbolListError::AmlInternalError); - } - _ => {} - } - - let mut handle_lookup = AmlHandleLookup::new(); - - for (name, handle) in &symbols_list { - handle_lookup.insert(handle, name); - } - - let namespace = &aml_symbols.aml_context.namespace; - - let mut symbols_cache: FxHashMap = FxHashMap::default(); - - for (name, handle) in symbols_list { - if let Ok(value) = namespace.get(handle.to_owned()) { - symbols_cache.insert(name.to_owned(), AmlSymbols::format_value(&name, value, &handle_lookup)); - } - } - - symbols_str.shrink_to_fit(); - - // Cache the new list - log::trace!("Updating symbols list"); - - aml_symbols.symbols_str = symbols_str; - aml_symbols.symbols_cache = symbols_cache; + aml_symbols.build_cache(); // return the cached value Ok(RwLockWriteGuard::downgrade(aml_symbols)) @@ -584,8 +518,8 @@ impl AcpiContext { /// Discard any cached symbols list. To be called if the AML namespace changes. pub fn aml_symbols_reset(&self) { let mut aml_symbols = self.aml_symbols.write(); - aml_symbols.symbols_cache = FxHashMap::default(); - aml_symbols.symbols_str = "".to_string(); + aml_symbols.cache = FxHashMap::default(); + aml_symbols.list = "".to_string(); } /// Set Power State @@ -598,7 +532,7 @@ impl AcpiContext { } let fadt = match self.fadt() { Some(fadt) => fadt, - None => { + None => { log::error!("Cannot set global S-state due to missing FADT."); return; } @@ -611,26 +545,41 @@ impl AcpiContext { let s5_aml_name = match aml::AmlName::from_str("\\_S5") { Ok(aml_name) => aml_name, - Err(error) => { log::error!("Could not build AmlName for \\_S5, {:?}", error); return; } + Err(error) => { + log::error!("Could not build AmlName for \\_S5, {:?}", error); + return; + } }; let s5 = match aml_symbols.aml_context.namespace.get_by_path(&s5_aml_name) { Ok(s5) => s5, - Err(error) => { log::error!("Cannot set S-state, missing \\_S5, {:?}", error); return; } + Err(error) => { + log::error!("Cannot set S-state, missing \\_S5, {:?}", error); + return; + } }; let package = match s5 { aml::AmlValue::Package(package) => package, - _ => { log::error!("Cannot set S-state, \\_S5 is not a package"); return; } + _ => { + log::error!("Cannot set S-state, \\_S5 is not a package"); + return; + } }; let slp_typa = match package[0] { aml::AmlValue::Integer(i) => i, - _ => { log::error!("typa is not an Integer"); return; } + _ => { + log::error!("typa is not an Integer"); + return; + } }; let slp_typb = match package[1] { aml::AmlValue::Integer(i) => i, - _ => { log::error!("typb is not an Integer"); return; } + _ => { + log::error!("typb is not an Integer"); + return; + } }; log::trace!("Shutdown SLP_TYPa {:X}, SLP_TYPb {:X}", slp_typa, slp_typb); @@ -646,14 +595,17 @@ impl AcpiContext { #[cfg(not(any(target_arch = "x86", target_arch = "x86_64")))] { - log::error!("Cannot shutdown with ACPI outw(0x{:X}, 0x{:X}) on this architecture", port, val); + log::error!( + "Cannot shutdown with ACPI outw(0x{:X}, 0x{:X}) on this architecture", + port, + val + ); } loop { core::hint::spin_loop(); } } - } #[repr(packed)] @@ -746,12 +698,14 @@ pub struct Fadt(Sdt); impl Fadt { pub fn acpi_2_struct(&self) -> Option<&FadtAcpi2Struct> { - let bytes = &self.0.0[mem::size_of::()..]; + let bytes = &self.0 .0[mem::size_of::()..]; match plain::from_bytes::(bytes) { Ok(fadt2) => Some(fadt2), Err(plain::Error::TooShort) => None, - Err(plain::Error::BadAlignment) => unreachable!("plain::from_bytes reported bad alignment, but FadtAcpi2Struct is #[repr(packed)]"), + Err(plain::Error::BadAlignment) => unreachable!( + "plain::from_bytes reported bad alignment, but FadtAcpi2Struct is #[repr(packed)]" + ), } } } @@ -760,7 +714,7 @@ impl Deref for Fadt { type Target = FadtStruct; fn deref(&self) -> &Self::Target { - plain::from_bytes::(&self.0.0) + plain::from_bytes::(&self.0 .0) .expect("expected FADT struct to already be validated in Deref impl") } } @@ -788,14 +742,12 @@ impl Fadt { let dsdt_ptr = match fadt.acpi_2_struct() { Some(fadt2) => usize::try_from(fadt2.x_dsdt).unwrap_or_else(|_| { - usize::try_from(fadt.dsdt) - .expect("expected any given u32 to fit within usize") + usize::try_from(fadt.dsdt).expect("expected any given u32 to fit within usize") }), - None => usize::try_from(fadt.dsdt) - .expect("expected any given u32 to fit within usize") + None => usize::try_from(fadt.dsdt).expect("expected any given u32 to fit within usize"), }; - log::debug!("FACP at {:X}", {dsdt_ptr}); + log::debug!("FACP at {:X}", { dsdt_ptr }); let dsdt_sdt = match Sdt::load_from_physical(fadt.dsdt as usize) { Ok(dsdt) => dsdt, @@ -933,23 +885,61 @@ impl aml::Handler for AmlPhysMemHandler { 0 } - fn read_pci_u16(&self, _segment: u16, _bus: u8, _device: u8, _function: u8, _offset: u16) -> u16 { + fn read_pci_u16( + &self, + _segment: u16, + _bus: u8, + _device: u8, + _function: u8, + _offset: u16, + ) -> u16 { log::error!("read pci u8 {:X}", _device); 0 } - fn read_pci_u32(&self, _segment: u16, _bus: u8, _device: u8, _function: u8, _offset: u16) -> u32 { + fn read_pci_u32( + &self, + _segment: u16, + _bus: u8, + _device: u8, + _function: u8, + _offset: u16, + ) -> u32 { log::error!("read pci u8 {:X}", _device); 0 } - fn write_pci_u8(&self, _segment: u16, _bus: u8, _device: u8, _function: u8, _offset: u16, _value: u8) { + fn write_pci_u8( + &self, + _segment: u16, + _bus: u8, + _device: u8, + _function: u8, + _offset: u16, + _value: u8, + ) { log::error!("write pci u8 {:X}", _device); } - fn write_pci_u16(&self, _segment: u16, _bus: u8, _device: u8, _function: u8, _offset: u16, _value: u16) { + fn write_pci_u16( + &self, + _segment: u16, + _bus: u8, + _device: u8, + _function: u8, + _offset: u16, + _value: u16, + ) { log::error!("write pci u8 {:X}", _device); } - fn write_pci_u32(&self, _segment: u16, _bus: u8, _device: u8, _function: u8, _offset: u16, _value: u32) { + fn write_pci_u32( + &self, + _segment: u16, + _bus: u8, + _device: u8, + _function: u8, + _offset: u16, + _value: u32, + ) { log::error!("write pci u8 {:X}", _device); } } @@ -1014,23 +1004,61 @@ impl aml::Handler for AmlPhysMemHandler { 0 } - fn read_pci_u16(&self, _segment: u16, _bus: u8, _device: u8, _function: u8, _offset: u16) -> u16 { + fn read_pci_u16( + &self, + _segment: u16, + _bus: u8, + _device: u8, + _function: u8, + _offset: u16, + ) -> u16 { log::error!("read pci u8 {:X}", _device); 0 } - fn read_pci_u32(&self, _segment: u16, _bus: u8, _device: u8, _function: u8, _offset: u16) -> u32 { + fn read_pci_u32( + &self, + _segment: u16, + _bus: u8, + _device: u8, + _function: u8, + _offset: u16, + ) -> u32 { log::error!("read pci u8 {:X}", _device); 0 } - fn write_pci_u8(&self, _segment: u16, _bus: u8, _device: u8, _function: u8, _offset: u16, _value: u8) { + fn write_pci_u8( + &self, + _segment: u16, + _bus: u8, + _device: u8, + _function: u8, + _offset: u16, + _value: u8, + ) { log::error!("write pci u8 {:X}", _device); } - fn write_pci_u16(&self, _segment: u16, _bus: u8, _device: u8, _function: u8, _offset: u16, _value: u16) { + fn write_pci_u16( + &self, + _segment: u16, + _bus: u8, + _device: u8, + _function: u8, + _offset: u16, + _value: u16, + ) { log::error!("write pci u8 {:X}", _device); } - fn write_pci_u32(&self, _segment: u16, _bus: u8, _device: u8, _function: u8, _offset: u16, _value: u32) { + fn write_pci_u32( + &self, + _segment: u16, + _bus: u8, + _device: u8, + _function: u8, + _offset: u16, + _value: u32, + ) { log::error!("write pci u8 {:X}", _device); } } diff --git a/acpid/src/scheme.rs b/acpid/src/scheme.rs index d09b4aee33..a4d598fbc5 100644 --- a/acpid/src/scheme.rs +++ b/acpid/src/scheme.rs @@ -45,7 +45,7 @@ impl HandleKind<'_> { Self::TopLevel => TOPLEVEL_CONTENTS.len(), Self::Tables => acpi_ctx.tables().len().checked_mul(TABLE_DENTRY_LENGTH).unwrap_or(usize::max_value()), Self::Table(signature) => acpi_ctx.sdt_from_signature(signature).ok_or(Error::new(EBADFD))?.length(), - Self::Symbols(aml_symbols) => aml_symbols.to_str().len(), + Self::Symbols(aml_symbols) => aml_symbols.symbols_str().len(), Self::Symbol(description) => description.len(), }) } @@ -287,7 +287,7 @@ impl SchemeMut for AcpiScheme<'_> { } HandleKind::Symbols(aml_symbols) => { - let symbols = aml_symbols.to_str(); + let symbols = aml_symbols.symbols_str(); let offset = std::cmp::min(symbols.len(), handle.offset); let src_buf = &symbols.as_bytes()[offset..]; diff --git a/amlserde/Cargo.toml b/amlserde/Cargo.toml new file mode 100644 index 0000000000..49adbe294e --- /dev/null +++ b/amlserde/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "amlserde" +version = "0.0.1" +authors = ["Ron Williams"] +repository = "https://gitlab.redox-os.org/redox-os/drivers" +description = "Library for serializing AML symbols" +categories = ["hardware-support"] +license = "MIT/Apache-2.0" +edition = "2021" + +[dependencies] +aml = { git = "https://github.com/rw-vanc/acpi.git", branch = "cumulative" } +rustc-hash = "1.1.0" +serde = { version = "1.0", features = ["derive"] } +toml = "0.7.3" diff --git a/amlserde/src/lib.rs b/amlserde/src/lib.rs new file mode 100644 index 0000000000..ae76fee781 --- /dev/null +++ b/amlserde/src/lib.rs @@ -0,0 +1,311 @@ +use aml::value::{FieldAccessType, FieldUpdateRule, RegionSpace}; +use aml::{AmlContext, AmlHandle, AmlName, AmlValue}; +use rustc_hash::FxHashMap; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Serialize, Deserialize)] +pub struct AmlSerde { + pub name: String, + pub value: AmlSerdeValue, +} + +#[derive(Debug, Serialize, Deserialize)] +pub enum AmlSerdeValue { + Boolean(bool), + Integer(u64), + String(String), + OpRegion { + region: AmlSerdeRegionSpace, + offset: u64, + length: u64, + parent_device: Option, + }, + Field { + region: String, + flags: AmlSerdeFieldFlags, + offset: u64, + length: u64, + }, + Device, + Method { + arg_count: u8, + serialize: bool, + sync_level: u8, + }, + Buffer, + BufferField { + offset: u64, + length: u64, + }, + Processor { + id: u8, + pblk_address: u32, + pblk_len: u8, + }, + Mutex { + sync_level: u8, + }, + Package { + contents: Vec, + }, + PowerResource { + system_level: u8, + resource_order: u16, + }, + ThermalZone, + External, +} + +#[derive(Debug, Serialize, Deserialize)] +pub enum AmlSerdeRegionSpace { + SystemMemory, + SystemIo, + PciConfig, + EmbeddedControl, + SMBus, + SystemCmos, + PciBarTarget, + IPMI, + GeneralPurposeIo, + GenericSerialBus, + OemDefined(u8), +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct AmlSerdeFieldFlags { + pub access_type: AmlSerdeFieldAccessType, + pub lock_rule: bool, + pub update_rule: AmlSerdeFieldUpdateRule, +} + +#[derive(Debug, Serialize, Deserialize)] +pub enum AmlSerdeFieldAccessType { + Any, + Byte, + Word, + DWord, + QWord, + Buffer, +} + +#[derive(Debug, Serialize, Deserialize)] +pub enum AmlSerdeFieldUpdateRule { + Preserve, + WriteAsOnes, + WriteAsZeros, +} + +impl AmlSerde { + pub fn default() -> Self { + Self { + name: "name".to_owned(), + value: AmlSerdeValue::String(String::default()), + } + } + + pub fn from_aml( + aml_context: &mut AmlContext, + aml_lookup: &AmlHandleLookup, + name: &String, + aml_name: &AmlName, + handle: &AmlHandle, + ) -> Option { + let aml_value = if let Ok(aml_value) = aml_context.namespace.get(handle.clone()) { + aml_value + } else { + return None; + }; + + let value = if let Some(value) = AmlSerdeValue::from_aml_value(aml_value, aml_lookup) { + value + } else { + return None; + }; + + Some(AmlSerde { + name: aml_name.to_string(), + value, + }) + } +} + +impl AmlSerdeValue { + pub fn default() -> Self { + AmlSerdeValue::String("".to_owned()) + } + + fn from_aml_value(aml_value: &AmlValue, aml_lookup: &AmlHandleLookup) -> Option { + Some(match aml_value { + AmlValue::Boolean(b) => AmlSerdeValue::Boolean(b.to_owned()), + + AmlValue::Integer(n) => AmlSerdeValue::Integer(n.to_owned()), + + AmlValue::String(s) => AmlSerdeValue::String(s.to_owned()), + + AmlValue::OpRegion { + region, + offset, + length, + parent_device, + } => AmlSerdeValue::OpRegion { + region: match region { + RegionSpace::SystemMemory => AmlSerdeRegionSpace::SystemMemory, + RegionSpace::SystemIo => AmlSerdeRegionSpace::SystemIo, + RegionSpace::PciConfig => AmlSerdeRegionSpace::PciConfig, + RegionSpace::EmbeddedControl => AmlSerdeRegionSpace::EmbeddedControl, + RegionSpace::SMBus => AmlSerdeRegionSpace::SMBus, + RegionSpace::SystemCmos => AmlSerdeRegionSpace::SystemCmos, + RegionSpace::PciBarTarget => AmlSerdeRegionSpace::PciBarTarget, + RegionSpace::IPMI => AmlSerdeRegionSpace::IPMI, + RegionSpace::GeneralPurposeIo => AmlSerdeRegionSpace::GeneralPurposeIo, + RegionSpace::GenericSerialBus => AmlSerdeRegionSpace::GenericSerialBus, + RegionSpace::OemDefined(n) => AmlSerdeRegionSpace::OemDefined(n.to_owned()), + }, + offset: offset.to_owned(), + length: length.to_owned(), + parent_device: if let Some(parent) = parent_device { + Some(parent.to_string()) + } else { + None + }, + }, + + AmlValue::Field { + region, + flags, + offset, + length, + } => AmlSerdeValue::Field { + region: if let Some((region, _handle)) = aml_lookup.get(region) { + region.to_string() + } else { + return None; + }, + flags: AmlSerdeFieldFlags { + access_type: match flags.access_type() { + Ok(FieldAccessType::Any) => AmlSerdeFieldAccessType::Any, + Ok(FieldAccessType::Byte) => AmlSerdeFieldAccessType::Byte, + Ok(FieldAccessType::Word) => AmlSerdeFieldAccessType::Word, + Ok(FieldAccessType::DWord) => AmlSerdeFieldAccessType::DWord, + Ok(FieldAccessType::QWord) => AmlSerdeFieldAccessType::QWord, + Ok(FieldAccessType::Buffer) => AmlSerdeFieldAccessType::Buffer, + _ => return None, + }, + lock_rule: flags.lock_rule(), + update_rule: match flags.field_update_rule() { + Ok(FieldUpdateRule::Preserve) => AmlSerdeFieldUpdateRule::Preserve, + Ok(FieldUpdateRule::WriteAsOnes) => AmlSerdeFieldUpdateRule::WriteAsOnes, + Ok(FieldUpdateRule::WriteAsZeros) => AmlSerdeFieldUpdateRule::WriteAsZeros, + _ => return None, + }, + }, + offset: offset.to_owned(), + length: length.to_owned(), + }, + + AmlValue::Device => AmlSerdeValue::Device, + + AmlValue::Method { flags, code: _ } => AmlSerdeValue::Method { + arg_count: flags.arg_count(), + serialize: flags.serialize(), + sync_level: flags.sync_level(), + }, + AmlValue::Buffer(_) => AmlSerdeValue::Buffer, + AmlValue::BufferField { + buffer_data: _, + offset, + length, + } => AmlSerdeValue::BufferField { + offset: offset.to_owned(), + length: length.to_owned(), + }, + AmlValue::Processor { + id, + pblk_address, + pblk_len, + } => AmlSerdeValue::Processor { + id: id.to_owned(), + pblk_address: pblk_address.to_owned(), + pblk_len: pblk_len.to_owned(), + }, + AmlValue::Mutex { sync_level } => AmlSerdeValue::Mutex { + sync_level: sync_level.to_owned(), + }, + AmlValue::Package(aml_contents) => AmlSerdeValue::Package { + contents: aml_contents + .iter() + .filter_map(|item| AmlSerdeValue::from_aml_value(item, aml_lookup)) + .collect(), + }, + + AmlValue::PowerResource { + system_level, + resource_order, + } => AmlSerdeValue::PowerResource { + system_level: system_level.to_owned(), + resource_order: resource_order.to_owned(), + }, + AmlValue::ThermalZone => AmlSerdeValue::ThermalZone, + AmlValue::External => AmlSerdeValue::External, + }) + } +} + +pub mod aml_serde_name { + use aml::AmlName; + + /// Add a leading backslash to make the name a valid + /// namespace reference + pub fn to_aml_format(pretty_name: &String) -> String { + format!("\\{}", pretty_name) + } + + /// convert a string from AML namespace style to + /// acpi symbol style + pub fn to_symbol(aml_style_name: &String) -> String { + let mut name = aml_style_name.to_owned(); + + // remove leading slash + name = name.trim_start_matches("\\").to_owned(); + // remove unnecessary underscores + while let Some(index) = name.find("_.") { + name.remove(index); + } + while name.len() > 0 && &name[name.len() - 1..] == "_" { + name.pop(); + } + name.shrink_to_fit(); + name + } + + /// Convert to string and remove + /// trailing underscores from each name segment + pub fn aml_to_symbol(aml_name: &AmlName) -> String { + to_symbol(&aml_name.as_string()) + } +} + +pub struct AmlHandleLookup { + map: FxHashMap, +} + +impl AmlHandleLookup { + pub fn new() -> Self { + Self { + map: FxHashMap::default(), + } + } + + fn handle_to_key(&self, handle: &AmlHandle) -> String { + format!("{:?}", handle) + } + + pub fn insert(&mut self, handle: AmlHandle, aml_name: AmlName) { + self.map + .insert(self.handle_to_key(&handle), (aml_name, handle)); + } + + pub fn get(&self, handle: &AmlHandle) -> Option<&(AmlName, AmlHandle)> { + self.map.get(&self.handle_to_key(handle)) + } +}