@@ -19818,6 +19818,165 @@ msgid ""
1981819818"\tb 2b\n"
1981919819"```"
1982019820msgstr ""
19821+ "```armasm\n"
19822+ "/*\n"
19823+ " * Copyright 2023 Google LLC\n"
19824+ " *\n"
19825+ " * Licensed under the Apache License, Version 2.0 (the \"License\");\n"
19826+ " * you may not use this file except in compliance with the License.\n"
19827+ " * You may obtain a copy of the License at\n"
19828+ " *\n"
19829+ " * https://www.apache.org/licenses/LICENSE-2.0\n"
19830+ " *\n"
19831+ " * Unless required by applicable law or agreed to in writing, software\n"
19832+ " * distributed under the License is distributed on an \"AS IS\" BASIS,\n"
19833+ " * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n"
19834+ " * See the License for the specific language governing permissions and\n"
19835+ " * limitations under the License.\n"
19836+ " */\n"
19837+ "\n"
19838+ ".macro adr_l, reg:req, sym:req\n"
19839+ "\tadrp \\reg, \\sym\n"
19840+ "\tadd \\reg, \\reg, :lo12:\\sym\n"
19841+ ".endm\n"
19842+ "\n"
19843+ ".macro mov_i, reg:req, imm:req\n"
19844+ "\tmovz \\reg, :abs_g3:\\imm\n"
19845+ "\tmovk \\reg, :abs_g2_nc:\\imm\n"
19846+ "\tmovk \\reg, :abs_g1_nc:\\imm\n"
19847+ "\tmovk \\reg, :abs_g0_nc:\\imm\n"
19848+ ".endm\n"
19849+ "\n"
19850+ ".set .L_MAIR_DEV_nGnRE,\t0x04\n"
19851+ ".set .L_MAIR_MEM_WBWA,\t0xff\n"
19852+ ".set .Lmairval, .L_MAIR_DEV_nGnRE | (.L_MAIR_MEM_WBWA << 8)\n"
19853+ "\n"
19854+ "/* Розмір гранул 4 KiB для TTBR0_EL1. */\n"
19855+ ".set .L_TCR_TG0_4KB, 0x0 << 14\n"
19856+ "/* Розмір гранул 4 KiB для TTBR1_EL1. */\n"
19857+ ".set .L_TCR_TG1_4KB, 0x2 << 30\n"
19858+ "/* Вимкнути обхід таблиці перекладу для TTBR1_EL1, замість цього генерувати "
19859+ "помилку трансляції. */\n"
19860+ ".set .L_TCR_EPD1, 0x1 << 23\n"
19861+ "/* Обхід таблиці перекладу для TTBR0_EL1 є внутрішньо спільним. */\n"
19862+ ".set .L_TCR_SH_INNER, 0x3 << 12\n"
19863+ "/*\n"
19864+ " * Обхід таблиці трансляції для TTBR0_EL1 є зовнішнім зворотним записом "
19865+ "зчитуванням-виділенням записом-виділенням\n"
19866+ " * з кешуванням.\n"
19867+ " */\n"
19868+ ".set .L_TCR_RGN_OWB, 0x1 << 10\n"
19869+ "/*\n"
19870+ " * Обхід таблиці трансляції для TTBR0_EL1 є внутрішнім зворотним записом "
19871+ "зчитуванням-виділенням записом-виділенням\n"
19872+ " * з кешуванням.\n"
19873+ " */\n"
19874+ ".set .L_TCR_RGN_IWB, 0x1 << 8\n"
19875+ "/* Зміщення розміру для TTBR0_EL1 становить 2**39 байт (512 Гігабайт). */\n"
19876+ ".set .L_TCR_T0SZ_512, 64 - 39\n"
19877+ ".set .Ltcrval, .L_TCR_TG0_4KB | .L_TCR_TG1_4KB | .L_TCR_EPD1 | ."
19878+ "L_TCR_RGN_OWB\n"
19879+ ".set .Ltcrval, .Ltcrval | .L_TCR_RGN_IWB | .L_TCR_SH_INNER | ."
19880+ "L_TCR_T0SZ_512\n"
19881+ "\n"
19882+ "/* Кешування доступу до інструкцій етапу 1 не порушується. */\n"
19883+ ".set .L_SCTLR_ELx_I, 0x1 << 12\n"
19884+ "/* Помилка вирівнювання SP, якщо SP не вирівняно до межі 16 байт. */\n"
19885+ ".set .L_SCTLR_ELx_SA, 0x1 << 3\n"
19886+ "/* Кешування доступу до даних на етапі 1 не порушується. */\n"
19887+ ".set .L_SCTLR_ELx_C, 0x1 << 2\n"
19888+ "/* EL0 і EL1 етапу 1 MMU увімкнено. */\n"
19889+ ".set .L_SCTLR_ELx_M, 0x1 << 0\n"
19890+ "/* Privileged Access Never не змінюється, коли робиться виключення з EL1. "
19891+ "*/\n"
19892+ ".set .L_SCTLR_EL1_SPAN, 0x1 << 23\n"
19893+ "/* Інструкція SETEND відключена на EL0 у режимі aarch32. */\n"
19894+ ".set .L_SCTLR_EL1_SED, 0x1 << 8\n"
19895+ "/* У режимі aarch32 на EL0 відключені різні ІТ-інструкції. */\n"
19896+ ".set .L_SCTLR_EL1_ITD, 0x1 << 7\n"
19897+ ".set .L_SCTLR_EL1_RES1, (0x1 << 11) | (0x1 << 20) | (0x1 << 22) | (0x1 << "
19898+ "28) | (0x1 << 29)\n"
19899+ ".set .Lsctlrval, .L_SCTLR_ELx_M | .L_SCTLR_ELx_C | .L_SCTLR_ELx_SA | ."
19900+ "L_SCTLR_EL1_ITD | .L_SCTLR_EL1_SED\n"
19901+ ".set .Lsctlrval, .Lsctlrval | .L_SCTLR_ELx_I | .L_SCTLR_EL1_SPAN | ."
19902+ "L_SCTLR_EL1_RES1\n"
19903+ "\n"
19904+ "/**\n"
19905+ " * Це загальна точка входу для образу. Вона виконує операції, необхідні для "
19906+ "підготовки\n"
19907+ " * завантаженого образу до запуску. Зокрема, обнуляє секцію bss за допомогою "
19908+ "регістрів x25 і вище,\n"
19909+ " * готує стек, вмикає плаваючу крапку і налаштовує вектор виключень. Вона "
19910+ "зберігає x0-x3 для\n"
19911+ " * точки входу у Rust, оскільки вони можуть містити параметри завантаження.\n"
19912+ " */\n"
19913+ ".section .init.entry, \"ax\"\n"
19914+ ".global entry\n"
19915+ "entry:\n"
19916+ "\t/* Завантажує та застосовує конфігурацію керування пам'яттю, готові до "
19917+ "ввімкнення MMU та кешів. */\n"
19918+ "\tadrp x30, idmap\n"
19919+ "\tmsr ttbr0_el1, x30\n"
19920+ "\n"
19921+ "\tmov_i x30, .Lmairval\n"
19922+ "\tmsr mair_el1, x30\n"
19923+ "\n"
19924+ "\tmov_i x30, .Ltcrval\n"
19925+ "\t/* Копіюємо підтримуваний діапазон PA у TCR_EL1.IPS. */\n"
19926+ "\tmrs x29, id_aa64mmfr0_el1\n"
19927+ "\tbfi x30, x29, #32, #4\n"
19928+ "\n"
19929+ "\tmsr tcr_el1, x30\n"
19930+ "\n"
19931+ "\tmov_i x30, .Lsctlrval\n"
19932+ "\n"
19933+ "\t/*\n"
19934+ "\t * Перевіряємо все до завершення цього етапу, а потім робимо недійсними "
19935+ "всі потенційно застарілі\n"
19936+ "\t * локальні записи TLB, перш ніж вони почнуть використовуватися.\n"
19937+ "\t */\n"
19938+ "\tisb\n"
19939+ "\ttlbi vmalle1\n"
19940+ "\tic iallu\n"
19941+ "\tdsb nsh\n"
19942+ "\tisb\n"
19943+ "\n"
19944+ "\t/*\n"
19945+ "\t * Налаштовуємо sctlr_el1, щоб увімкнути MMU і кеш, і не продовжуємо, доки "
19946+ "це не буде зроблено.\n"
19947+ "\t */\n"
19948+ "\tmsr sctlr_el1, x30\n"
19949+ "\tisb\n"
19950+ "\n"
19951+ "\t/* Вимкнути перехоплення доступу з плаваючою комою в EL1. */\n"
19952+ "\tmrs x30, cpacr_el1\n"
19953+ "\torr x30, x30, #(0x3 << 20)\n"
19954+ "\tmsr cpacr_el1, x30\n"
19955+ "\tisb\n"
19956+ "\n"
19957+ "\t/* Обнулити секцію bss. */\n"
19958+ "\tadr_l x29, bss_begin\n"
19959+ "\tadr_l x30, bss_end\n"
19960+ "0:\tcmp x29, x30\n"
19961+ "\tb.hs 1f\n"
19962+ "\tstp xzr, xzr, [x29], #16\n"
19963+ "\tb 0b\n"
19964+ "\n"
19965+ "1:\t/* Готуємо стек. */\n"
19966+ "\tadr_l x30, boot_stack_end\n"
19967+ "\tmov sp, x30\n"
19968+ "\n"
19969+ "\t/* Настроюємо вектор виключень. */\n"
19970+ "\tadr x30, vector_table_el1\n"
19971+ "\tmsr vbar_el1, x30\n"
19972+ "\n"
19973+ "\t/* Виклик коду Rust. */\n"
19974+ "\tbl main\n"
19975+ "\n"
19976+ "\t/* Цикл з постійним очікуванням переривань. */\n"
19977+ "2:\twfi\n"
19978+ "\tb 2b\n"
19979+ "```"
1982119980
1982219981#: src/exercises/bare-metal/rtc.md
1982319982msgid "_exceptions.S_ (you shouldn't need to change this):"
@@ -20621,29 +20780,44 @@ msgid ""
2062120780"process\n"
2062220781" /// as device memory and not have any other aliases.\n"
2062320782msgstr ""
20783+ "/// Створює новий екземпляр драйвера RTC для пристрою PL031 за заданою\n"
20784+ " /// базовою адресою.\n"
20785+ " ///\n"
20786+ " /// # Безпека\n"
20787+ " ///\n"
20788+ " /// Вказана базова адреса має вказувати на регістри керування MMIO\n"
20789+ " /// пристрою PL031, які мають бути відображені у адресному просторі "
20790+ "процесу\n"
20791+ " /// як пам'ять пристрою і не мати інших псевдонімів.\n"
2062420792
2062520793#: src/exercises/bare-metal/solutions-afternoon.md
2062620794msgid "/// Reads the current RTC value.\n"
20627- msgstr ""
20795+ msgstr "/// Зчитує поточне значення RTC.\n "
2062820796
2062920797#: src/exercises/bare-metal/solutions-afternoon.md
2063020798msgid ""
2063120799"// Safe because we know that self.registers points to the control\n"
2063220800" // registers of a PL031 device which is appropriately mapped.\n"
2063320801msgstr ""
20802+ "// Безпечно, тому що ми знаємо, що self.registers вказує на керуючі\n"
20803+ " // регістри пристрою PL031, який відповідним чином відображено.\n"
2063420804
2063520805#: src/exercises/bare-metal/solutions-afternoon.md
2063620806msgid ""
2063720807"/// Writes a match value. When the RTC value matches this then an interrupt\n"
2063820808" /// will be generated (if it is enabled).\n"
2063920809msgstr ""
20810+ "/// Записує значення збігу. Коли значення RTC збігається з цим, буде\n"
20811+ " /// згенеровано переривання (якщо його увімкнено).\n"
2064020812
2064120813#: src/exercises/bare-metal/solutions-afternoon.md
2064220814msgid ""
2064320815"/// Returns whether the match register matches the RTC value, whether or "
2064420816"not\n"
2064520817" /// the interrupt is enabled.\n"
2064620818msgstr ""
20819+ "/// Повертає, чи відповідає регістр збігу значенню RTC, незалежно від того,\n"
20820+ " /// увімкнено переривання чи ні.\n"
2064720821
2064820822#: src/exercises/bare-metal/solutions-afternoon.md
2064920823msgid ""
@@ -20652,6 +20826,10 @@ msgid ""
2065220826" /// This should be true if and only if `matched` returns true and the\n"
2065320827" /// interrupt is masked.\n"
2065420828msgstr ""
20829+ "/// Повертає, чи є переривання в очікуванні.\n"
20830+ " ///\n"
20831+ " /// Це значення має бути істинним тоді і тільки тоді, коли `matched`\n"
20832+ " /// повертає істину і переривання замасковане.\n"
2065520833
2065620834#: src/exercises/bare-metal/solutions-afternoon.md
2065720835msgid ""
@@ -20661,10 +20839,14 @@ msgid ""
2066120839"the\n"
2066220840" /// interrupt is disabled.\n"
2066320841msgstr ""
20842+ "/// Встановлює або очищує маску переривання.\n"
20843+ " ///\n"
20844+ " /// Якщо маска дорівнює істині, переривання увімкнено; якщо ні - \n"
20845+ " /// переривання вимкнено.\n"
2066420846
2066520847#: src/exercises/bare-metal/solutions-afternoon.md
2066620848msgid "/// Clears a pending interrupt, if any.\n"
20667- msgstr ""
20849+ msgstr "/// Очищає очікуване переривання, якщо таке є.\n "
2066820850
2066920851#: src/concurrency.md
2067020852msgid "Welcome to Concurrency in Rust"
0 commit comments