Skip to content

Commit 225403e

Browse files
authored
uk: Bare-Metal Rust (afternoon) (#2089)
uk: Bare-Metal Rust (afternoon), finalize few leftovers
1 parent 545fed4 commit 225403e

File tree

1 file changed

+184
-2
lines changed

1 file changed

+184
-2
lines changed

po/uk.po

Lines changed: 184 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19818,6 +19818,165 @@ msgid ""
1981819818
"\tb 2b\n"
1981919819
"```"
1982019820
msgstr ""
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
1982319982
msgid "_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"
2062320782
msgstr ""
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
2062620794
msgid "/// Reads the current RTC value.\n"
20627-
msgstr ""
20795+
msgstr "/// Зчитує поточне значення RTC.\n"
2062820796

2062920797
#: src/exercises/bare-metal/solutions-afternoon.md
2063020798
msgid ""
2063120799
"// Safe because we know that self.registers points to the control\n"
2063220800
" // registers of a PL031 device which is appropriately mapped.\n"
2063320801
msgstr ""
20802+
"// Безпечно, тому що ми знаємо, що self.registers вказує на керуючі\n"
20803+
" // регістри пристрою PL031, який відповідним чином відображено.\n"
2063420804

2063520805
#: src/exercises/bare-metal/solutions-afternoon.md
2063620806
msgid ""
2063720807
"/// Writes a match value. When the RTC value matches this then an interrupt\n"
2063820808
" /// will be generated (if it is enabled).\n"
2063920809
msgstr ""
20810+
"/// Записує значення збігу. Коли значення RTC збігається з цим, буде\n"
20811+
" /// згенеровано переривання (якщо його увімкнено).\n"
2064020812

2064120813
#: src/exercises/bare-metal/solutions-afternoon.md
2064220814
msgid ""
2064320815
"/// Returns whether the match register matches the RTC value, whether or "
2064420816
"not\n"
2064520817
" /// the interrupt is enabled.\n"
2064620818
msgstr ""
20819+
"/// Повертає, чи відповідає регістр збігу значенню RTC, незалежно від того,\n"
20820+
" /// увімкнено переривання чи ні.\n"
2064720821

2064820822
#: src/exercises/bare-metal/solutions-afternoon.md
2064920823
msgid ""
@@ -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"
2065420828
msgstr ""
20829+
"/// Повертає, чи є переривання в очікуванні.\n"
20830+
" ///\n"
20831+
" /// Це значення має бути істинним тоді і тільки тоді, коли `matched`\n"
20832+
" /// повертає істину і переривання замасковане.\n"
2065520833

2065620834
#: src/exercises/bare-metal/solutions-afternoon.md
2065720835
msgid ""
@@ -20661,10 +20839,14 @@ msgid ""
2066120839
"the\n"
2066220840
" /// interrupt is disabled.\n"
2066320841
msgstr ""
20842+
"/// Встановлює або очищує маску переривання.\n"
20843+
" ///\n"
20844+
" /// Якщо маска дорівнює істині, переривання увімкнено; якщо ні - \n"
20845+
" /// переривання вимкнено.\n"
2066420846

2066520847
#: src/exercises/bare-metal/solutions-afternoon.md
2066620848
msgid "/// Clears a pending interrupt, if any.\n"
20667-
msgstr ""
20849+
msgstr "/// Очищає очікуване переривання, якщо таке є.\n"
2066820850

2066920851
#: src/concurrency.md
2067020852
msgid "Welcome to Concurrency in Rust"

0 commit comments

Comments
 (0)