From ea9a3f7c6c3756ba94674773f26ca8c8565f094b Mon Sep 17 00:00:00 2001 From: Ivan Baravy Date: Tue, 9 Jul 2024 21:05:43 +0100 Subject: [PATCH] kernel: Clean up svn-related code and data * Rearrange sf18.13 version structure to + mention git hash and release offset, + separate OS release and kernel ABI numbers, + include an optional debug tag. * Update the boot log and the blue screen to print the new fields. * Update docs. * No breaking changes. Resolves #99. --- data/Tupfile.lua | 4 --- kernel/trunk/Tupfile.lua | 23 ++++++++++--- kernel/trunk/boot/bootstr.inc | 60 +++++++++++++++++++--------------- kernel/trunk/bootbios.inc | 31 +++++++++++++++++- kernel/trunk/const.inc | 27 +++++++++++++++ kernel/trunk/docs/sysfuncr.txt | 18 +++++++--- kernel/trunk/docs/sysfuncs.txt | 18 +++++++--- kernel/trunk/kernel.asm | 54 +++++++++++++++++++++++------- kernel/trunk/macros.inc | 10 ------ 9 files changed, 177 insertions(+), 68 deletions(-) diff --git a/data/Tupfile.lua b/data/Tupfile.lua index 8873a812c..ddc9d1108 100644 --- a/data/Tupfile.lua +++ b/data/Tupfile.lua @@ -890,10 +890,6 @@ for i,v in ipairs(img_files) do str = string.gsub(str, "%%", "%%%%") -- escape % as %% cmd += " && str=" .. str cmd += ' && echo -n $str | dd status=none of=%o bs=1 seek=`expr 274 - length "$str"` conv=notrunc' - str2='$(get-current-cmtid|grep -oE "\\+[0-9]+")' - str2 = string.gsub(str2, "%$", "\\$") -- escape $ as \$ - cmd += " && str2=" .. str2 - cmd += ' && echo -n $str2 | dd status=none of=%o bs=1 seek=216 conv=notrunc' end local_file = VAR_KERNEL .. "/.kernel.mnt" tup.definerule{inputs = {v[2]}, command = cmd, outputs = {local_file}} diff --git a/kernel/trunk/Tupfile.lua b/kernel/trunk/Tupfile.lua index 582a394b3..06a31db49 100644 --- a/kernel/trunk/Tupfile.lua +++ b/kernel/trunk/Tupfile.lua @@ -3,10 +3,25 @@ HELPERDIR = (tup.getconfig("HELPERDIR") == "") and "../../programs" or tup.getco tup.include(HELPERDIR .. "/use_fasm.lua") add_include(tup.getvariantdir()) +-- environment variables +tup.import("KOLIBRIOS_BUILD_OFFSET") -- 1234 +tup.import("KOLIBRIOS_BUILD_CMTID") -- 0xaabbccdd +tup.import("KOLIBRIOS_BUILD_DBGTAG") -- 0x61 for 'a', etc + +str_build = "" +if KOLIBRIOS_BUILD_OFFSET then + str_build += " -dBUILD_OFFSET=" .. KOLIBRIOS_BUILD_OFFSET +end +if KOLIBRIOS_BUILD_CMTID then + str_build += " -dBUILD_CMTID=" .. KOLIBRIOS_BUILD_CMTID +end +if KOLIBRIOS_BUILD_DBGTAG then + str_build += " -dBUILD_DBGTAG=" .. KOLIBRIOS_BUILD_DBGTAG +end + tup.rule("echo lang fix " .. ((tup.getconfig("LANG") == "") and "en_US" or tup.getconfig("LANG")) .. " > %o", {"lang.inc"}) -tup.rule({"kernel.asm", extra_inputs = {"lang.inc"}}, FASM .. " -m 262144 %f %o " .. tup.getconfig("KERPACK_CMD"), "kernel.mnt") ---tup.rule({"kernel.asm", extra_inputs = {"lang.inc"}}, FASM .. " -m 262144 %f %o -s %o.fas" .. tup.getconfig("KERPACK_CMD"), {"kernel.mnt", extra_outputs = {"kernel.mnt.fas"}}) +tup.rule({"kernel.asm", extra_inputs = {"lang.inc"}}, FASM .. " -m 262144 %f %o -s %o.fas" .. str_build .. tup.getconfig("KERPACK_CMD"), {"kernel.mnt", extra_outputs = {"kernel.mnt.fas"}}) --tup.rule({"kernel.mnt.fas", extra_inputs = {"kernel.mnt"}}, "symbols %f %o", "kernel.mnt.sym") --tup.rule({"kernel.mnt.fas", extra_inputs = {"kernel.mnt"}}, "listing %f %o", "kernel.mnt.lst") -tup.rule({"kernel.asm", extra_inputs = {"lang.inc"}}, FASM .. " -m 262144 %f %o -dextended_primary_loader=1" .. tup.getconfig("KERPACK_CMD"), "kernel.mnt.ext_loader") -tup.rule({"kernel.asm", extra_inputs = {"lang.inc"}}, FASM .. " -m 262144 %f %o -dpretest_build=1 -ddebug_com_base=0xe9", "kernel.mnt.pretest") +tup.rule({"kernel.asm", extra_inputs = {"lang.inc"}}, FASM .. " -m 262144 %f %o " .. str_build .. " -dextended_primary_loader=1 " .. tup.getconfig("KERPACK_CMD"), "kernel.mnt.ext_loader") +tup.rule({"kernel.asm", extra_inputs = {"lang.inc"}}, FASM .. " -m 262144 %f %o " .. str_build .. " -dpretest_build=1 -ddebug_com_base=0xe9", "kernel.mnt.pretest") diff --git a/kernel/trunk/boot/bootstr.inc b/kernel/trunk/boot/bootstr.inc index dadd0684d..59637b0a4 100644 --- a/kernel/trunk/boot/bootstr.inc +++ b/kernel/trunk/boot/bootstr.inc @@ -28,36 +28,42 @@ macro line_space { db 186 } d80x25_top: - line_full_top -if __REV__ > 0 + line_full_top +; draw seven digits of the git hash +__x = BUILD_CMTID +if __x > 0 + __x = __x SHR 4 cur_line_pos = 75 - store byte ' ' at d80x25_top+cur_line_pos+1 - rev_var = __REV__ - while rev_var > 0 - store byte rev_var mod 10 + '0' at d80x25_top+cur_line_pos - cur_line_pos = cur_line_pos - 1 - rev_var = rev_var / 10 - end while - store byte ' ' at d80x25_top+cur_line_pos - store dword ' SVN' at d80x25_top+cur_line_pos-4 + store byte ' ' at d80x25_top+cur_line_pos+1 + repeat 7 + digit = __x AND 0xf + if digit > 9 + digit = digit - 10 + 'a' + else + digit = digit + '0' + end if + store byte digit at d80x25_top+cur_line_pos + cur_line_pos = cur_line_pos - 1 + __x = __x SHR 4 + end repeat + store byte ' ' at d80x25_top+cur_line_pos + store dword ' GIT' at d80x25_top+cur_line_pos-4 end if - space_msg: - line_space + line_space verstr: -; line_space ; version string - db 186,32 - repeat 78 - load a byte from kernel_header.signature+%-1 - if a = 13 - break - end if - db a - end repeat - repeat 78 - ($-verstr) - db ' ' - end repeat - db 32,186 - line_half +db 186,32 +repeat 78 + load a byte from kernel_header.signature+%-1 + if a = 13 + break + end if + db a +end repeat +repeat 78 - ($-verstr) + db ' ' +end repeat +db 32,186 + line_half d80x25_top_num = 4 diff --git a/kernel/trunk/bootbios.inc b/kernel/trunk/bootbios.inc index a76695058..92af3500c 100644 --- a/kernel/trunk/bootbios.inc +++ b/kernel/trunk/bootbios.inc @@ -24,9 +24,38 @@ org 0 ; struct kernel_header jmp start_of_code ; jump db 'KolibriOS ' ; signature - db 'v0.7.7.0 ',13,10,13,10,0 ; FIXME: get distribution version from git tag + db 'v0.7.7.0' ; FIXME: get distribution version from git tag? +.offset db ' ',13,10,0 dd B32-KERNEL_BASE ; offset of the kernel's 32-bit entry point +cur_line_pos = 0 +offset_len = 0 +__x = BUILD_OFFSET +if __x > 0 + store byte '+' at .offset+cur_line_pos + if __x < 10 + offset_len = 2 ; '+' and a digit + else if __x < 100 + offset_len = 3 + else if __x < 1000 + offset_len = 4 + else if __x < 10000 + offset_len = 5 + else + offset_len = 6 + end if + cur_line_pos = cur_line_pos + offset_len - 1 + while __x > 0 + store byte __x mod 10 + '0' at .offset+cur_line_pos + cur_line_pos = cur_line_pos - 1 + __x = __x / 10 + end while +end if +if BUILD_DBGTAG > 0 + store byte '-' at .offset+offset_len + store byte BUILD_DBGTAG at .offset+offset_len+1 +end if + include "boot/bootstr.inc" ; language-independent boot messages include "boot/preboot.inc" diff --git a/kernel/trunk/const.inc b/kernel/trunk/const.inc index 397f8338d..07ffa57c3 100644 --- a/kernel/trunk/const.inc +++ b/kernel/trunk/const.inc @@ -227,6 +227,33 @@ struct kernel_header ; KERNEL.MNT file can be booted on BIOS as well as on UEFI. ends +struct kernel_version + ; OS release number, e.g. 0,7,7,0. Distro-specific. + osrel rb 4 + ; A single char like 'a' to append to the version, or 0 to omit it. + ; 0 means 0.7.7.0+1234, 'a' means 0.7.7.0+1234-a, etc. + ; This allows developers to determine the debug build by its log. + ; Unfortunately, users sometimes mess things and test not the build they + ; were asked to test. + dbgtag db ? + ; The kernel itself doesn't have any version other than its ABI version. + ; The minor and major parts were meant to mean significant compatible + ; and incompatible changes correspondingly. It is for a developer to + ; decide on what is a significant change. + abimin db ? + ; The major ABI version must be at least 0x28 for backward compatibility + ; with the old revision number: 0x2800 = 10240 > the last SVN revision. + abimaj dw ? + ; In binary, e.g. a short git hash. A single dword is 8 digits which + ; should be enough for the foreseeable future. We always can get space + ; for four more digits from the two reserved bytes below if needed. + cmtid dd ? + reserved dw ? + ; The number of commits from the last release. + offset dw ? +ends +assert sizeof.kernel_version = 16 + DRIVE_DATA_SIZE = 16 OS_BASE = 0x80000000 diff --git a/kernel/trunk/docs/sysfuncr.txt b/kernel/trunk/docs/sysfuncr.txt index cc875891d..2c4230a5d 100644 --- a/kernel/trunk/docs/sysfuncr.txt +++ b/kernel/trunk/docs/sysfuncr.txt @@ -970,13 +970,21 @@ picture rb Xsize*Ysize*4 ; 32 бита размером 16 байт для будущей совместимости, в будущем могут быть добавлены некоторые поля. Структура буфера: -db a,b,c,d для версии a.b.c.d -db 0: зарезервировано -dd REV - номер svn-ревизии ядра -Для ядра Kolibri 0.7.7.0+: +db a,b,c,d для версии ОС a.b.c.d +db отладочная метка, для релиза всегда 0, иначе любой символ ASCII +db младшая часть ABI ядра +dw старшая часть ABI ядра +dd идентификатор коммита, например краткий git-хэш в бинарном виде +dw зарезервировано +dw количество коммитов с момента последнего релиза +Пример структуры для ядра Kolibri 0.7.7.0+: db 0,7,7,0 db 0 -dd 1675 +db 0 +dw 40 +dd 0xf26d5b28 +dw 0 +dw 1675 ---------------------- Константы для регистров: ---------------------- eax - SF_SYSTEM (18) diff --git a/kernel/trunk/docs/sysfuncs.txt b/kernel/trunk/docs/sysfuncs.txt index f25d9b6e8..504892967 100644 --- a/kernel/trunk/docs/sysfuncs.txt +++ b/kernel/trunk/docs/sysfuncs.txt @@ -962,13 +962,21 @@ Remarks: 16 byte buffer for the future compatibility, in the future some fields can be added. Structure of the buffer: -db a,b,c,d for version a.b.c.d -db 0: reserved -dd REV - kernel SVN revision number -For Kolibri 0.7.7.0+ kernel: +db a,b,c,d for os version a.b.c.d +db debug tag, 0 for release, any ASCII char otherwise +db kernel ABI minor +dw kernel ABI major +dd commit id, e.g. short git hash in binary +dw reserved +dw the number of commits since the latest release +For Kolibri 0.7.7.0+ the structure is like this: db 0,7,7,0 db 0 -dd 1675 +db 0 +dw 40 +dd 0xf26d5b28 +dw 0 +dw 1675 ---------------------- Constants for registers: ---------------------- eax - SF_SYSTEM (18) diff --git a/kernel/trunk/kernel.asm b/kernel/trunk/kernel.asm index 68c8ac4b2..0c5d3c563 100644 --- a/kernel/trunk/kernel.asm +++ b/kernel/trunk/kernel.asm @@ -30,6 +30,8 @@ format binary as "mnt" include 'macros.inc' include 'struct.inc' +ABI_MAJOR = 0x28 +ABI_MINOR = 0 USE_COM_IRQ = 1 ; make irq 3 and irq 4 available for PCI devices VESA_1_2_VIDEO = 0 ; enable vesa 1.2 bank switch functions @@ -711,10 +713,33 @@ end if ;----------------------------------------------------------------------------- -; show SVN version of kernel on the message board +; show OS version, offset, debug tag and commit id on the message board ;----------------------------------------------------------------------------- - mov eax, [version_inf.rev] - DEBUGF 1, "K : kernel SVN r%d\n", eax + mov eax, version_inf.osrel + DEBUGF 1, "K : OS version: %u.%u.%u.%u", [eax+0]:1, [eax+1]:1, \ + [eax+2]:1, [eax+3]:1, ecx + movzx ecx, [version_inf.offset] + jecxz @f + DEBUGF 1, "+%u", ecx +@@: + movzx ecx, [version_inf.dbgtag] + jecxz @f + push ecx + mov ecx, esp + DEBUGF 1, "-%s", ecx + pop ecx +@@: + DEBUGF 1, "\n" + mov ecx, [version_inf.cmtid] + jecxz @f + DEBUGF 1, "K : Commit ID: %x\n", ecx +@@: +;----------------------------------------------------------------------------- +; show kernel ABI +;----------------------------------------------------------------------------- + movzx eax, [version_inf.abimaj] + movzx ecx, [version_inf.abimin] + DEBUGF 1, "K : Kernel ABI: %u.%u\n", eax, ecx ;----------------------------------------------------------------------------- ; show CPU count on the message board ;----------------------------------------------------------------------------- @@ -2102,12 +2127,12 @@ sysfn_getdiskinfo: ; 18.11 = get disk info table ;------------------------------------------------------------------------------ sysfn_getversion: ; 18.13 = get kernel ID and version ; if given memory address belongs to kernel then error - stdcall is_region_userspace, ecx, version_inf.size + stdcall is_region_userspace, ecx, sizeof.kernel_version jnz .addr_error mov edi, ecx mov esi, version_inf - mov ecx, version_inf.size + mov ecx, sizeof.kernel_version rep movsb ret .addr_error: ; if given memory address is illegal @@ -2287,11 +2312,18 @@ sound_flag db 0 endg iglobal -version_inf: - db 0,7,7,0 ; FIXME: Get distribution version from git tag - db 0 -.rev dd __REV__ -.size = $ - version_inf +if ~ definite BUILD_DBGTAG + BUILD_DBGTAG = 0 +end if +if ~ definite BUILD_CMTID + BUILD_CMTID = 0 +end if +if ~ definite BUILD_OFFSET + BUILD_OFFSET = 0 +end if +align 4 +version_inf kernel_version <0,7,7,0>, BUILD_DBGTAG, ABI_MINOR, ABI_MAJOR, \ + BUILD_CMTID, 0, BUILD_OFFSET endg ;------------------------------------------------------------------------------ align 4 @@ -4457,8 +4489,6 @@ end if include "data32.inc" -__REV__ = __REV - if ~ lang eq es_ES diff16 "end of kernel code",0,$ end if diff --git a/kernel/trunk/macros.inc b/kernel/trunk/macros.inc index 54be12a0a..3e1e1e408 100644 --- a/kernel/trunk/macros.inc +++ b/kernel/trunk/macros.inc @@ -5,16 +5,6 @@ ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -__REV = 0 - -macro $Revision a { - match =: Num =$,a \{ - if __REV < Num - __REV = Num - end if - \} -} - ;// mike.dld, 2006-29-01 [ ; macros definition