From a985184b6c5be1860f5b6cba6b64414939068af9 Mon Sep 17 00:00:00 2001 From: SamSu Date: Tue, 30 Jun 2026 17:22:29 +0800 Subject: [PATCH] Add QC UEFI log support --- .gitignore | 1 + highlight/QC_UEFI.json | 85 +++++++++++++++++++++++++++++++++++++++ src/renderer/i18n/en.json | 6 +++ src/renderer/i18n/zh.json | 6 +++ src/renderer/js/app.js | 8 +++- 5 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 highlight/QC_UEFI.json diff --git a/.gitignore b/.gitignore index dec3439..74ffa50 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ dist/ .DS_Store Thumbs.db npm-debug.log* +/.vs diff --git a/highlight/QC_UEFI.json b/highlight/QC_UEFI.json new file mode 100644 index 0000000..a669da9 --- /dev/null +++ b/highlight/QC_UEFI.json @@ -0,0 +1,85 @@ +{ + "_comment": "QC UEFI (Patina) log highlight rules. Edit this file to add/adjust highlighting. Each rule: name, level (error|warn|info|version|hwinfo, or a custom level), pattern (JavaScript regex source, case-insensitive). Whole-line tint follows the highest level matched on that line.", + "rules": [ + { + "name": "error", + "level": "error", + "pattern": "\\b(?:error|err|fail(?:ed|ure)?|fatal|panic|exception|assert(?:ion)?|abort(?:ed)?|halt|hang|bugcheck|unexpected|invalid|corrupt(?:ed)?)\\b" + }, + { + "name": "warning", + "level": "warn", + "pattern": "\\b(?:warn(?:ing)?|timeout|timed?\\s*out|retry|retries|retrying|skip(?:ped)?|deprecated)\\b" + }, + { + "name": "i2c-transfer-failed", + "level": "error", + "pattern": "iStatus\\s*=\\s*0x[0-9a-f]+" + }, + { + "name": "fru", + "level": "fru", + "pattern": "TDM\\s+Replacement\\s+Mode\\s+(?:not\\s+)?requested|New\\s+Display\\s+Module\\s+detected|Unlocking\\s+Cal\\s+data\\s+storage|SerialNumUpdateRequested\\s*:\\s*\\d|Motherboard\\s+Serial\\s+Number\\s*:" + }, + { + "name": "version", + "level": "version", + "pattern": "(?:Bootchain\\s+version|SAM\\s+version|UEFI\\s+Runtime\\s+Mode|Commit\\s+Hash)\\s*:.*" + }, + { + "name": "patina-version", + "level": "version", + "pattern": "Starting\\s+Patina\\s+with\\s+\\S+\\s+[\\d.]+" + }, + { + "name": "soc-serial-number", + "level": "socsn", + "pattern": "Serial\\s+Number\\s*@\\s*0x[0-9A-Fa-f]+\\s*=\\s*0x[0-9A-Fa-f]+" + }, + { + "name": "hwinfo", + "level": "hwinfo", + "pattern": "(?:Program\\s+ID|SKU\\s+ID|Memory\\s+ID|Build\\s+ID|SoC\\s+Version|SoC\\s+Cores|SoC\\s+Fuse|Tdm\\s+Board\\s+ID|Storage\\s+Type)\\s*:.*" + }, + { + "name": "spinor-vendor-id", + "level": "hwinfo", + "pattern": "Spinor\\(9F\\)\\s*:.*" + }, + { + "name": "nvram-dump", + "level": "nvram", + "pattern": "\\[DebugDumpAllUefiVariables\\].*|(?:NV|BS|RT)[+A-Z]*\\s+'[^']+'\\s+DataSize\\s*=\\s*0x[0-9A-Fa-f]+" + }, + { + "name": "nvram-varlist", + "level": "nvram", + "pattern": "==== TestPointDumpVariable.*|Variable List:|Name=L\"[^\"]*\"\\s+Guid=.*Attr=.*" + }, + { + "name": "gpio-config", + "level": "gpio", + "pattern": "\\[ConfigAndSetGpios\\].*|GPIO_\\d+\\s+FUNCTION:.*" + }, + { + "name": "gpio-platconf", + "level": "gpio", + "pattern": "\\[PlatConfSocGpioPrint\\].*|\\[GPIO No\\.\\s*\\d+\\].*" + }, + { + "name": "uefi-perf", + "level": "perf", + "pattern": "FirmwareBootPerformanceDxe::.*measurements\\s*:.*|->\\s*\\S.*=\\s*\\d+\\s*ms\\b|Total\\s+\\S.*=\\s*\\d+\\s*ms\\b" + }, + { + "name": "boot-milestone", + "level": "boot", + "pattern": "UEFI\\s+(?:Start|End)\\s+\\[\\s*\\d+\\s*\\]|EBS\\s+completed\\s+successfully" + }, + { + "name": "membucket-header", + "level": "membucket", + "pattern": "Memory\\s+Previous\\s+Current\\s+Minimum\\s+Next" + } + ] +} diff --git a/src/renderer/i18n/en.json b/src/renderer/i18n/en.json index 8b199be..a8c5570 100644 --- a/src/renderer/i18n/en.json +++ b/src/renderer/i18n/en.json @@ -113,6 +113,12 @@ "ana.intr": "Interrupt", "ana.uefissh": "UEFI_SSH", "ana.pd": "PD", + "ana.hwinfo": "Hardware Info", + "ana.fru": "FRU", + "ana.socsn2": "SOC SN", + "ana.nvram": "NVRAM", + "ana.gpio": "GPIO", + "ana.perf": "UEFI Perf", "ana.level.toggle": "Select: include in count / up-down navigation", "ana.level.jump": "Jump to next (Shift+click: previous)", "ana.find.ph": "Search…", diff --git a/src/renderer/i18n/zh.json b/src/renderer/i18n/zh.json index 7ad4bb4..81069b4 100644 --- a/src/renderer/i18n/zh.json +++ b/src/renderer/i18n/zh.json @@ -113,6 +113,12 @@ "ana.intr": "中斷", "ana.uefissh": "UEFI_SSH", "ana.pd": "PD", + "ana.hwinfo": "硬體資訊", + "ana.fru": "FRU", + "ana.socsn2": "SOC SN", + "ana.nvram": "NVRAM", + "ana.gpio": "GPIO", + "ana.perf": "UEFI 效能", "ana.level.toggle": "選取:是否納入計數與上下導覽", "ana.level.jump": "跳到下一個(Shift+點擊:上一個)", "ana.find.ph": "搜尋…", diff --git a/src/renderer/js/app.js b/src/renderer/js/app.js index b7e86bc..96f62bc 100644 --- a/src/renderer/js/app.js +++ b/src/renderer/js/app.js @@ -1650,7 +1650,7 @@ async function anaPopulateHl() { sel.value = ana.hl || 'auto'; } -const ANA_RANK = { info: 1, intr: 1.5, warn: 2, error: 3 }; +const ANA_RANK = { info: 1, hwinfo: 1, fru: 1, socsn: 1, nvram: 1, gpio: 1, perf: 1, intr: 1.5, warn: 2, error: 3 }; function anaHighlightLine(line, rules) { // Match against the RAW text (not HTML-escaped) so patterns can use real @@ -2287,6 +2287,12 @@ function anaLevelLabel(level) { if (level === 'intr') return t('ana.intr', '中斷'); if (level === 'uefissh') return t('ana.uefissh', 'UEFI_SSH'); if (level === 'pd') return t('ana.pd', 'PD'); + if (level === 'hwinfo') return t('ana.hwinfo', '硬體資訊'); + if (level === 'fru') return t('ana.fru', 'FRU'); + if (level === 'socsn') return t('ana.socsn2', 'SOC SN'); + if (level === 'nvram') return t('ana.nvram', 'NVRAM'); + if (level === 'gpio') return t('ana.gpio', 'GPIO'); + if (level === 'perf') return t('ana.perf', 'UEFI Perf'); if (anaIsMarkLevel(level)) return anaMarkLabel(level); return String(level || '').toUpperCase(); }