mirror of
https://github.com/google/comprehensive-rust.git
synced 2025-03-19 22:19:29 +02:00
uk: Bare-Metal Rust (afternoon) (#2089)
uk: Bare-Metal Rust (afternoon), finalize few leftovers
This commit is contained in:
parent
545fed4bdf
commit
225403ea27
186
po/uk.po
186
po/uk.po
@ -19818,6 +19818,165 @@ msgid ""
|
||||
"\tb 2b\n"
|
||||
"```"
|
||||
msgstr ""
|
||||
"```armasm\n"
|
||||
"/*\n"
|
||||
" * Copyright 2023 Google LLC\n"
|
||||
" *\n"
|
||||
" * Licensed under the Apache License, Version 2.0 (the \"License\");\n"
|
||||
" * you may not use this file except in compliance with the License.\n"
|
||||
" * You may obtain a copy of the License at\n"
|
||||
" *\n"
|
||||
" * https://www.apache.org/licenses/LICENSE-2.0\n"
|
||||
" *\n"
|
||||
" * Unless required by applicable law or agreed to in writing, software\n"
|
||||
" * distributed under the License is distributed on an \"AS IS\" BASIS,\n"
|
||||
" * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n"
|
||||
" * See the License for the specific language governing permissions and\n"
|
||||
" * limitations under the License.\n"
|
||||
" */\n"
|
||||
"\n"
|
||||
".macro adr_l, reg:req, sym:req\n"
|
||||
"\tadrp \\reg, \\sym\n"
|
||||
"\tadd \\reg, \\reg, :lo12:\\sym\n"
|
||||
".endm\n"
|
||||
"\n"
|
||||
".macro mov_i, reg:req, imm:req\n"
|
||||
"\tmovz \\reg, :abs_g3:\\imm\n"
|
||||
"\tmovk \\reg, :abs_g2_nc:\\imm\n"
|
||||
"\tmovk \\reg, :abs_g1_nc:\\imm\n"
|
||||
"\tmovk \\reg, :abs_g0_nc:\\imm\n"
|
||||
".endm\n"
|
||||
"\n"
|
||||
".set .L_MAIR_DEV_nGnRE,\t0x04\n"
|
||||
".set .L_MAIR_MEM_WBWA,\t0xff\n"
|
||||
".set .Lmairval, .L_MAIR_DEV_nGnRE | (.L_MAIR_MEM_WBWA << 8)\n"
|
||||
"\n"
|
||||
"/* Розмір гранул 4 KiB для TTBR0_EL1. */\n"
|
||||
".set .L_TCR_TG0_4KB, 0x0 << 14\n"
|
||||
"/* Розмір гранул 4 KiB для TTBR1_EL1. */\n"
|
||||
".set .L_TCR_TG1_4KB, 0x2 << 30\n"
|
||||
"/* Вимкнути обхід таблиці перекладу для TTBR1_EL1, замість цього генерувати "
|
||||
"помилку трансляції. */\n"
|
||||
".set .L_TCR_EPD1, 0x1 << 23\n"
|
||||
"/* Обхід таблиці перекладу для TTBR0_EL1 є внутрішньо спільним. */\n"
|
||||
".set .L_TCR_SH_INNER, 0x3 << 12\n"
|
||||
"/*\n"
|
||||
" * Обхід таблиці трансляції для TTBR0_EL1 є зовнішнім зворотним записом "
|
||||
"зчитуванням-виділенням записом-виділенням\n"
|
||||
" * з кешуванням.\n"
|
||||
" */\n"
|
||||
".set .L_TCR_RGN_OWB, 0x1 << 10\n"
|
||||
"/*\n"
|
||||
" * Обхід таблиці трансляції для TTBR0_EL1 є внутрішнім зворотним записом "
|
||||
"зчитуванням-виділенням записом-виділенням\n"
|
||||
" * з кешуванням.\n"
|
||||
" */\n"
|
||||
".set .L_TCR_RGN_IWB, 0x1 << 8\n"
|
||||
"/* Зміщення розміру для TTBR0_EL1 становить 2**39 байт (512 Гігабайт). */\n"
|
||||
".set .L_TCR_T0SZ_512, 64 - 39\n"
|
||||
".set .Ltcrval, .L_TCR_TG0_4KB | .L_TCR_TG1_4KB | .L_TCR_EPD1 | ."
|
||||
"L_TCR_RGN_OWB\n"
|
||||
".set .Ltcrval, .Ltcrval | .L_TCR_RGN_IWB | .L_TCR_SH_INNER | ."
|
||||
"L_TCR_T0SZ_512\n"
|
||||
"\n"
|
||||
"/* Кешування доступу до інструкцій етапу 1 не порушується. */\n"
|
||||
".set .L_SCTLR_ELx_I, 0x1 << 12\n"
|
||||
"/* Помилка вирівнювання SP, якщо SP не вирівняно до межі 16 байт. */\n"
|
||||
".set .L_SCTLR_ELx_SA, 0x1 << 3\n"
|
||||
"/* Кешування доступу до даних на етапі 1 не порушується. */\n"
|
||||
".set .L_SCTLR_ELx_C, 0x1 << 2\n"
|
||||
"/* EL0 і EL1 етапу 1 MMU увімкнено. */\n"
|
||||
".set .L_SCTLR_ELx_M, 0x1 << 0\n"
|
||||
"/* Privileged Access Never не змінюється, коли робиться виключення з EL1. "
|
||||
"*/\n"
|
||||
".set .L_SCTLR_EL1_SPAN, 0x1 << 23\n"
|
||||
"/* Інструкція SETEND відключена на EL0 у режимі aarch32. */\n"
|
||||
".set .L_SCTLR_EL1_SED, 0x1 << 8\n"
|
||||
"/* У режимі aarch32 на EL0 відключені різні ІТ-інструкції. */\n"
|
||||
".set .L_SCTLR_EL1_ITD, 0x1 << 7\n"
|
||||
".set .L_SCTLR_EL1_RES1, (0x1 << 11) | (0x1 << 20) | (0x1 << 22) | (0x1 << "
|
||||
"28) | (0x1 << 29)\n"
|
||||
".set .Lsctlrval, .L_SCTLR_ELx_M | .L_SCTLR_ELx_C | .L_SCTLR_ELx_SA | ."
|
||||
"L_SCTLR_EL1_ITD | .L_SCTLR_EL1_SED\n"
|
||||
".set .Lsctlrval, .Lsctlrval | .L_SCTLR_ELx_I | .L_SCTLR_EL1_SPAN | ."
|
||||
"L_SCTLR_EL1_RES1\n"
|
||||
"\n"
|
||||
"/**\n"
|
||||
" * Це загальна точка входу для образу. Вона виконує операції, необхідні для "
|
||||
"підготовки\n"
|
||||
" * завантаженого образу до запуску. Зокрема, обнуляє секцію bss за допомогою "
|
||||
"регістрів x25 і вище,\n"
|
||||
" * готує стек, вмикає плаваючу крапку і налаштовує вектор виключень. Вона "
|
||||
"зберігає x0-x3 для\n"
|
||||
" * точки входу у Rust, оскільки вони можуть містити параметри завантаження.\n"
|
||||
" */\n"
|
||||
".section .init.entry, \"ax\"\n"
|
||||
".global entry\n"
|
||||
"entry:\n"
|
||||
"\t/* Завантажує та застосовує конфігурацію керування пам'яттю, готові до "
|
||||
"ввімкнення MMU та кешів. */\n"
|
||||
"\tadrp x30, idmap\n"
|
||||
"\tmsr ttbr0_el1, x30\n"
|
||||
"\n"
|
||||
"\tmov_i x30, .Lmairval\n"
|
||||
"\tmsr mair_el1, x30\n"
|
||||
"\n"
|
||||
"\tmov_i x30, .Ltcrval\n"
|
||||
"\t/* Копіюємо підтримуваний діапазон PA у TCR_EL1.IPS. */\n"
|
||||
"\tmrs x29, id_aa64mmfr0_el1\n"
|
||||
"\tbfi x30, x29, #32, #4\n"
|
||||
"\n"
|
||||
"\tmsr tcr_el1, x30\n"
|
||||
"\n"
|
||||
"\tmov_i x30, .Lsctlrval\n"
|
||||
"\n"
|
||||
"\t/*\n"
|
||||
"\t * Перевіряємо все до завершення цього етапу, а потім робимо недійсними "
|
||||
"всі потенційно застарілі\n"
|
||||
"\t * локальні записи TLB, перш ніж вони почнуть використовуватися.\n"
|
||||
"\t */\n"
|
||||
"\tisb\n"
|
||||
"\ttlbi vmalle1\n"
|
||||
"\tic iallu\n"
|
||||
"\tdsb nsh\n"
|
||||
"\tisb\n"
|
||||
"\n"
|
||||
"\t/*\n"
|
||||
"\t * Налаштовуємо sctlr_el1, щоб увімкнути MMU і кеш, і не продовжуємо, доки "
|
||||
"це не буде зроблено.\n"
|
||||
"\t */\n"
|
||||
"\tmsr sctlr_el1, x30\n"
|
||||
"\tisb\n"
|
||||
"\n"
|
||||
"\t/* Вимкнути перехоплення доступу з плаваючою комою в EL1. */\n"
|
||||
"\tmrs x30, cpacr_el1\n"
|
||||
"\torr x30, x30, #(0x3 << 20)\n"
|
||||
"\tmsr cpacr_el1, x30\n"
|
||||
"\tisb\n"
|
||||
"\n"
|
||||
"\t/* Обнулити секцію bss. */\n"
|
||||
"\tadr_l x29, bss_begin\n"
|
||||
"\tadr_l x30, bss_end\n"
|
||||
"0:\tcmp x29, x30\n"
|
||||
"\tb.hs 1f\n"
|
||||
"\tstp xzr, xzr, [x29], #16\n"
|
||||
"\tb 0b\n"
|
||||
"\n"
|
||||
"1:\t/* Готуємо стек. */\n"
|
||||
"\tadr_l x30, boot_stack_end\n"
|
||||
"\tmov sp, x30\n"
|
||||
"\n"
|
||||
"\t/* Настроюємо вектор виключень. */\n"
|
||||
"\tadr x30, vector_table_el1\n"
|
||||
"\tmsr vbar_el1, x30\n"
|
||||
"\n"
|
||||
"\t/* Виклик коду Rust. */\n"
|
||||
"\tbl main\n"
|
||||
"\n"
|
||||
"\t/* Цикл з постійним очікуванням переривань. */\n"
|
||||
"2:\twfi\n"
|
||||
"\tb 2b\n"
|
||||
"```"
|
||||
|
||||
#: src/exercises/bare-metal/rtc.md
|
||||
msgid "_exceptions.S_ (you shouldn't need to change this):"
|
||||
@ -20621,22 +20780,35 @@ msgid ""
|
||||
"process\n"
|
||||
" /// as device memory and not have any other aliases.\n"
|
||||
msgstr ""
|
||||
"/// Створює новий екземпляр драйвера RTC для пристрою PL031 за заданою\n"
|
||||
" /// базовою адресою.\n"
|
||||
" ///\n"
|
||||
" /// # Безпека\n"
|
||||
" ///\n"
|
||||
" /// Вказана базова адреса має вказувати на регістри керування MMIO\n"
|
||||
" /// пристрою PL031, які мають бути відображені у адресному просторі "
|
||||
"процесу\n"
|
||||
" /// як пам'ять пристрою і не мати інших псевдонімів.\n"
|
||||
|
||||
#: src/exercises/bare-metal/solutions-afternoon.md
|
||||
msgid "/// Reads the current RTC value.\n"
|
||||
msgstr ""
|
||||
msgstr "/// Зчитує поточне значення RTC.\n"
|
||||
|
||||
#: src/exercises/bare-metal/solutions-afternoon.md
|
||||
msgid ""
|
||||
"// Safe because we know that self.registers points to the control\n"
|
||||
" // registers of a PL031 device which is appropriately mapped.\n"
|
||||
msgstr ""
|
||||
"// Безпечно, тому що ми знаємо, що self.registers вказує на керуючі\n"
|
||||
" // регістри пристрою PL031, який відповідним чином відображено.\n"
|
||||
|
||||
#: src/exercises/bare-metal/solutions-afternoon.md
|
||||
msgid ""
|
||||
"/// Writes a match value. When the RTC value matches this then an interrupt\n"
|
||||
" /// will be generated (if it is enabled).\n"
|
||||
msgstr ""
|
||||
"/// Записує значення збігу. Коли значення RTC збігається з цим, буде\n"
|
||||
" /// згенеровано переривання (якщо його увімкнено).\n"
|
||||
|
||||
#: src/exercises/bare-metal/solutions-afternoon.md
|
||||
msgid ""
|
||||
@ -20644,6 +20816,8 @@ msgid ""
|
||||
"not\n"
|
||||
" /// the interrupt is enabled.\n"
|
||||
msgstr ""
|
||||
"/// Повертає, чи відповідає регістр збігу значенню RTC, незалежно від того,\n"
|
||||
" /// увімкнено переривання чи ні.\n"
|
||||
|
||||
#: src/exercises/bare-metal/solutions-afternoon.md
|
||||
msgid ""
|
||||
@ -20652,6 +20826,10 @@ msgid ""
|
||||
" /// This should be true if and only if `matched` returns true and the\n"
|
||||
" /// interrupt is masked.\n"
|
||||
msgstr ""
|
||||
"/// Повертає, чи є переривання в очікуванні.\n"
|
||||
" ///\n"
|
||||
" /// Це значення має бути істинним тоді і тільки тоді, коли `matched`\n"
|
||||
" /// повертає істину і переривання замасковане.\n"
|
||||
|
||||
#: src/exercises/bare-metal/solutions-afternoon.md
|
||||
msgid ""
|
||||
@ -20661,10 +20839,14 @@ msgid ""
|
||||
"the\n"
|
||||
" /// interrupt is disabled.\n"
|
||||
msgstr ""
|
||||
"/// Встановлює або очищує маску переривання.\n"
|
||||
" ///\n"
|
||||
" /// Якщо маска дорівнює істині, переривання увімкнено; якщо ні - \n"
|
||||
" /// переривання вимкнено.\n"
|
||||
|
||||
#: src/exercises/bare-metal/solutions-afternoon.md
|
||||
msgid "/// Clears a pending interrupt, if any.\n"
|
||||
msgstr ""
|
||||
msgstr "/// Очищає очікуване переривання, якщо таке є.\n"
|
||||
|
||||
#: src/concurrency.md
|
||||
msgid "Welcome to Concurrency in Rust"
|
||||
|
Loading…
x
Reference in New Issue
Block a user