Skip to content

t480s port #1966

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 7 commits into
base: master
Choose a base branch
from
Draft

t480s port #1966

wants to merge 7 commits into from

Conversation

thickfont
Copy link

@thickfont thickfont commented Apr 30, 2025

Testing Checklist:

  • Successful external flash using external programmer model RPi Pico
  • Boots successfully after the flashing
  • Setting clock prompt on first reboot: ok
  • Clean boot detected (no keyring, nothing installed on disk): usb boot proposed and followed
  • Boots on usb
  • OS QubesOS 4.2 install and reboot
  • Heads functionality- no pubkey detected, but OS detected -> OEM-Factory-reset proposed. Done with Nitrokey 3a hardwarekey
  • On reboot after re-ownership: generate new HOTP/TOTP
  • wifi works based on OS QubesOS 4.2
  • PR0
    • flashprog -p internal (not locked)
    • lock_chip (locks the platform with PR0)
    • flashprog -p internal (reports locked)
  • flash t480s_tb.bin firmware externally and confirm it works (fast changing supposed to work as per libreboot docs https://libreboot.org/docs/install/t480.html#thunderbolt-issue-read-this-before-flashing
  • clone t480 docs to t480s docs, add pictures and different SPI chips locations/anything being different of t480 from https://osresearch.net/T480-maximized-flashing/#lenovo-t480-maximized
  • update BOARD_TESTERS.md with confirmed end users having external programmers, technical enough to backup/revert in a responsive manner for this PR and other PRs; minimally the ones being coreboot version bumps and kernel version bumps, or other PR known to possibly affect this board for one reason or the other.

Happy to provide screenshots/proof at a later date.

Thanks to @tlaurion @notgivenby for their help in Matrix chat. I barely did anything for this port, the pieces were simply waiting to be put together thanks to the major efforts by the parties responsible for the T480 port.

@thickfont
Copy link
Author

thickfont commented Apr 30, 2025

Ah, just realized I'll have to also update the tb.bin too. I manually created this from lenovo's binaries and they had a different resource/URL for the T480s thunderbold firmware, so best not to risk someone bricking their board with the T480 version.

Edit: I just realized my commits got unsigned when I retroactively signoff'ed the commits. I will fix later.

@tlaurion
Copy link
Collaborator

@thickfont

Ah, just realized I'll have to also update the tb.bin too

Confused about this. I thought the TB was common between the two boards. As part of testing, you must test tb flasshing. Flashing the t480 tb to observe if only slow charging (bad for t480s) or if fast charging works (good also for t480s), otherwise reverting to stock tb from a backup you took prior of flashing t480 and investing time to bring a distinct t480s tb.bin under xx80 blobs dir. Comparing the t480s/t480 tb.bin from libreboot and exposing results would also help.

commits got unsigned when I retroactively signoff'ed the commits. I will fix later.

Commits are "signed-off" by GitHub not from command line git. Can you sign those (git rebase --signoff b19af32fd3d4ee850108a2d9479a38d254015138^ with git knowing your key identity and actually signinf the commits.)

Also if you could squash the last two commits together so that there is no "CircleCI fix" commit, that would be awesome.
If you could rename the previous t480 ifd and gbe to follow the same naming scheme you added for t480s would be great too, otherwise someone will need to do this later (and this is needed since t480 is not alone using xx80 dir blobs anymore).

You can also search t480 issues/pr and tag t480s users that were interested into the t480s. Once tagged and those users accept to be added into https://github.com/linuxboot/heads/blob/master/BOARD_TESTERS.md, you must also add yoruself there along other responders.

Once all that is done, this PR will be mergeable and board testers (including yourself) accountable for testing promptly when there is coreboot/linux/platform specific changes needing to be tested in distinct PRs.

Thanks for your contribution @thickfont ! Really much appreciated!

@thickfont
Copy link
Author

thickfont commented Apr 30, 2025

@thickfont

Ah, just realized I'll have to also update the tb.bin too

Confused about this. I thought the TB was common between the two boards. As part of testing, you must test tb flasshing. Flashing the t480 tb to observe if only slow charging (bad for t480s) or if fast charging works (good also for t480s), otherwise reverting to stock tb from a backup you took prior of flashing t480 and investing time to bring a distinct t480s tb.bin under xx80 blobs dir. Comparing the t480s/t480 tb.bin from libreboot and exposing results would also help.

Apologies, I wasn't clear with my tb.bin comment.

I did flash my T480s board with updated thunderbolt firmware directly from lenovo's website using Libreboot's method as documented here: https://libreboot.org/docs/install/t480.html#manual-tbt.bin-extraction-optional

I have not flashed the T480 thunderbolt firmware and see no reason to risk doing so if lenovo offers an updated T480s version anyway that we can use.

However, I forgot to include my blob in my commit (or the steps to reproduce it similarly to how the T480 one is currently produced). I will have to fix this.

I didn't actually test the slow/fast charging after updating it. I'm not sure how to test that beyond manually monitoring the charging speeds, but I'll look into it to see if the updated firmware actually does work.

commits got unsigned when I retroactively signoff'ed the commits. I will fix later.

Commits are "signed-off" by GitHub not from command line git. Can you sign those (git rebase --signoff b19af32fd3d4ee850108a2d9479a38d254015138^ with git knowing your key identity and actually signinf the commits.)

Also if you could squash the last two commits together so that there is no "CircleCI fix" commit, that would be awesome. If you could rename the previous t480 ifd and gbe to follow the same naming scheme you added for t480s would be great too, otherwise someone will need to do this later (and this is needed since t480 is not alone using xx80 dir blobs anymore).

You can also search t480 issues/pr and tag t480s users that were interested into the t480s. Once tagged and those users accept to be added into https://github.com/linuxboot/heads/blob/master/BOARD_TESTERS.md, you must also add yoruself there along other responders.

Once all that is done, this PR will be mergeable and board testers (including yourself) accountable for testing promptly when there is coreboot/linux/platform specific changes needing to be tested in distinct PRs.

Thanks for your contribution @thickfont ! Really much appreciated!

Appreciate the feedback. Will get to fixing all of the above. (I'm a git newbie :) )

@tlaurion
Copy link
Collaborator

My point is still valid here: if you are to provide a tb.bin, you will have to test it :)
So previous comment still stands for this PR to be merged (and used by others as a repro of you work and tests here) for that board to be added and supported, as any other in tree.

@notgivenby
Copy link
Contributor

@thickfont great to see it worked!

@notgivenby
Copy link
Contributor

@thickfont in case you did not do it yet, it would be really helpful for other less experienced user to have at least one picture of disassembled t480s board on the heads-wiki flashing guide. In my view, it can really reduce the stress level if the location of the SPI chips is different.

@notgivenby
Copy link
Contributor

@thickfont it looks like the build failed…

@tlaurion
Copy link
Collaborator

tlaurion commented May 2, 2025

@thickfont it looks like the build failed…

No its #1965
: meanwhile, replaced CACHE_VERSION variable of CircleCI so that build doesn't reuse cache (builds clean).

@thickfont
Copy link
Author

thickfont commented May 4, 2025

I added the t480s tb.bin to the blob download script.

Both t480 and t480s currently share the tb.bin file name in the blobs/xx80 directory. So if you build t480 board, the tb.bin file will be for t480. Whereas if you build t480s board, the tb.bin file will be for the t480s. In other words both tb.bin files currently can't co-exist in the directory if someone built both boards. Both file hashes co-exist in hashes.txt too (not ideal, but it works if you know to expect an error if you manually run "sha256sum -c hashes.txt").

I would have named the tb.bin files "t480_tb.bin" and "t480s_tb.bin", but that would require modifications to the targets/xx80_me_blobs.mk file (as it references the blobs/xx80/tb.bin file directly). I don't understand the formatting of this file to confidently modify it for both possible tb.bin file names.

EDIT:
I tested this locally first and it worked, so I'm not 100% sure why circleci is failing.
However from the logs:

/root/heads/blobs/xx80/tb.bin /root/heads
sha256sum: /root/heads/blobs/xx80/tb.bin: No such file or directory
sha256sum: 'standard input': no properly formatted checksum lines found
ERROR: SHA256 checksum for /root/heads/blobs/xx80/tb.bin doesn't match.

You can see the first line is the output from this line in the script:
$ echo "$sha256_hash" "$filename" "$(pwd)"

Therefore, $sha256_hash is null which is actually $TB_BIN_HASH which is set in my new if/else statement which assumes the local BOARD environment variable is set. $TB_BIN_HASH will only be null if the BOARD environment variable is not set. Is this variable not set in the context of CircleCI's execution of this script? If so, how else can can I determine which board is being built within this script? Is there better logic for this?

The second line of the above logs (missing tb.bin) is also explained by the same missing BOARD environment variable.

@thickfont
Copy link
Author

thickfont commented May 4, 2025

@akunterkontrolle @mblanqui @kjkent

Are any of you guys interested in being official board testers for the T480s? I found you guys displaying varying levels of interest in a t480s port in other threads. Cheers!

Ref: https://github.com/linuxboot/heads/blob/master/BOARD_TESTERS.md

EDIT: Don't flash anything yet though! I haven't flashed roms from circleci's yet, so I can't guarantee they work even though they should (hashes are different from my locally built and tested roms which I think is normal until the PR is merged?).

@kjkent
Copy link

kjkent commented May 4, 2025

@thickfont sure am! Happy to contribute.

@tlaurion
Copy link
Collaborator

tlaurion commented May 5, 2025

EDIT: Don't flash anything yet though! I haven't flashed roms from circleci's yet, so I can't guarantee they work even though they should (hashes are different from my locally built and tested roms which I think is normal until the PR is merged?).

@thickfont the roms should match, where local build artifats differences for same commit are typically linked to non-clean cpio that are not rebuilt. You should arrive to the same CircleCI built artifacts if local is clean, by doing the following if final rom hashes are different
- ./docker_repro.sh make BOARD=t480s-hotp-maximized real.remove_canary_files-extract_patch_rebuild_what_changed

This should be fixed with #1961 that should be merged today (which seems to have fixed initrd.cpio-xz rebuild, but if not, another issue should be opened)

Also note that CircleCI failing to build has been merged in master just now under #1967.

You should be able to merge master into this PR by doing

  • git fetch origin/master
  • git merge origin/master

@tlaurion tlaurion marked this pull request as draft May 5, 2025 15:38
@tlaurion
Copy link
Collaborator

tlaurion commented May 5, 2025

I added the t480s tb.bin to the blob download script.

Both t480 and t480s currently share the tb.bin file name in the blobs/xx80 directory. So if you build t480 board, the tb.bin file will be for t480. Whereas if you build t480s board, the tb.bin file will be for the t480s. In other words both tb.bin files currently can't co-exist in the directory if someone built both boards. Both file hashes co-exist in hashes.txt too (not ideal, but it works if you know to expect an error if you manually run "sha256sum -c hashes.txt").

I would have named the tb.bin files "t480_tb.bin" and "t480s_tb.bin", but that would require modifications to the targets/xx80_me_blobs.mk file (as it references the blobs/xx80/tb.bin file directly). I don't understand the formatting of this file to confidently modify it for both possible tb.bin file names.

EDIT: I tested this locally first and it worked, so I'm not 100% sure why circleci is failing. However from the logs:

/root/heads/blobs/xx80/tb.bin /root/heads
sha256sum: /root/heads/blobs/xx80/tb.bin: No such file or directory
sha256sum: 'standard input': no properly formatted checksum lines found
ERROR: SHA256 checksum for /root/heads/blobs/xx80/tb.bin doesn't match.

You can see the first line is the output from this line in the script: $ echo "$sha256_hash" "$filename" "$(pwd)"

Therefore, $sha256_hash is null which is actually $TB_BIN_HASH which is set in my new if/else statement which assumes the local BOARD environment variable is set. $TB_BIN_HASH will only be null if the BOARD environment variable is not set. Is this variable not set in the context of CircleCI's execution of this script? If so, how else can can I determine which board is being built within this script? Is there better logic for this?

The second line of the above logs (missing tb.bin) is also explained by the same missing BOARD environment variable.

@thickfont as said in previous comment, tb rom differences, and if such difference needed, should be validated and tested prior of me investing time helping for the port here with commits.

As previously asked: have you figured out under libreboot why those tb.bin are the different and if needed as requested? if the t480 tb file can be used on t480s then no need for the following. But if needed, here is what is needed:


Also, I saw you partially added differential tb bins but reuse same tb.bin instead of duplicated in blob script.
If you choose to add t480s tb into the shared xx80 blob script instead of duplicating it/renaming it, you should also duplicate the logic everywhere, not share a final tb.bin. There should be a t480_tb.bin and a t480s_tb.bin if this is confirmed needed.

The checksum should be unique for each file; no tb.bin should be shared if required to be different, this can lead to bricks and CI as confirmed by CI, logic is wrong: the blob script should should download and reconstruct both on a CircleCI prep_step; therefore i'm not sure your conditional BOARD logic is the right thing to do under a shared shared blob script; either you duplicate the blob script into two t480/t480s, split the scripts into shared degard+me/ separate tb480 + separate tb480s or have a single script that doenloads and reconstructs blobs needed for both t480s and t480. You should figure out which option is better for you and others to understand and maintain (I think splitting blobs download script into t480/t480s and same for target should make things clearer to yyou and easier to reuse existing code)so that they require and point to individual tb files, and for those to be created, depend on individual blob script (that seems to be where you got confused with @gaspar-ilom code which uses variables to point ot checksum and files you didn't completely duplicate in your previous attempt).


Current issue with blob script issue and non-duplicated target/xx80:
The problem I see with your duplication of xx80 blob script is that the script doesn't duplicate tb_flashable, so it fails when chk_sha256sum function is called to verify hash against it. I would recommend just duplicating logic so that two different codepath is used to download, extract and verify hash for tb. Same for hashes: the files for hash comparison cannot be the same file.

for Makefile logic under target/xx80, same thing: duplicate into t480 and t480s and rename to t480s_tb.bin and t480_tb.bin as your duplicated in xx80/blob download +pad + mv into xx80 blob dir and you should be able to resolve circeci


no need to duplicate config/linux-t480s.config here: they do not have a single difference. Just have the board config for t480s point to t480 linux config


Time spent currently on t480s review: 2h total. Trying to mentor and code review instead of doing the changes this time. Might take longer but more chances of others to do ports and succeed. We can see #1658 having been dropped as an effort after a lot of work. Sorry to not invest more time for other people's desired board without doing paid consultation services anymore; revising approach, let me know what I can do better for others to be able to port things better and help co-maintain Heads on free tier.

@thickfont
Copy link
Author

Thanks for the review @tlaurion, exactly the kind of feedback I was hoping for. Much appreciated.

Will try to fix most if not all of this today.

I reviewed the libreboot docs and their tb.bin implementation. They are using different tb.bins for each board, and they also say "Please make sure to flash the correct one for your board". Goes without saying that The tb.bins have different hashes too. I see no reason to test the t480 tb.bin on my only remaining t480s board unless you can guarantee it won't brick the board...

@thickfont thickfont force-pushed the poc_t480s branch 3 times, most recently from 964a936 to 3e8a180 Compare May 6, 2025 23:59
@thickfont thickfont force-pushed the poc_t480s branch 2 times, most recently from 0e7546e to afeb6ea Compare May 7, 2025 01:36
@tlaurion
Copy link
Collaborator

tlaurion commented May 7, 2025

I see no reason to test the t480 tb.bin on my only remaining t480s board unless you can guarantee it won't brick the board...

This is really problematic.

Before merging this PR, at least one of the BOARD_TESTERS.md updated file for t480s needs to flash that t480s_tb.bin, ideally the one porting the t480s. No, I cannot guarantee that it won't brick your USB port's fast charging capabilities, as libreboot produced documentation nad guide to reproduce those blobs, and t480 board challenged that documentation prior of creating a flashing page with the facts. I'm sorry @thickfont but if you are weary on flashing that blob, but that untested blob comes on your PR, which PR content is supposed to be tested working at the best of your knowledge and to the best of my review: we have a problem, since you basically say here that you are not willing to test/report/collaborate with libreboot on things not fcuntional, and as I stated numerous times before, after having spent more than 30h on the t480 and challenging Leah (with all the drama that came with it) and with the t480/t480s still not merged under coreboot, the current PR will not be merged.

We are mixing things here. I am willing to give advice/mentoring/share knowledge to those who want to have Heads on the platforms they port to Heads. I am not willing dealing with support requests technical board owners are not willing to test nor fix themselves nor challenge upstream (here libreboot until coreboot) since I am not paid for this work either.

TLDR: if you are not willing to test libreboot instructions yourself for the t480s tb bins CircleCI produced, nor any other technical enough board owners (candidated @akunterkontrolle @mblanqui @kjkent) stand up to the task of being able to maintain/test this board/participate upstream under libreboot/coreboot here, you are basically expecting me to deal with consequences of other people flashing things that should be tested but weren't and might brick their boards. It would not be ethical to merge this.

If this is what you are aiming to do, I would gladly ask you to do another commit which will rename the t480s as UNTESTED (there are helpers under global Makefile to facilitate this), as until one more technical board owner stands up as being the one that will maintain this board. My job as a maintainer of Heads is to make sure that changes needed across all supported boards are tested per their board testers in time for possible linked regression for future PR.

I'm sorry if there was still a misunderstanding, but the goal of the Heads project is to have supported boards and a community to help each other support those board. Here, libreboot is upstream until merged under coreboot at https://review.coreboot.org/c/coreboot/+/83274, so under libreboot community channels. There is no way anything merged under Heads becomes Heads responsibility because other people in the accountability chain fails their responsibilities. Yours here is to flash all build artifacts and confirm no other regressions happen in terms of coreboot+libreboot so that people that would arrive to me would be only for things Head srelated. There is no way I extend my role outside of that. I have no time for that, nor own a t480s. I hope we are clear and there is nothing personal here. I understand you are excited by the t480s being WiP under coreboot at https://review.coreboot.org/c/coreboot/+/83274 and supported by libreboot. But reality here is that it is not supported by coreboot today. So no. I cannot guarantee you that flashing that tb.bin will not make that controller not work again. But if we stay logical, and you get a backup before flashing, you should not be scared of flashing nor reverting things, otherwise there is no technical enough board owners behind this port for the t480s. Again, nothing personal here. But if its the case, we need someone else to stand up that woun't be scared of flashing, causing bricks, and reverting to backups. Otherwise this PR won't get merged.

@tlaurion
Copy link
Collaborator

tlaurion commented May 7, 2025

Thanks for the review @tlaurion, exactly the kind of feedback I was hoping for. Much appreciated.

Will try to fix most if not all of this today.

I reviewed the libreboot docs and their tb.bin implementation. They are using different tb.bins for each board, and they also say "Please make sure to flash the correct one for your board". Goes without saying that The tb.bins have different hashes too. I see no reason to test the t480 tb.bin on my only remaining t480s board unless you can guarantee it won't brick the board...

Awesome progress with the other commits. Hope my previous comment facts reached you and what needs to be done prior of merging this pr which now builds from CircleCI and should produce same roms loally and from CircleCI. Please confirm and let me know if you can be that responsive technical board owher willing to risk a brick and unbrick/be on the libreboot channel until https://review.coreboot.org/c/coreboot/+/83274 gets merged, otherwise this PR will bitrot until someone else show up and is willing to create SPI content backups/flash/revert to backup any future PR related to the t480s, as for any supported boards under Heads.

@tlaurion
Copy link
Collaborator

tlaurion commented May 7, 2025

Updated OP TODOs

@kjkent
Copy link

kjkent commented May 7, 2025

I'm not overly concerned about bricking my t480s or its thunderbolt SPI and can flash and report back once it's decided what's happening with this PR. I have no thunderbolt devices, but can at least report on the port's USB-C and charging functionality.

I can confirm that the tb.bin produced by LBMK for the t480s works in relation to the above, offering a second easy source for a clean rom (the first being a self-made backup) to revert to in case of issues.

@thickfont @tlaurion thanks for all the work you're both doing on this! I hope the PR can be merged, as it would bring these modern and capable ThinkPads to more people looking for a secure boot chain. I'm not yet sufficiently familiar enough with the project, but that will change and I am interested in contributing when able.

@tlaurion
Copy link
Collaborator

tlaurion commented May 7, 2025

I'm not overly concerned about bricking my t480s or its thunderbolt SPI and can flash and report back once it's decided what's happening with this PR. I have no thunderbolt devices, but can at least report on the port's USB-C and charging functionality.

@kjkent : I'm just saying again that coreboot side is Work In Progress (WiP), unmerged work coreboot upstream, with known issues that have nothing to do with Heads, and are related to coreboot fork, so people here and from t480 need to be confortable with those and help upstream move forward, support the coreboot developers. Heads is just using the coreboot base and adding Heads related features.

See https://review.coreboot.org/c/coreboot/+/83274


mb/lenovo: Add ThinkPad T480 and ThinkPad T480s

Known issues:
- Alpine Ridge Thunderbolt 3 controller does not work
- Some Fn+F{1-12} keys aren't handled correctly
- Nvidia dGPU is finicky
  - Needs option ROM
  - Power enable code is buggy
  - Nouveau only works on linux 6.8-6.9
- Headphone jack isn't detected as plugged in despite correct verbs
 

It will be merged if reported as working as expected, properly documented and with people ready to test when needed, as for any other boards supported under Heads, with the t480/t480s being the current exception to the rule of being supported properly either in a fork or coreboot upstream. Libreboot actually uses the patch that was developed by @gaspar-ilom on top of coreboot WiP; nothing was fixed further for now.

Let's hope t480/t480s get merged upstream coreboot soon, otherwise I will not take those things farther since I have no personal interests neither in t480 nor t480s and I have already contributed with my time and energy enough for the t480, time for someone else to care for things further with libreboot/coreboot.

Having support under Heads as of today is not sustainable and won't last:

  • reusing patchset on top of coreboot 24.12 (december 2024 release) was what I could do to help
  • commenting under https://review.coreboot.org/c/coreboot/+/83274
  • challenged Leah on her mastodon for libreboot to reuse the same branch, and pointing to @gaspar-ilom additional patch 3466272
    • Leah decided to use that patch under libreboot instead of pushing for the coreboot patchset to be fixed
    • We are there.
      • Therefore i'm not sure my 30h spent on having the t480 was really helpful for the ecosystem, since we are now in May, coreboot was bumped to another release and upstream patchset is now bitrotting.... At some point Heads will need to coreboot version bump, and I will not redo this work :(
        • Message home: the t480/t480s still need love upstream, by coreboot developers and people loving this platform enough to contribute: upstream, not here. Normally, Heads port happens after a platfrom is properly supported in a coreboot for or upstream; this is still not the case for the t480/t480s.

I can confirm that the tb.bin produced by LBMK for the t480s works in relation to the above, offering a second easy source for a clean rom (the first being a self-made backup) to revert to in case of issues.

Do libreboot tb and heads produced tb for t480s have the same hash? If so you confirm here that you flashed that rom, @kjkent and would be willing to use a cell phone that fast charges and reports fast charging to report on that t480s_tb.bin being flashed on your t480s externally.

@thickfont @tlaurion thanks for all the work you're both doing on this! I hope the PR can be merged, as it would bring these modern and capable ThinkPads to more people looking for a secure boot chain. I'm not yet sufficiently familiar enough with the project, but that will change and I am interested in contributing when able.

Excellent!

@thickfont
Copy link
Author

From my previous posts:

I did flash my T480s board with updated thunderbolt firmware

I have not flashed the T480 thunderbolt firmware

I didn't actually test the slow/fast charging after updating it. I'm not sure how to test that

So, just to recap. I have flashed my T480s with new updated thunderbolt firmware. I had just forgot to include it in my initial PR (since I manually built the tb.bin not using any scripts at the time). I have since included this t480s tb.bin in the PR using the blob scripts.

NOTE: The t480s tb.bin that I flashed and now included in this PR, is the same tb.bin that libreboot builds. It has the same hash.

I did say I haven't tested it yet because I didn't know how... But now you suggest using a phone, so I will and confirm.

When I said:

I see no reason to test the t480 tb.bin

I am literally talking about flashing the t480 tb.bin on a t480s. I have not done this for reasons previously outlined.

Does this clarify your confusion? @tlaurion

@tlaurion
Copy link
Collaborator

tlaurion commented May 8, 2025

From my previous posts:

I did flash my T480s board with updated thunderbolt firmware

I have not flashed the T480 thunderbolt firmware

I didn't actually test the slow/fast charging after updating it. I'm not sure how to test that

So, just to recap. I have flashed my T480s with new updated thunderbolt firmware. I had just forgot to include it in my initial PR (since I manually built the tb.bin not using any scripts at the time). I have since included this t480s tb.bin in the PR using the blob scripts.

NOTE: The t480s tb.bin that I flashed and now included in this PR, is the same tb.bin that libreboot builds. It has the same hash.

I did say I haven't tested it yet because I didn't know how... But now you suggest using a phone, so I will and confirm.

When I said:

I see no reason to test the t480 tb.bin

I am literally talking about flashing the t480 tb.bin on a t480s. I have not done this for reasons previously outlined.

Does this clarify your confusion? @tlaurion

Yes, and thanks for clarifying. From my previous reading, I understood you upgraded tb firmware from other means and weren't willing to flash externally the t480s tb firmware built here, having same hash of libreboot's.

So I guess the only thing missing, to be ticked in OP as well, is a clone of the T480 page for t480s with disassembly picture. As you see fit, either referring to t480 page for everything else then the disassembly and different placement of tb chip, or a clone of it and board tester file being modified per this PR as well.

I would then need a second, referred board tester to confirm flashing roms from this PR working for him too and then can merge both this PR and the heads-wiki one at the same time.

Sorry if I misread @thickfont, and thanks for this contribution for all that will benefit from it. I'd you have any comments or edits to do on the porting guide, that would also be welcome.

@thickfont
Copy link
Author

thickfont commented May 8, 2025

No worries on the misunderstanding, totally understandable with the t480/t480s naming similarities.

I have some comments for the porting guide I will share later after I collect my thoughts.

I will happily contribute to the wiki too, will just need some more time.


Changing topics back to this:

@thickfont the roms should match, where local build artifats differences for same commit are typically linked to non-clean cpio that are not rebuilt.

Something odd is happening when I build locally in my repo locally using:
./docker_repro.sh make BOARD=t480s-hotp-maximized real.remove_canary_files-extract_patch_rebuild_what_changed
Then,
./docker_repro.sh make BOARD=t480s-hotp-maximized

The resulting .rom is named:
heads/build/x86/t480s-hotp-maximized/heads-t480s-hotp-maximized-.rom

Which is missing the commit hash info usually appended to the end of the file name. I suspect this is why my hashes are different than what is being built in circleci? Since the roms embed the commit hash data and my locally build roms are missing them, this should explain the differing resultant rom files and hashes, right?

Any ideas why mine are missing the commit data? Have you seen this behavior before?

EDIT: For additional context, when I initially made my edits directly in my local clone of the linuxboot/heads repo, the roms built there did correctly have commit data appended to the file names. It is only since I transitioned to my own repo (e.g. thickfont/heads) for the PR that the roms file names have been missing the data.

@kjkent
Copy link

kjkent commented May 8, 2025

@tlaurion: Do libreboot tb and heads produced tb for t480s have the same hash? If so you confirm here that you flashed that rom, @kjkent and would be willing to use a cell phone that fast charges and reports fast charging to report on that t480s_tb.bin being flashed on your t480s externally.

I'll build & diff them later today, and can test flash the heads binary too if I get chance this evening. Will report back.

Edit: I just read up and saw that @thickfont has already flashed and confirmed the tb binary is identical to that of LBMK -- my apologies!

@tlaurion
Copy link
Collaborator

tlaurion commented May 8, 2025

The resulting .rom is named:
heads/build/x86/t480s-hotp-maximized/heads-t480s-hotp-maximized-.rom

@thickfont Someone had that issue before, but cannot find the solution easily since it was not filed in an issue.
Related to local git setup, but my memory is failing here remembering.

Global Makefile extracts pieces used for filename really early at:

heads/Makefile

Lines 1 to 13 in 13f55f4

# Need to set CB_OUTPUT_FILE before board .config included so
# that target overrides in x230/x430-flash (eg) are properly handled
GIT_HASH := $(shell git rev-parse HEAD)
GIT_STATUS := $(shell \
if git diff --exit-code >/dev/null ; then \
echo clean ; \
else \
echo dirty ; \
fi)
HEADS_GIT_VERSION := $(shell git describe --abbrev=7 --tags --dirty)
# Override BRAND_NAME to set the name displayed in the UI, filenames, versions, etc.
BRAND_NAME ?= Heads

And are then reused later on to construct filename:

heads/Makefile

Lines 99 to 104 in 13f55f4

CB_OUTPUT_BASENAME := $(shell echo $(BRAND_NAME) | tr A-Z a-z)-$(BOARD)-$(HEADS_GIT_VERSION)
CB_OUTPUT_FILE := $(CB_OUTPUT_BASENAME).rom
CB_OUTPUT_FILE_GPG_INJ := $(CB_OUTPUT_BASENAME)-gpg-injected.rom
CB_BOOTBLOCK_FILE := $(CB_OUTPUT_BASENAME).bootblock
CB_UPDATE_PKG_FILE := $(CB_OUTPUT_BASENAME).zip
LB_OUTPUT_FILE := linuxboot-$(BOARD)-$(HEADS_GIT_VERSION).rom

So in your case, CB_OUTPUT_FILE (used as rom base filename) is wrong.
Constucted by CB_OUTPUT_BASENAME := $(shell echo $(BRAND_NAME) | tr A-Z a-z)-$(BOARD)-$(HEADS_GIT_VERSION) which shows HEADS_GIT_VERSION is wrong.

Can you do from local build env what is done to construct HEADS_GIT_VERSION:
git describe --abbrev=7 --tags --dirty and share output? (this is the part of the filename you are missing).


EDIT

EDIT: For additional context, when I initially made my edits directly in my local clone of the linuxboot/heads repo, the roms built there did correctly have commit data appended to the file names. It is only since I transitioned to my own repo (e.g. thickfont/heads) for the PR that the roms file names have been missing the data.

Not sure how you did this.
Typically (@notgivenby or others, confirm), I recommend:
creating fork over github (little icon on linuxboot/heads)

  1. cloning main repo
    git clone https://github.com/linuxboot/heads
  2. adding your fork (my-fork being username example used)
    git remote add my-fork https://github.com/my-fork/heads
  3. fetching branches on your fork
    git fetch my-fork
  4. checking out your current branch
    git checkout my-fork/poc_t480s
  5. resetting to that branch and redoing above in case of errors
    git reset --hard
  6. creating new local branch with the changes
    git checkout -b poc_t480s
  7. doing your changes, adding them being signed-ff and signed with a private key which public key is registered in your github profile
    git add xyz zyx yxz
    git commit --signoff -m 'filename_changed or bugfix or global improvement across many files : short description of that smallest change possible to be in a commit'
  8. iterate with changes and commits until satisfied
  9. either delete local branch poc_t480s with git branch -D and then git checkout -b again and git push --force my-fork, or do a git push forcing origin to be my-fork

Can you detail your process differences maybe?
EDIT2: That would help push linuxboot/heads-wiki#119

@thickfont
Copy link
Author

I just built locally using your steps and it did fix my issue of missing the commit data at the end of the filename. But I'm still getting a different hash. Here were my exact steps:

git clone https://github.com/linuxboot/heads
cd heads
git remote add thickfont https://github.com/thickfont/heads
git fetch thickfont
git checkout thickfont/poc_t480s
./docker_repro.sh make BOARD=t480s-maximized

I decided to compare the hashes.txt file between circleci and local.

After sorting both hashes.txt with (they were both in different filename orders):
sort --key 2 hashes.txt > sorted_hashes.txt

I diff'ed the resulting sorted files and got this result:

CIRCLECI hashes.txt:
< 911ff63584bd4f3115efe4fe44aacec29dca47bc0e32f1d7d546ddacf266eb02  /root/heads/build/x86/t480s-maximized/data.cpio
< 7bbee7d5fe4ba34a0b75fe1a65f30499d52989c4a2f1f39f7cf999fcdcb76920  /root/heads/build/x86/t480s-maximized/heads-t480s-maximized-v0.2.0-2771-gc689e33.rom
< dca0c5f440fc92ee15786b93549e50371600cdce0c260ce69675763b9effef02  build/x86/t480s-maximized/initrd.cpio.xz
< 2025-05-07 06:14:33+00:00 c689e33c0ffb82472d28b61728ad3290f7d4c229 clean
---
LOCAL hashes.txt:
> 7020c60eb0184cb0cf8392a5a510233a1a1eb95662d1d1860054eecedd609181  /root/heads/build/x86/t480s-maximized/data.cpio
> 8e638198f34b1695bb23c01d944e96583dbde02889e49cf34e37e7a1adaf2471  /root/heads/build/x86/t480s-maximized/heads-t480s-maximized-v0.2.0-2771-gc689e33.rom
> 9fd048b4609b4ac9c8fdbc614a476f2c6ccc016e970f8635cecef26a28731670  build/x86/t480s-maximized/initrd.cpio.xz
> 2025-05-09 03:35:26+00:00 c689e33c0ffb82472d28b61728ad3290f7d4c229 clean

So what gives? Is CircleCi not cleaning its cpio? Given that I built locally in a fresh git clone'ed repo from scratch, surely a clean rom was built?

@tlaurion
Copy link
Collaborator

tlaurion commented May 9, 2025

@thickfont I also get 911ff63584bd4f3115efe4fe44aacec29dca47bc0e32f1d7d546ddacf266eb02 for data.cpio (and therefore same initrd.cpio.xz and final rom hashes), for all boards not excluding kbd and keyboard layout keymaps introduced in #1961.

data.cpio being into initrd.cpio.xz being into final rom: this explains why the 3 files differ for you since data.cpio is different.
The question is why data.cpio is different for your local build, since data.cpio content is reported to be the same (no diff) for all the keymap dir and files included into it.

hashes.txt reports: cpio, then content. Which files are not in the same order?

What I use for reproducibility check, downloading hashes.txt from t480s-maximized board's CircleCI artifacts tab:

user@heads-master:~/heads$ wget -qhttps://output.circle-artifacts.com/output/job/c1797a7f-ba66-457f-ae69-9a8a709de489/artifacts/0/build/x86/t480s-maximized/hashes.txt -O /tmp/hashes.txt
user@heads-master:~/heads$ HASHES1=/tmp/hashes.txt
user@heads-master:~/heads$ HASHES2=/home/user/heads/build/x86/t480s-maximized/hashes.txt
user@heads-master:~/heads$ egrep '^[0-9a-f]{64}' $HASHES1 | while read line; do HASH_REF=$(echo $line|awk -F " " {'print $1'}); FILE_REF=$(echo $line|awk -F "/" {'print $NF'}); if ! grep -q "$HASH_REF" $HASHES2; then echo "$FILE_REF doesn't match";fi; done
user@heads-master:~/heads$

Which confirms that hashes.txt data.cpio content is all equal on my local build, and circleci:

911ff63584bd4f3115efe4fe44aacec29dca47bc0e32f1d7d546ddacf266eb02  /root/heads/build/x86/t480s-maximized/data.cpio
-----
ee8a699a37a1d6a4ad58faae8833d5d2b4e4ce397d535eef3f5071f4c7cdf00f  ./usr/lib/kbd/keymaps/README
1711418056be0d131329e1a8f496c79a3c18b97d834231dff979b1d6de673632  ./usr/lib/kbd/keymaps/i386/dvorak/dvorak-no.map
b1bfd43ab21ba55ea1ebcf945b91ab1c27d6507c4378f86e5ead2feec8e5af53  ./usr/lib/kbd/keymaps/i386/dvorak/dvorak.map
65a834c28e1fe24969ef3db3eaebf1de262d9e679383a73de8b92c944428128a  ./usr/lib/kbd/keymaps/i386/dvorak/dvorak-es.map
850c23ff2f00f83fa0a5f5b1ee4b226fa059876dbb2221bbcfbb06ceb8f4e98a  ./usr/lib/kbd/keymaps/i386/dvorak/dvorak-ukp.map
cdcb001e82e3389adf859ccdff32c1a17ae811e714c28ec71fe72565913d5ced  ./usr/lib/kbd/keymaps/i386/dvorak/ANSI-dvorak.map
eb244a1e234917f2af76393dabc1160dfd9ef03850d965fe1f41593680f73263  ./usr/lib/kbd/keymaps/i386/dvorak/dvorak-uk.map
a5ecfa8766547c204674bf3f2ec448066ea98adea45a6105c341287e2472bb12  ./usr/lib/kbd/keymaps/i386/dvorak/dvorak-sv-a5.map
bef8960b2ab28b63a88750c0453973b5ccbda2280bddc63dbea815732231fded  ./usr/lib/kbd/keymaps/i386/dvorak/dvorak-r.map
741d02faecc436282446012905efe1460f8374a334d68b0ba53f93b2e5f053bf  ./usr/lib/kbd/keymaps/i386/dvorak/dvorak-la.map
63d8c51ff27756b1751319ac6dfbd0449536affdad6642324970d25663d18f90  ./usr/lib/kbd/keymaps/i386/dvorak/dvorak-sv-a1.map
c1bb7fa18b0fee7864bdab0d7e4cb7732d37dbd0dec96ad567b1f073689df1c5  ./usr/lib/kbd/keymaps/i386/dvorak/dvorak-fr.map
7f31f00903ab1ce99a24c2c08cab9928e332ae07e353a17ef69728577c63259a  ./usr/lib/kbd/keymaps/i386/dvorak/dvorak-de.map
5c8429eb077fa4f15aac1ec14810e08a088ccf22dfe2cb72408723d05d8d5ee8  ./usr/lib/kbd/keymaps/i386/dvorak/dvorak-programmer.map
c2a34de04226925db3baa7cfff9353c2f313dfd55195959ba1a285fb01f2da56  ./usr/lib/kbd/keymaps/i386/dvorak/dvorak-ca-fr.map
8f4f653ad34bf335484f5d77cf8e45a285018627a6ad849e343d688499dbb799  ./usr/lib/kbd/keymaps/i386/dvorak/dvorak-l.map
9e639594dcf47b3e0592dc0350e5d98ed00739109e1409028a58f0de73f60da6  ./usr/lib/kbd/keymaps/i386/dvorak/dvorak-ru.map
19406058a9521a0f98d5b3b419feb69a37d3742a03856fa2e7f23cbe45b08aec  ./usr/lib/kbd/keymaps/i386/qwertz/fr_CH.map
e4ccdf9749d7b14bc9ad7c31156e9fe355f4f6ce9a172761f21d1a4881f8cc19  ./usr/lib/kbd/keymaps/i386/qwertz/croat.map
e145b97aa1f794661c8aabd8ed796a200acec53c11180196284fac9d31ed6a70  ./usr/lib/kbd/keymaps/i386/qwertz/cz.map
434ee754beb3512b64253f966d8a523d30acf376d49c261b7173915b08a5ccbb  ./usr/lib/kbd/keymaps/i386/qwertz/fr_CH-latin1.map
96a4465bbab4900905313fdde0d2073bc774f71246cfcca93be4c35f54f9fd89  ./usr/lib/kbd/keymaps/i386/qwertz/sg-latin1.map
7ac73a2cee101a47ec372ec1987966a2fb442e776979639029d7366c10224a38  ./usr/lib/kbd/keymaps/i386/qwertz/slovene.map
7ac73a2cee101a47ec372ec1987966a2fb442e776979639029d7366c10224a38  ./usr/lib/kbd/keymaps/i386/qwertz/sr-latin.map
793b6bbf80e413ba2deae577d288e5e4e55226f20def1f6546ef56d622804e7f  ./usr/lib/kbd/keymaps/i386/qwertz/hu.map
a6ed025cb02793fb891406ccc63e7b5b32ec49daf28349500c551f11de47f97d  ./usr/lib/kbd/keymaps/i386/qwertz/sg-latin1-lk450.map
f0e8726bc30c3cdf170fefbeac4563c5dc46c9c3132a1091731794a43a8637ce  ./usr/lib/kbd/keymaps/i386/qwertz/de-latin1.map
89ff1770c575ef0c9bb4703f6be504590235665f9342abf5b3e3f827d57089aa  ./usr/lib/kbd/keymaps/i386/qwertz/de_CH-latin1.map
81e6d8716c20d88e5978d21015208a9cf7203cf66fce95bf71d251fcbf50fc32  ./usr/lib/kbd/keymaps/i386/qwertz/sk-prog-qwertz.map
5127e8c120f47164c7e2a92c7f6e931bfebee1680538420ec3269fdb0122d72d  ./usr/lib/kbd/keymaps/i386/qwertz/sg.map
2a7eab8acc5d79a6c67de029f6bf1c3c7a6aa15f91505aa1a53a261da5b6a7e2  ./usr/lib/kbd/keymaps/i386/qwertz/cz-us-qwertz.map
83da9ff882606127690e60c91c30223bd31f3eee49a793b5c0e7814ee45ccea4  ./usr/lib/kbd/keymaps/i386/qwertz/sk-qwertz.map
4580207f14713ac583b6452957830a39024afc22dca132ad4b630803d342b092  ./usr/lib/kbd/keymaps/i386/qwertz/de.map
84e338d729dde420e625674c241d8a7676b525772a43baf0196616fbf097e516  ./usr/lib/kbd/keymaps/i386/qwertz/de-latin1-nodeadkeys.map
b10802a7dffbe28b0159b3273482f77a76e1caa897383d85de7446f15eb33cca  ./usr/lib/kbd/keymaps/i386/qwertz/de_alt_UTF-8.map
3e251ad046b7237a097a494656c3893211f02bb8ffe4bc752953b429dcabe611  ./usr/lib/kbd/keymaps/i386/qwertz/de-mobii.map
85dff20f816abc06f0f617b200632c81b3276e882ba51e33e3926cc2b791e681  ./usr/lib/kbd/keymaps/i386/mk_modmap
05ada8ba978142301f1052eef44a6916cbff60acd1711dec6cb291372dd3f03d  ./usr/lib/kbd/keymaps/i386/README
46010cc50b386fd4d67b0722cb67e455bbec91b0eac6fbff99298d3b7cf1e2df  ./usr/lib/kbd/keymaps/i386/olpc/es.map
b69288f62bcee539616ea36327610c1d36b97f2f5d47673738a6f43a4dec2d99  ./usr/lib/kbd/keymaps/i386/olpc/pt.map
be1fc6a3770493a34277cdfb9e7e379371ef4359f5cdfdd549a8ccc497a2aaeb  ./usr/lib/kbd/keymaps/i386/neo/README.md
d399db0dd2f2a0577b5cddac02b57baaca4851dfb3caeae29562403f40dc560c  ./usr/lib/kbd/keymaps/i386/neo/bone.map
0967b8dd81845918d328226befb7f9bab4e7aea7ce5f95ac0bd90d5afc53d118  ./usr/lib/kbd/keymaps/i386/neo/koy.map
199028a42e46fade16118f56c64f7cc010da058ba3deb373d429d8e0aa5e3032  ./usr/lib/kbd/keymaps/i386/neo/neo.map
3b8ee80121eaf1a91132a03cdc58bd09e1faec458b411f868edc7c901bcc17ed  ./usr/lib/kbd/keymaps/i386/neo/adnw.map
e818d1da04a67fe42ef76d6c1df23cc9efde3bb8f0947b1c16f53dd7e4566b68  ./usr/lib/kbd/keymaps/i386/neo/neoqwertz.map
28e3592caba72da73a87e211a583bf9488bbcc10bb1d1908afcaf9b666ba065d  ./usr/lib/kbd/keymaps/i386/neo/3l.map
334ad3f034bc75a673b8bdb31d3454047fdc1af69ec53af685d48ad72fa87676  ./usr/lib/kbd/keymaps/i386/azerty/wangbe2.map
319eea0e8950f327c8fb64c3b43e1c9551428837642e74705786aa24463ffbd1  ./usr/lib/kbd/keymaps/i386/azerty/fr-latin9.map
f7516da4286ab484d463fe8085e795b3352fdaf2602fff6c403daf6e1e592f9b  ./usr/lib/kbd/keymaps/i386/azerty/fr-latin1.map
4412917a6d68534f3af69f68e40048134256600e071b0538aaefcec5e300aa24  ./usr/lib/kbd/keymaps/i386/azerty/azerty.map
6df7125353700a8fe5ded9b36b3b182be0ae22e1752833f14f7d218bfc473eca  ./usr/lib/kbd/keymaps/i386/azerty/wangbe.map
f5095bc763567a79d02ba39de7223d5f1af99246f563eff4ac2d0e954f4075ea  ./usr/lib/kbd/keymaps/i386/azerty/be-latin1.map
da1c27ccde8ceb034c53c6a2c279ddf3b2c510a4fbe9370248299978c713bf7b  ./usr/lib/kbd/keymaps/i386/azerty/fr.map
8c43a6f90b1c2610fff37343b0eadcfe96c7d85448e14cfa54806348c7fec412  ./usr/lib/kbd/keymaps/i386/azerty/fr-pc.map
12ca81cd57cd20dc76453281f10a10cc3910a491e4cf677c4ecd943a065425a5  ./usr/lib/kbd/keymaps/i386/fgGIod/trf.map
74c70305b7fca5153c12369de89b18c737a185766581b0acbc2df1aba8534ed5  ./usr/lib/kbd/keymaps/i386/fgGIod/tr_f-latin5.map
149e5871ae141e5865553b25f47bfb893147e04c24364451b4e288552d9e1716  ./usr/lib/kbd/keymaps/i386/bepo/fr-bepo.map
0ce64b3ace1202b3402312b8442c4b7d8f0301f4c76ce440938ed9ecd00b6fb0  ./usr/lib/kbd/keymaps/i386/bepo/fr-bepo-latin9.map
139e85cf70ab7135df6f61a21eb01ca75621bc69809b633e72d9037bd3a4c37b  ./usr/lib/kbd/keymaps/i386/include/linux-with-modeshift-altgr.inc
163c8989e258d79967ada171009f3301d7f4d4f2e052b9c1adad8b31b251bccc  ./usr/lib/kbd/keymaps/i386/include/linux-keys-extd.inc
4ef31647241408c18cecd7eb2319a6f6e68c105210f6da696f40e2828e0a1ab9  ./usr/lib/kbd/keymaps/i386/include/euro2.map
c401e5090a5ca628a514559104890a29003f8deacfb6163490ca0559caf1a97c  ./usr/lib/kbd/keymaps/i386/include/keypad.map
2e1ae9394cffc9d547ab6f8d3148470d9d27b8733f004c635cdfae3dbc9b40be  ./usr/lib/kbd/keymaps/i386/include/windowkeys.map
d240b15138d8832cd2013a0a4bb9e002368f70a8eb1ae1d1ca9993dab30ba9bb  ./usr/lib/kbd/keymaps/i386/include/linux-keys-bare.inc
3a232a2e475f984c35e6fd6bfd0779eac1dc0639568f06eb1b2e7abe8a441717  ./usr/lib/kbd/keymaps/i386/include/unicode.map
c11c01db868b1d95b04841329dfc16ff7373b8e2b19374d6a8c9d219f63b8125  ./usr/lib/kbd/keymaps/i386/include/qwerty-layout.inc
7e56bec780b7fb9226a6f4a73f3efea523bd4b86ef34113b401736dd292f3111  ./usr/lib/kbd/keymaps/i386/include/applkey.map
09544abff59d0ea7415de959c79f3be7139586349dfcef762c94bab6e40a3d25  ./usr/lib/kbd/keymaps/i386/include/euro.map
29396623ac828ad5b5df6cadf796e799bca03c294a9f73a46c2d2bb3ac899d52  ./usr/lib/kbd/keymaps/i386/include/azerty-layout.inc
4d868d981c11063dbe84ceb3e8b88c1b40ec842f1725cefe5b104edc5c01a681  ./usr/lib/kbd/keymaps/i386/include/euro1.map
bbe6e0ff6fc543728665f6341fbbaa37ebb29c0646f08f16af45deb705e98262  ./usr/lib/kbd/keymaps/i386/include/compose.inc
d00a99c0dd22c69e32e72f8c9377fb0ff6311d2a49453670e60c0a9392bc450e  ./usr/lib/kbd/keymaps/i386/include/linux-with-alt-and-altgr.inc
30aaf4dffb9fa16d025e69711d5e1807c5f67b174626b91395d1ee75a4b30a10  ./usr/lib/kbd/keymaps/i386/include/backspace.map
713d343c0c4a002f6c440ca1d9e5227be12914c31635f09f07b7186ad1f680ea  ./usr/lib/kbd/keymaps/i386/include/ctrl.map
4d868d981c11063dbe84ceb3e8b88c1b40ec842f1725cefe5b104edc5c01a681  ./usr/lib/kbd/keymaps/i386/include/euro1.inc
ac1f4337a17b956220a49b31575d20fa26bab3549ff8cf989b57a300e7bc0817  ./usr/lib/kbd/keymaps/i386/include/linux-with-two-alt-keys.inc
96a0644b9151674d79d13e3c33de76f0fcdc245589f4428eb1dd4c30591e7e49  ./usr/lib/kbd/keymaps/i386/include/qwertz-layout.inc
c9191fc900606235013c5f373d56123349c865d047888993b5b11fee5b71f562  ./usr/lib/kbd/keymaps/i386/carpalx/carpalx.map
1d69c11f1125e842055ec729e56d39cbfcb0c156822ded9af739d4d091361f45  ./usr/lib/kbd/keymaps/i386/carpalx/carpalx-full.map
4bcdf6e88b80f4f46368267ed965bda63e3e703c1fa3bf15c9626255fa54be80  ./usr/lib/kbd/keymaps/i386/colemak/en-latin9.map
db99115d9d35bbe9493eb145be1ee3d97a26fa9b331feedb79d675adbc57d109  ./usr/lib/kbd/keymaps/i386/qwerty/se-fi-ir209.map
c207715d9bbd9498e5c6452d2828b3cdaf1571646a029301ef2b3a15cf0b6403  ./usr/lib/kbd/keymaps/i386/qwerty/no-latin1.doc
d3db7cee5f977a231c8ffa5ef59a78242bf746d4ba24a38ff1752a839b5e9dc9  ./usr/lib/kbd/keymaps/i386/qwerty/sk-qwerty.map
0c648e983d122dc16ea6e2b54855923dc490006376036870e9b61ac63fde5f76  ./usr/lib/kbd/keymaps/i386/qwerty/defkeymap_V1.0.map
43444dd139025497c9eefa95ca62ae83f03d2ae2c3b2cbf166850887de378566  ./usr/lib/kbd/keymaps/i386/qwerty/ua-ws.map
95f2a3211846fd0c4b1838d685a0e46a32d979e3113371c4e7603c3ff105de7b  ./usr/lib/kbd/keymaps/i386/qwerty/ruwin_alt_sh-UTF-8.map
d787b3bb79f7ac1d55588389fa1f11f4d83b6c572cc6f4f1f1ba8cecee0027e3  ./usr/lib/kbd/keymaps/i386/qwerty/hypermap.m4
f7859989d65273f4dcf92942e4715e70113afadab11d265e693f1f4ee6f86bdb  ./usr/lib/kbd/keymaps/i386/qwerty/pl2.map
8fe4fbce412c384a2d1afe9086850d45d1ff76836386c111b8f1ac33711cdada  ./usr/lib/kbd/keymaps/i386/qwerty/emacs2.map
495ca7a1eba904c9ce8a56544551cf63ccfbb3f397a74a2d0116654a119da3f4  ./usr/lib/kbd/keymaps/i386/qwerty/mk0.map
0a867cec5e3642ac83131ed5cae4f57d061d0d37cab0995e8340837f080e7a94  ./usr/lib/kbd/keymaps/i386/qwerty/nl.map
dbf94452c4ed2f5734d242fc6cd2a635faa06cdbbb1f29b3d95c671639b3b83c  ./usr/lib/kbd/keymaps/i386/qwerty/sv-latin1.map
d76f97de94ad4f6845a879e11c6ab881e08c09e9574dd0d16677dc0aee1a196e  ./usr/lib/kbd/keymaps/i386/qwerty/ttwin_ct_sh-UTF-8.map
6ca5d51394058ac7f3f44d8bace2c8fed03790dac316ba73d5f9a6fa687a13ee  ./usr/lib/kbd/keymaps/i386/qwerty/kazakh.map
196d9c95c986329cc6e5f8afe70f491ef5fdb72038880234108784ff719aeae6  ./usr/lib/kbd/keymaps/i386/qwerty/ru-yawerty.map
66376d19c63c8c90825349ec7d9401b4f58a84bbe5588cc7b37571d1bfb273ae  ./usr/lib/kbd/keymaps/i386/qwerty/ttwin_ctrl-UTF-8.map
b3e8b5ff8611774d8693adc2260b168c8f33421432760a06f89e248ce86288a6  ./usr/lib/kbd/keymaps/i386/qwerty/cz-lat2.map
10ff4f44d34aa1bd8927b23c5a90bd06d60f2cf24bb5d9cf8e3e15ea92f49742  ./usr/lib/kbd/keymaps/i386/qwerty/tralt.map
a612b2bbdcd623ea5aaa3db508a473205c9db3fe084418a8cecd1b0dbf7bec71  ./usr/lib/kbd/keymaps/i386/qwerty/ky_alt_sh-UTF-8.map
07de9b5304b67758b555b89b645d01c1571ea7e714ad26103f95f0692cff1b4c  ./usr/lib/kbd/keymaps/i386/qwerty/gr-pc.map
2b19611be75636add84fd0fc1ba30660157f52b36d9f5f06fa41862208aee8e7  ./usr/lib/kbd/keymaps/i386/qwerty/ru-ms.map
cb88552c4d946c3bc411b05c4c1404d6b1f46000365211087592fc8ea762066a  ./usr/lib/kbd/keymaps/i386/qwerty/sk-prog-qwerty.map
6ff5043df87344957d38ac8ec0ab6b4f117276c773dbefd2d729d9b2a43c2c87  ./usr/lib/kbd/keymaps/i386/qwerty/ttwin_alt-UTF-8.map
8927d45a58db15c2f1351bfac4b34de834a64a95817b01ff82f568f5e784be19  ./usr/lib/kbd/keymaps/i386/qwerty/no.map
195e700b89822799b71943145e67d8a26102bd39fd802240473c0a61a170b9a4  ./usr/lib/kbd/keymaps/i386/qwerty/ruwin_cplk-KOI8-R.map
f38fff77b96d4971dad9e1a0a426300002c43a98450601802bcfa3979cb80125  ./usr/lib/kbd/keymaps/i386/qwerty/ru.map
2828894f95d8449bd3321433fb37647911fa117a4db8783f70ce1093426a99d5  ./usr/lib/kbd/keymaps/i386/qwerty/cz.map
9036aa56d34919f9faf41b587a8784dc8bb06bf406f4c626157f9cf13ee59e6d  ./usr/lib/kbd/keymaps/i386/qwerty/ttwin_cplk-UTF-8.map
5de8985e75200f9599f2a855ab091ad43b05436b946c21d00a5d98d30a0f2d4a  ./usr/lib/kbd/keymaps/i386/qwerty/mk.map
6d66e6b30bcb85fb86d5f98b1ae8f8d84ffedfaf38b3716f9468d26ee5a5c158  ./usr/lib/kbd/keymaps/i386/qwerty/emacs.map
75ddfbe17a5a509cc2042720939eb1a7b08f71096d16d417552f87faf0a15c0a  ./usr/lib/kbd/keymaps/i386/qwerty/bg_pho-utf8.map
58c7abf6707ccd43d230b93212c27a2520eddb46704d2bd606d9dad4e3f8a14c  ./usr/lib/kbd/keymaps/i386/qwerty/br-abnt2.map
824f29bb3509f7a50c60e84bb6fba298de4ebce5c8283514c4b92d2aab0fb514  ./usr/lib/kbd/keymaps/i386/qwerty/mk-utf.map
68186e416d77feef76e1eee637321b170a4dc822b28b78d92542af5be12761c7  ./usr/lib/kbd/keymaps/i386/qwerty/bg_bds-utf8.map
ca5cf2ed2f6e6dafed427c7939c84908911ae6fcb6e96f6063a352d82829f98c  ./usr/lib/kbd/keymaps/i386/qwerty/by.map
810e53f84273981b712c4111a985b057dadf63855250b9f7247ffb3631eb6372  ./usr/lib/kbd/keymaps/i386/qwerty/es-cp850.map
a432a5b447079bfc6468e6e84d50d0ec7376ed5be0e92c5461fc6d110a9c5272  ./usr/lib/kbd/keymaps/i386/qwerty/pt-latin1.map
ca5cd7db26fe4d54ee4809622a87cb00389fb45803ae1a2d05092adb77150c09  ./usr/lib/kbd/keymaps/i386/qwerty/ua-utf.map
33a63fadb538bdeb95d2951d48e82a048c6cd2e2a38bdb8ad5b87859b1cdf1d6  ./usr/lib/kbd/keymaps/i386/qwerty/fa.map
86e8018307f591461aff8825de0e95ec245e4e33b4699f4a67bd4257b6c23697  ./usr/lib/kbd/keymaps/i386/qwerty/il.map
8ab9a89c7487b822904df21162cea160fcb2ee4b8086bdc1b7bdef3a054cdf9a  ./usr/lib/kbd/keymaps/i386/qwerty/et-nodeadkeys.map
1558d59ce2422fce38a7a7db25f3ca4793f2a95f36b956e4ca5efca6f4b60b4d  ./usr/lib/kbd/keymaps/i386/qwerty/us-acentos.map
40e7bb5d21378dca53d76d36582ebe0561c1b5649a45ebbd0e9156c101d17787  ./usr/lib/kbd/keymaps/i386/qwerty/il-phonetic.map
5d85f9ac3f9dcdc96500ae67ffeadc72508165033bb2abaaca82d7128761a2eb  ./usr/lib/kbd/keymaps/i386/qwerty/br-abnt.map
298802a49039dc27b0ec918a751747a5d2ea1b7c558b378343f1d90009f7bf6e  ./usr/lib/kbd/keymaps/i386/qwerty/ruwin_ctrl-KOI8-R.map
f64d8299413a0c1e03876a4bfde8bd69d7dcc2fc1c688b454858f2be29917a63  ./usr/lib/kbd/keymaps/i386/qwerty/ruwin_ct_sh-UTF-8.map
75fb4ad34063331095166053f17faa933b8ff333f1535b26b7a42f07020e1e18  ./usr/lib/kbd/keymaps/i386/qwerty/se-lat6.map
49e2e54d224c387e44ae1d9cfae6c22a75ab0f7cd4f427d050c6f529cdbfd96f  ./usr/lib/kbd/keymaps/i386/qwerty/la-latin1.map
63cd58746c42360871f39773a153d7c6bf3fe0d0295f2cabf3af629e7e8d1003  ./usr/lib/kbd/keymaps/i386/qwerty/sr-cy.map
d8ff6c3ef61aefe306c68543042851ee3b37d232e09b34079c4a9b70595e5377  ./usr/lib/kbd/keymaps/i386/qwerty/br-latin1-us.map
a358cf112e6d1c1d2cb25364619e141422fb893e6c9cf8891b234cc507e8d444  ./usr/lib/kbd/keymaps/i386/qwerty/kyrgyz.map
122abb7ee3ee4c26d91d01b915c8fb91fa1db12d839e38e76bb5f621661026f2  ./usr/lib/kbd/keymaps/i386/qwerty/fi.map
1a4d1203a41372c42e58b8d3f4ea7292e7900beaa9c14af5e5867d2a511300f6  ./usr/lib/kbd/keymaps/i386/qwerty/es.map
ca8b7611855d655cea30674d932efd63a3105775659b9c5a9dd9a483f6ed8bde  ./usr/lib/kbd/keymaps/i386/qwerty/ruwin_alt-UTF-8.map
2fb598ffeaa2b8934457ffd7b5b8c9098d0c1561f209bf92c3a1e18245fd4ee4  ./usr/lib/kbd/keymaps/i386/qwerty/ruwin_ctrl-CP1251.map
57d5342df53b6bc9d85025ecd056dad33e91490dc407c4940a79bdaf7aa92516  ./usr/lib/kbd/keymaps/i386/qwerty/trq.map
d1fe10de0395c03f0522c9ad673f06bf7ee87b11485f8105ad6fe339a8679716  ./usr/lib/kbd/keymaps/i386/qwerty/ua.map
52b03de8ba7db29b38541ed4f78e02793238faf52fc3a42cc69f0b72a163e340  ./usr/lib/kbd/keymaps/i386/qwerty/pl3.map
a23b7c8840fddd662e473478c1fb2976e848948c990bda45bccbd4c2062bc25e  ./usr/lib/kbd/keymaps/i386/qwerty/jp106.map
908431e0aa893eaed9700abb3b66902b3d9a1fdd37c14c68f72dff55aa0b07b0  ./usr/lib/kbd/keymaps/i386/qwerty/gr.map
a8324acb0a783fc0a61b7d94149cf33222c466116d3145c6ce5ada8ba1b4adc2  ./usr/lib/kbd/keymaps/i386/qwerty/ua-cp1251.map
6045eae69296441f0aacc2d8c41980581ab8c01d8698f24a85826626371e32b8  ./usr/lib/kbd/keymaps/i386/qwerty/pl1.map
524034a6fe793d38a9b554e6ee1feae9aba6d0fd55b319c17cf1cf4064e8c9a5  ./usr/lib/kbd/keymaps/i386/qwerty/us.map
1047dd38a4dc4190cb0c0548d1dcad5793b1336de0140d4e91b07a4aaa9b72c2  ./usr/lib/kbd/keymaps/i386/qwerty/lv-tilde.map
c8d73452f2dab1f0d2c8b0c7e2ee39e5cc5f20d9d2c26f7cda538d725525346f  ./usr/lib/kbd/keymaps/i386/qwerty/cf.map
d98ff45193a1d91399ec0a0588c4ac7668bc25648124425d78b3c22597024334  ./usr/lib/kbd/keymaps/i386/qwerty/ru3.map
01f38ffef809968bc9d49f0049f7dfac224219118a8164a76b020220cb39309a  ./usr/lib/kbd/keymaps/i386/qwerty/hu101.map
761a9b6fdb59a3be71199bdb226d188bbb31752b2c692484c06e2ea2481ce2a1  ./usr/lib/kbd/keymaps/i386/qwerty/pc110.map
4b51ba1d93ba05ecfbe8ddc4ed231f8ace0fca624c2f0abf380d00d94b135b3c  ./usr/lib/kbd/keymaps/i386/qwerty/se-fi-lat6.map
cd6eb41a737a5bb1e4f9c21472f0781d653c94f16f2356c46afc9e5828b94821  ./usr/lib/kbd/keymaps/i386/qwerty/bg_bds-cp1251.map
abc074d1a5c9cd13e2979cf6473222dfe761cb39963001911cc1373996f399bd  ./usr/lib/kbd/keymaps/i386/qwerty/bywin-cp1251.map
c1b7c787037f61c1646004d0ecf8e12a720f112b437e9da654149253a28bb975  ./usr/lib/kbd/keymaps/i386/qwerty/tj_alt-UTF8.map
7b544a1ecc55d5b1ff7b5b59d84e3688c644eaafbd0868ab1e637d8c64be65c6  ./usr/lib/kbd/keymaps/i386/qwerty/uk.map
8795986b16cf56104d221f551a0471b6f94df253a2c538be4170af3296d34eb4  ./usr/lib/kbd/keymaps/i386/qwerty/dk-latin1.map
d1a478dfc88d2acb9211caa97006f94c7a9495ba514d36c46ff7c7dc956585cc  ./usr/lib/kbd/keymaps/i386/qwerty/dk.map
5f57ddd2059f3910a7960d15b9e56d6ff50aa04cdccd4b9260ce2cbdfd451afd  ./usr/lib/kbd/keymaps/i386/qwerty/ru_win.map
c1463477d0554e6295a4c636ba11263dacb47c6818ffee07b1a7b7e3b94a1526  ./usr/lib/kbd/keymaps/i386/qwerty/is-latin1.map
47c31bef64070478934a28b27777ccd1deeea5fca7707f82a42818ce33cd47d2  ./usr/lib/kbd/keymaps/i386/qwerty/by-cp1251.map
a3aa8bd471f4132d0af2f1b2b7a47c3efee8fcc26f69abba20373f41d2673ade  ./usr/lib/kbd/keymaps/i386/qwerty/br-latin1-abnt2.map
b7671025410f146a9723b07877e2062804297cf2527a1fc6e85056686b00ef4f  ./usr/lib/kbd/keymaps/i386/qwerty/mk-cp1251.map
259f2c0bac539644ce8c416db978b95c3293ddec9737daa9a5c796d34be0f2f4  ./usr/lib/kbd/keymaps/i386/qwerty/it.map
9fbc79cac13136fa5b6d2586d8b10f735c084422e9de3285f58127558857b605  ./usr/lib/kbd/keymaps/i386/qwerty/ruwin_ctrl-UTF-8.map
816578f17dde7ec9566827dbe069697b388abb918bc40fa34741d3298736691f  ./usr/lib/kbd/keymaps/i386/qwerty/il-heb.map
0d075a438f3f59ce2e5eeb39e718d586d03fb2c6f21480bea74176f381ec5b01  ./usr/lib/kbd/keymaps/i386/qwerty/ruwin_cplk-UTF-8.map
44ead376e9cb0d1bc4d84669e03649119813819147a5eb67303e94d293aad0ce  ./usr/lib/kbd/keymaps/i386/qwerty/ruwin_cplk-CP1251.map
aa4eae4353de1e63f0c2e57b35fba1bb300e4befb547d7ab11d894cc112c77da  ./usr/lib/kbd/keymaps/i386/qwerty/ro_win.map
8454c1628704c09b8999325dd862ffb7554eb5663a64ce35037b21a1c4fb8ede  ./usr/lib/kbd/keymaps/i386/qwerty/is-latin1-us.map
5831bbf7fff6e90995e7b2b94d88fe29c92cac55837a8968e99253108f18431a  ./usr/lib/kbd/keymaps/i386/qwerty/se-ir209.map
39932354960e3f702219cbf2a4284a098503e0c2e57467c2ab7eefb0b663387c  ./usr/lib/kbd/keymaps/i386/qwerty/ca.map
76e6dfcce30eb1719d41bda0d73f0c1331336f95fcfd7a3fbdf373d3240fb865  ./usr/lib/kbd/keymaps/i386/qwerty/it-ibm.map
15e43bc9f6cf2cdd7b1926f27bc1ad13827a550a71f1ea4bdbf841e61d16155f  ./usr/lib/kbd/keymaps/i386/qwerty/ru-cp1251.map
9e6e07c5b105837e6527ab0a4ac75acd5a4bfc1dab171bf49d64126ac44dd900  ./usr/lib/kbd/keymaps/i386/qwerty/ro.map
76694f7d3ca8729bbedf4fe23b7391dab89fe75f1d17a05cf7888980d3cc35b9  ./usr/lib/kbd/keymaps/i386/qwerty/ru1.map
39a3997286d041ad0a42db1ae3a23c51bfc6177d27f62dbcd1db9113097bab0a  ./usr/lib/kbd/keymaps/i386/qwerty/et.map
1b238fc4d8dffecdc6d29cd86bd32c3a17da70c4dd51063af6125c1e06b67b68  ./usr/lib/kbd/keymaps/i386/qwerty/ru2.map
41302dfe4cc00862956ed4597dbf9aa04a52f739f7cb5e26329d7bfacd93f45b  ./usr/lib/kbd/keymaps/i386/qwerty/ruwin_alt-KOI8-R.map
86f69ad2da3c586e21cb1d2eb672611f01a6278345f525f26930f84def9cb10b  ./usr/lib/kbd/keymaps/i386/qwerty/cz-lat2-prog.map
e76fc0a8900faa9c78fd8569308db79a9c5a898418644abbecb91dccebc74d09  ./usr/lib/kbd/keymaps/i386/qwerty/lv.map
49d36c25d99d28980e970d83c9c51be26e7c28045b928d913a888edf43cf00dd  ./usr/lib/kbd/keymaps/i386/qwerty/ua-utf-ws.map
f5eac2420ccbb9cd9262f56203dd8eabd5aa075951684b35fb8e6dac6d873e93  ./usr/lib/kbd/keymaps/i386/qwerty/cz-cp1250.map
e40dfd5dc1fc4502a823e0b242344d65d6164905aa98f9c291ed1cf26f4abaac  ./usr/lib/kbd/keymaps/i386/qwerty/trf.map
2b035b7890415e79ff0ea85653bc0b1598ec6cb59479966510fa4e0e71516745  ./usr/lib/kbd/keymaps/i386/qwerty/ru4.map
08aa205d571276a1fbb35b0c455e21ac0685a941b83fa92e9304d71d298c546f  ./usr/lib/kbd/keymaps/i386/qwerty/ie.map
75882a552bd7ae48dd10fdd139fd1d0cd7e11f26e7026179182c99c31be41e2b  ./usr/lib/kbd/keymaps/i386/qwerty/it2.map
d63be1155ac6bc7e888b4e1abbc7898d589dd1ab4bb0b63abc42b83e5b8a6bd8  ./usr/lib/kbd/keymaps/i386/qwerty/defkeymap.map
7cd1dbea21e642649d273d1d9a2d64b298ac56cdb3f5045aa9296501ec4bebd3  ./usr/lib/kbd/keymaps/i386/qwerty/lt.map
1c873703c3cb7c5db8996db052136deced0d6ab9d126bea87ed9fb731e72dbc3  ./usr/lib/kbd/keymaps/i386/qwerty/tr_q-latin5.map
df4f9fbee1e0c664c93f5f00477cba7af47ed1472a8ecabe509dde413d63e2c7  ./usr/lib/kbd/keymaps/i386/qwerty/ruwin_alt-CP1251.map
6761da9235060eeeabf703de30ab9a2fa564c610e15c0edcaca4f2c4371afe9c  ./usr/lib/kbd/keymaps/i386/qwerty/ruwin_ct_sh-KOI8-R.map
02781bf664561755c442c8d08869c1183704345a6c4f32313fe010a9f73a44c1  ./usr/lib/kbd/keymaps/i386/qwerty/us1.map
b1be343eef29d82df40580780267be2838216178659014796c19d2bc4f80fb8a  ./usr/lib/kbd/keymaps/i386/qwerty/bg-cp855.map
9300f6a187ba34faf0fa3317ded0fecf13cfb6ef8eb9ab8319b8df7836c90f13  ./usr/lib/kbd/keymaps/i386/qwerty/ro_std.map
a86c1a508c25e5209fc2129684ccc947558e4ac9e7a9abc9eb755d2f14859b15  ./usr/lib/kbd/keymaps/i386/qwerty/pl.map
f56dce1b69c6767b3d7a5432c848ee75d5fac48bb95007cb67ff281b654c93cf  ./usr/lib/kbd/keymaps/i386/qwerty/lt.l4.map
8e5d242f621f71fe71ca7b2b3c0804a75f575ad7c93c7d7e143e5a3d2d7b1587  ./usr/lib/kbd/keymaps/i386/qwerty/bg_pho-cp1251.map
28a5784c2aa202c497c2bbd52eeaef6d16ffe4e3d09bb513b61a38f1f173bbb5  ./usr/lib/kbd/keymaps/i386/qwerty/nl2.map
5dca9dc84903ba6125fb44c17c55b3dc51c6ec3c043aa108518443f4fd186d4f  ./usr/lib/kbd/keymaps/i386/qwerty/pl4.map
3c95c1699326ada61e175a34ef955ba4a19cf1ed2601cb7b2e80e23569f9d961  ./usr/lib/kbd/keymaps/i386/qwerty/pt-latin9.map
746fb3dd56f2d6f34a1889f1c9ce4ebd140cef3af6ac9bc883e8eb57bec315e9  ./usr/lib/kbd/keymaps/i386/qwerty/bg-cp1251.map
f0ae25e11c2b55e79b69a697fae9366aa2e4f73e0ad167f8d969570251d53499  ./usr/lib/kbd/keymaps/i386/qwerty/no-latin1.map
5c04578583d4d3d279c0b75d0d32d0053fed714079cc20f1b4a037949e8e111d  ./usr/lib/kbd/keymaps/i386/qwerty/bashkir.map
ff3535bde067528a220a6abefebd355cad9b0de2f66e59173b0aa68944909d57  ./usr/lib/kbd/keymaps/i386/qwerty/lt.baltic.map
63c54563ca6b40e11af35262ba77a03d333e62a309066cb5cd6a143e4cd8c02f  ./usr/lib/kbd/keymaps/i386/qwerty/ruwin_ct_sh-CP1251.map
2e985d247c749afd8987ee35901ac03bf5971bc989d7c320a322c70cac125916  ./usr/lib/kbd/keymaps/amiga/amiga-us.map
42fea438b890e3e26c5aa6fc2c4f1d5bafc063f8f6fe23f18a33357724895c6a  ./usr/lib/kbd/keymaps/amiga/amiga-de.map
0d80f3e6b3417cedbc5f574e2544be1571d2f49f6e5472f8880a3ceae2a50123  ./usr/lib/kbd/keymaps/sun/sundvorak.map
7cad08100926e42128f64d3e5f97de18edf48a4fd51d82e03e9dde01efebf15e  ./usr/lib/kbd/keymaps/sun/sun-pl.map
f82c609828e959969667168df1a6256d74f05dc3f9dab3058a15a5c68f353990  ./usr/lib/kbd/keymaps/sun/sunt4-fi-latin1.map
86a59056e03a088a6c0ab69ac874a11830b144579fe84db10e01d987e62246f0  ./usr/lib/kbd/keymaps/sun/sunt5-fi-latin1.map
9e9807a4c52c99fc735937c0d3ec887a4c3c741d4610f50cc7a7c1a72bd6d106  ./usr/lib/kbd/keymaps/sun/sunt5-fr-latin1.map
ed397b51c8283c900b4a7a69b409a1185073229d1e39124a7553fdcb44b159df  ./usr/lib/kbd/keymaps/sun/sunt6-uk.map
e97ec5edb8d7cb55f733933456c8306d925c2791b9044b3849054ab919e2709e  ./usr/lib/kbd/keymaps/sun/sunt5-de-latin1.map
376487e2aef38a4ac13985a8f56cbe11c139d1fad0fa76916feaae73a62adbcd  ./usr/lib/kbd/keymaps/sun/sunt5-uk.map
6c70bb0b5d7349d8f0e6405c1637511393b0894b2392e3b11cc28a734875ce19  ./usr/lib/kbd/keymaps/sun/sunkeymap.map
9259e8617986a014a99d6f50b18d2625c7fa08e918f0e81caf7c61f5f26a7b0f  ./usr/lib/kbd/keymaps/sun/sunt5-cz-us.map
b2a2f6892c76e611313c07b6064baac68036a44ba05ba54220b954105fbd9c2c  ./usr/lib/kbd/keymaps/sun/sunt5-es.map
94ece2ce25c3f9fbd6156456bb9497ce73b8823f4f6c24dd5c504ecaab4618cb  ./usr/lib/kbd/keymaps/sun/sunt4-es.map
50674bc4050e2fc72245c43f56664a1d7b7dd5e979e5ff5447618f94ab690f7f  ./usr/lib/kbd/keymaps/sun/sunt5-us-cz.map
55abcb5a4d752deb478780bb076e7fbad08bd3fd646d0c036d53c53fd0446bbb  ./usr/lib/kbd/keymaps/sun/sun-pl-altgraph.map
42cbf910555999b2184468e4e261ff1e3e587bcca33ca928139d920a42e23858  ./usr/lib/kbd/keymaps/sun/sunt4-no-latin1.map
5f3041d7e5296b79376bfa8e808f658f65427cea0e6e10480ce8406699289d5f  ./usr/lib/kbd/keymaps/sun/sunt5-ru.map
aeb93b9ef38e688b4ef57dbb880c25e83d291f11e169f71395b578ea3b79e4ed  ./usr/lib/kbd/keymaps/atari/atari-uk-falcon.map
8808073decf8befe7b42ccd6326bc64d988c87685fa1315668b6ded631a8b580  ./usr/lib/kbd/keymaps/atari/atari-se.map
2de68f29071fdcbaadc2fa97b58f137236befab53bb0498c783f1564ef76c5bb  ./usr/lib/kbd/keymaps/atari/atari-de.map
7f1eca9e98f688b48772f7eede3adac0c459c5625350cef812081dc5b6f3ac9b  ./usr/lib/kbd/keymaps/atari/atari-us.map
d22a45db8dc55ed2a271591d618f7d9e0b38b5cefe4b641da988baaf71622949  ./usr/lib/kbd/keymaps/mac/include/mac-qwerty-layout.inc
364701b04fddc5a2990d03e1741e12363d9ad36d182d033040a565e1dc7ce136  ./usr/lib/kbd/keymaps/mac/include/mac-euro.map
34be915fd0ad688e124c4e7d0a0aac7858d5ed45b8e173c6b4b8317ad946ba9f  ./usr/lib/kbd/keymaps/mac/include/mac-azerty-layout.inc
3a24268300c8bf161d65d7335e649def63776e268b47486f7edc50cf9fa63523  ./usr/lib/kbd/keymaps/mac/include/apple-a1243-fn.inc
356b408bf0931a0133687df226b28051d59c2cf446156e4312d2db9f9355c8cb  ./usr/lib/kbd/keymaps/mac/include/apple-a1048-base.inc
ed7207dd71a475accc6efe470bc8658761968faf4cff32763f4c529d2b80f6d8  ./usr/lib/kbd/keymaps/mac/include/mac-linux-keys-bare.inc
ad6a80a9391949034e82aa2f767ac2b060dbd3f538f7415e1e571c3e5de753a8  ./usr/lib/kbd/keymaps/mac/include/mac-qwertz-layout.inc
7e293895858541c173bfe1f23070c3ca538098281ce5b65a5779bcb4a8f9c1a8  ./usr/lib/kbd/keymaps/mac/include/mac-euro2.map
6e361eec8e08e695610166270647c8ec736cec9d6b835e518abe74b9da66c07c  ./usr/lib/kbd/keymaps/mac/include/apple-a1243-fn-reverse.inc
6a81d414ad3d0d2b672d1f89ff0bae4d863cfc636f01a6a9df714968d8e04058  ./usr/lib/kbd/keymaps/mac/all/mac-es.map
10083bab90c454447cbeadb1b8749bc1b87f39880c2119017ebc1e379975c22d  ./usr/lib/kbd/keymaps/mac/all/apple-internal-0x0253-sv-fn-reverse.map
0a422ab4b98983e2d9327e14b7a8dc46362d6b5d48b9d20b9cabdc7c73b45c36  ./usr/lib/kbd/keymaps/mac/all/mac-us.map
5b2a1900298615820e342678e3394786c201e729cf20913347b6bd0124b64d82  ./usr/lib/kbd/keymaps/mac/all/apple-a1243-sv.map
e9627002eccbd68b44a26bfffd19d3270e0d5da7ed8e9214d682dca508f60d49  ./usr/lib/kbd/keymaps/mac/all/mac-de-latin1.map
eb7a6754ab871fca2db9b3f11d729c53366b4b3917d6d8ee878aa0a55ae37215  ./usr/lib/kbd/keymaps/mac/all/mac-se.map
aa2d5153ffdb0e4d4f3c0080aef157bdaec6ce123f20176275cc6664b7742208  ./usr/lib/kbd/keymaps/mac/all/apple-a1048-sv.map
1bde44d1cf9e5a412ca6faba29d6c56270fbfac732af15c62136e5afd9d5c239  ./usr/lib/kbd/keymaps/mac/all/mac-be.map
2c572cef0db4e8bc93d7be39b0fc71d3a29f2efe9facfcb3b70429ffdcdd282d  ./usr/lib/kbd/keymaps/mac/all/mac-fr_CH-latin1.map
1c81cbb9ba6283a34b173b9db10cc7992d475ee3ee67fc71be81ff8b61e53b7e  ./usr/lib/kbd/keymaps/mac/all/mac-fr.map
872815b3d1086273a41a0f56b1659fe9d92397b5ed72e10602132e8770bf1921  ./usr/lib/kbd/keymaps/mac/all/mac-de_CH.map
a32128caf2ec0859746ba27647f88f11657d10ca44967efb68d7990a4cd0dc6c  ./usr/lib/kbd/keymaps/mac/all/mac-dk-latin1.map
5a0368937b809824ab05cf32146ca7c6ca00cfdcf7d1af642e76a72cb024523c  ./usr/lib/kbd/keymaps/mac/all/mac-fi-latin1.map
95380240f631137b63a8081d0168b49e920738b39555a5694c0ab36996a49ab3  ./usr/lib/kbd/keymaps/mac/all/mac-no-latin1.map
b03bd7f5c0ea973e513f2d4adcbc4a5e934599c15e9b2562b39587c572189a78  ./usr/lib/kbd/keymaps/mac/all/mac-de-latin1-nodeadkeys.map
4a9184ef3637d8d2fdd03ed54324a098fe96a82cbcdae7bfae66a05adc09b94e  ./usr/lib/kbd/keymaps/mac/all/mac-pl.map
30d7f581c8f9e3b5c494cda3866e7e6b66f6d15cd2e884375325575e1470b5b8  ./usr/lib/kbd/keymaps/mac/all/mac-fr-legacy.map
176f933f3ca9f6fdbcd51310a4db3306c453e1bc732d54fc40ebff4cd9056f33  ./usr/lib/kbd/keymaps/mac/all/mac-uk.map
171db8403594b67d3589ea53e31b855f06e32f1f0b181a8aab809e72cbd51baa  ./usr/lib/kbd/keymaps/mac/all/mac-dvorak.map
e9a8fdce12aeed4d4a1a0cdc0057d2126f40ae05e27ee67e6d88c4eba21ec89c  ./usr/lib/kbd/keymaps/mac/all/apple-internal-0x0253-sv.map
59e11de5c60674297acf565de18363bd0d05f22e0b8472d2581422693dccbaaa  ./usr/lib/kbd/keymaps/mac/all/mac-template.map
c3de467e80820e377c75d8f19a563f9307a6ff136b8221f572f74f6a852a2ac4  ./usr/lib/kbd/keymaps/mac/all/mac-it.map
8186d85b701d6fc0583be1ef486a05de9122e7bcdff1f6ce7c2df0cebcf84a63  ./usr/lib/kbd/keymaps/mac/all/apple-a1243-sv-fn-reverse.map
03ddc2fde8d8e524ac925c62097f289d605b7c4bd0fcb1e56eb7593931792056  ./usr/lib/kbd/keymaps/mac/all/mac-pt-latin1.map
e221284700a2b58cb20d17ee80cf103808e2b7edce40c11700ce6b21975ed723  ./usr/lib/kbd/keymaps/include/compose.latin
f9c6ceea33c9da412a9c42fb6742c7c5c9ce35dd2e57924143946b9cf174357e  ./usr/lib/kbd/keymaps/include/compose.8859_7
076afac1db3eda2de79573ca7a524bd2c767382a857f5dc213ea4080640f6ce9  ./usr/lib/kbd/keymaps/include/compose.8859_8
c9b8ee20405576b12308d96e6d0b99a079981e47beceb9a21b238cf197865094  ./usr/lib/kbd/keymaps/include/compose.latin2
426ae1285e06d32a4ace13485179ea5d655dca5efda7855171e43db2b63fca39  ./usr/lib/kbd/keymaps/include/compose.latin1
da35ead88bf9e4a44ff1eb9f8b1b683f5590874670662af8246aa4fbe7dd0f08  ./usr/lib/kbd/keymaps/include/compose.latin3
bd8d9aede2f6b8a6d646a5af613383089cd6af9ee44de0b0170156d994c00f43  ./usr/lib/kbd/keymaps/include/compose.latin4
3239f51d990ecf8a5b70a4bee62707128f1300e73f083434e519f0d80e97d4f4  ./usr/lib/kbd/keymaps/include/vim-compose.latin1
3ffc8cc0cc178a34ffe30c00aa8a2646a3cd582776b41e1bd5f299bb8d001add  ./usr/lib/kbd/keymaps/pine/en.map
e9ed32ac43ef54083261bc7ac754545577bc1e0c69018ae7031bfeb3d735dddb  ./share/keymaps/defkeymap.map

More notes under linuxboot/heads-wiki#70, but as of now there needs to be something different in the data.cpio for it to be different otherwise i'm not understanding what is happening here: the cpio should be constructed reproducibly unless I did something bad when introducing keyboard keymaps #1961.

Zip that data.cpio and post it here?

@thickfont
Copy link
Author

data.cpio.zip

Can confirm I get the same output with your one-liner:

user@heads:~$ HASHES1=circleci_hashes.txt 
user@heads:~$ HASHES2=local_hashes.txt 
user@heads:~$ egrep '^[0-9a-f]{64}' $HASHES1 | while read line; do HASH_REF=$(echo $line|awk -F " " {'print $1'}); FILE_REF=$(echo $line|awk -F "/" {'print $NF'}); if ! grep -q "$HASH_REF" $HASHES2; then echo "$FILE_REF doesn't match";fi; done
data.cpio doesn't match
initrd.cpio.xz doesn't match
heads-t480s-maximized-v0.2.0-2771-gc689e33.rom doesn't match

Hashes:

user@heads:~$ sha256sum data.cpio
7020c60eb0184cb0cf8392a5a510233a1a1eb95662d1d1860054eecedd609181  data.cpio
user@heads:~$ sha256sum data.cpio.zip 
5e0c39d59be7879a239eda4001e42c37794389751a4a405a45d22d09cc296e9a  data.cpio.zip

@kjkent
Copy link

kjkent commented May 9, 2025

Just built this PR with the goal of diffing to confirm and then flashing. The ThunderBolt firmware roms (ie., LBMK's tb.bin to this PR's blobs/xx80/t480s_tb.bin) are identical, however the me.bin differs from that produced by LBMK.
In blobs/xx80/t480s_download_clean_deguard_me_pad_tb.sh, ME_delta is initialized to thinkpad_t480. I see this variable is used by the deguardfunction on line 99 (--delta "data/delta/$ME_delta"), referencing a directory within coreboot/deguard, but there's a t480s-specific folder in there too, so just checking this isn't a typo.

The comment above these ME_* variables states they'd need be changed for other devices "like the T480s", but ME_delta, ME_version, ME_sku and ME_pch are identical between the ME-producing scripts for the two devices (t480{,s}_download_clean_deguard_me_pad_tb.sh)

@thickfont
Copy link
Author

thickfont commented May 9, 2025

Just built this PR with the goal of diffing to confirm and then flashing. The ThunderBolt firmware roms (ie., LBMK's tb.bin to this PR's blobs/xx80/t480s_tb.bin) are identical, however the me.bin differs from that produced by LBMK. In blobs/xx80/t480s_download_clean_deguard_me_pad_tb.sh, ME_delta is initialized to thinkpad_t480. I see this variable is used by the deguardfunction on line 99 (--delta "data/delta/$ME_delta"), referencing a directory within coreboot/deguard, but there's a t480s-specific folder in there too, so just checking this isn't a typo.

The comment above these ME_* variables states they'd need be changed for other devices "like the T480s", but ME_delta, ME_version, ME_sku and ME_pch are identical between the ME-producing scripts for the two devices (t480{,s}_download_clean_deguard_me_pad_tb.sh)

Valid concern. However, I can confirm the T480 me blob works on the T480s. As mentioned here:
https://github.com/linuxboot/heads/tree/master/blobs/xx80

As specified in the first link, this ME can be deployed to:

T480
T480s

However, I don't know what "first link" they are referring to as a source (none of the links say so?).

I am willing to switch it over to a T480s me blob, though I don't know if it matters at all?

With the current differing hash issues, I wouldn't flash anything yet. Flash at your own risk. Once hashes match, I'd prefer to be the first to risk the flash (not that I haven't already gotten it working, but I can't guarantee it will work unless I flash the exact same rom as circleci)

Btw, since you built the board, do your hashes match those in circleci?

@kjkent
Copy link

kjkent commented May 10, 2025

@thickfont

Valid concern. However, I can confirm the T480 me blob works on the T480s. As mentioned here: https://github.com/linuxboot/heads/tree/master/blobs/xx80

As specified in the first link, this ME can be deployed to:

T480
T480s

I understood this as meaning that the executable linked to (i.e., https://dl.dell.com/FOLDER04573471M/1/Inspiron_5468_1.3.0.exe) contains an ME that can be deployed to both devices, without inferring that the processing it must undergo via deguard is the same, if that makes sense? As in t480_download_clean_deguard_me_pad_tb.sh, the only part the original author states must change between devices is the ME_{delta,version,sku,pch} variables, rather than the source ME itself.

However, I don't know what "first link" they are referring to as a source (none of the links say so?).

That was originally written in f75ddb8 by @gaspar-ilom during the original port of the t480 -- I'm not sure either but

I am willing to switch it over to a T480s me blob, though I don't know if it matters at all?

Comparing the hex diffs of the two relevant directories in deguard, I'm not really knowledgeable enough about ME internals nor the inner workings of deguard to confidently say whether it would make any difference! Though it's promising that it works on your machine. Does your bluetooth work after flashing?

Out of curiosity, I'll check out how LBMK approaches this.

With the current differing hash issues, I wouldn't flash anything yet. Flash at your own risk. Once hashes match, I'd prefer to be the first to risk the flash (not that I haven't already gotten it working, but I can't guarantee it will work unless I flash the exact same rom as circleci)
Btw, since you built the board, do your hashes match those in circleci?

Caution understood, thanks :) And yep, my hashes match for the final rom and thunderbolt binary, but the keymaps output differs (appears to be different keymap set built between local and CircleCI?), and me.bin isn't present in the CircleCI artifacts.

@thickfont
Copy link
Author

thickfont commented May 10, 2025

@kjkent Good points.

I also decided to look into it too. The current "download_clean_deguard_me_pad_tb.sh" script git checkouts a commit of deguard that does support thinkpad t480s in the data/delta directory. So, it should just be a matter of changing the ME_delta variable to t480s and it should work just like lbmk.

I see no reason to not do this, we might get ahead of some unforeseeable bugs by doing so. Added to my todo list.

but the keymaps output differs (appears to be different keymap set built between local and CircleCI?)

I don't follow you here, how are you getting the same rom with different keymaps used in your local build? What do you mean when you say you different keymaps?

I just built t480s-hotp-maximized and t480s-maximized on a second piece of hardware and also got the same different hash as my previous local builds.

EDIT:
Just to be more explicit with my last sentence, I am still getting this hash which obviously changes the final rom hash, on different hardware.
$ sha256sum data.cpio
7020c60eb0184cb0cf8392a5a510233a1a1eb95662d1d1860054eecedd609181 data.cpio

@thickfont
Copy link
Author

@kjkent

I updated the blob script to use the t480s delta for the deguard of the ME. The resulting me.bin now is identical to the one created by lbmk.

@tlaurion

During my rebase, I left out the git merge to the latest keymap updates to see if the roms are reproducible. I can confirm they are reproducible (local vs circleci) for me without the merge. So it seems the keymap update might be the culprit?

Lastly, I finally checked the thunderbolt fast charging and can confirm fast charging works. I updated the todo list to reflect this.

@tlaurion
Copy link
Collaborator

During my rebase, I left out the git merge to the latest keymap updates to see if the roms are reproducible. I can confirm they are reproducible (local vs circleci) for me without the merge. So it seems the keymap update might be the culprit?

I opened #1969 to track this issue. For the moment, without investigating further, I do not understand why some local builds differ from Circleci and wasn't able to reproduce. Will check next week.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants