├── .gitignore ├── .github └── FUNDING.yml ├── board-versions.txt ├── bios-versions.txt ├── Makefile ├── src ├── yoga-bios-versions.h ├── yoga-board-versions.h ├── yoga.h └── yoga-bios-unlock.c ├── LICENSE └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | /yoga-bios-unlock 2 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: [esno] 4 | ko_fi: crito 5 | -------------------------------------------------------------------------------- /board-versions.txt: -------------------------------------------------------------------------------- 1 | SDK0J40688 WIN 2 | SDK0J40697 WIN 3 | SDK0J40700 WIN 4 | SDK0J40709 WIN 5 | SDK0Q55726 WIN 6 | SDK0L77769 WIN 7 | -------------------------------------------------------------------------------- /bios-versions.txt: -------------------------------------------------------------------------------- 1 | DMCN27WW 2 | DMCN29WW 3 | DMCN32WW 4 | DMCN34WW 5 | DMCN35WW 6 | DMCN36WW 7 | DMCN38WW 8 | DMCN39WW 9 | DMCN41WW 10 | DMCN44WW 11 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | all: yoga-bios-unlock 2 | 3 | headers: 4 | xxd -i bios-versions.txt > ./src/yoga-bios-versions.h 5 | xxd -i board-versions.txt > ./src/yoga-board-versions.h 6 | 7 | yoga-bios-unlock: src/yoga-bios-unlock.c 8 | ${CC} -o ./yoga-bios-unlock ./src/yoga-bios-unlock.c -O2 -Wall -Wextra -Wfloat-equal -Wshadow -Wstrict-prototypes -Wstrict-overflow=5 -Wcast-qual -Wconversion -Wunreachable-code 9 | 10 | clean: 11 | rm ./yoga-bios-unlock 12 | -------------------------------------------------------------------------------- /src/yoga-bios-versions.h: -------------------------------------------------------------------------------- 1 | unsigned char bios_versions_txt[] = { 2 | 0x44, 0x4d, 0x43, 0x4e, 0x32, 0x37, 0x57, 0x57, 0x0a, 0x44, 0x4d, 0x43, 3 | 0x4e, 0x32, 0x39, 0x57, 0x57, 0x0a, 0x44, 0x4d, 0x43, 0x4e, 0x33, 0x32, 4 | 0x57, 0x57, 0x0a, 0x44, 0x4d, 0x43, 0x4e, 0x33, 0x34, 0x57, 0x57, 0x0a, 5 | 0x44, 0x4d, 0x43, 0x4e, 0x33, 0x35, 0x57, 0x57, 0x0a, 0x44, 0x4d, 0x43, 6 | 0x4e, 0x33, 0x36, 0x57, 0x57, 0x0a, 0x44, 0x4d, 0x43, 0x4e, 0x33, 0x38, 7 | 0x57, 0x57, 0x0a, 0x44, 0x4d, 0x43, 0x4e, 0x33, 0x39, 0x57, 0x57, 0x0a, 8 | 0x44, 0x4d, 0x43, 0x4e, 0x34, 0x31, 0x57, 0x57, 0x0a, 0x44, 0x4d, 0x43, 9 | 0x4e, 0x34, 0x34, 0x57, 0x57, 0x0a 10 | }; 11 | unsigned int bios_versions_txt_len = 90; 12 | -------------------------------------------------------------------------------- /src/yoga-board-versions.h: -------------------------------------------------------------------------------- 1 | unsigned char board_versions_txt[] = { 2 | 0x53, 0x44, 0x4b, 0x30, 0x4a, 0x34, 0x30, 0x36, 0x38, 0x38, 0x20, 0x57, 3 | 0x49, 0x4e, 0x0a, 0x53, 0x44, 0x4b, 0x30, 0x4a, 0x34, 0x30, 0x36, 0x39, 4 | 0x37, 0x20, 0x57, 0x49, 0x4e, 0x0a, 0x53, 0x44, 0x4b, 0x30, 0x4a, 0x34, 5 | 0x30, 0x37, 0x30, 0x30, 0x20, 0x57, 0x49, 0x4e, 0x0a, 0x53, 0x44, 0x4b, 6 | 0x30, 0x4a, 0x34, 0x30, 0x37, 0x30, 0x39, 0x20, 0x57, 0x49, 0x4e, 0x0a, 7 | 0x53, 0x44, 0x4b, 0x30, 0x51, 0x35, 0x35, 0x37, 0x32, 0x36, 0x20, 0x57, 8 | 0x49, 0x4e, 0x0a, 0x53, 0x44, 0x4b, 0x30, 0x4c, 0x37, 0x37, 0x37, 0x36, 9 | 0x39, 0x20, 0x57, 0x49, 0x4e, 0x0a 10 | }; 11 | unsigned int board_versions_txt_len = 90; 12 | -------------------------------------------------------------------------------- /src/yoga.h: -------------------------------------------------------------------------------- 1 | #ifndef _yoga_h 2 | #define _yoga_h 1 3 | 4 | // these header files has to be generated with xxd 5 | // run `make headers` 6 | #include "yoga-bios-versions.h" 7 | #include "yoga-board-versions.h" 8 | 9 | #define BIOS_VENDOR "LENOVO" 10 | 11 | #define BOARD_VENDOR "LENOVO" 12 | #define BOARD_NAME "LNVNB161216" 13 | 14 | #define CHASSIS_VERSION "Yoga Slim 7 14ARE05" 15 | #define CHASSIS_VERSION_CN "Yoga 14sARE 2020" 16 | 17 | #define BIOS_VERSION_LEN 8 18 | #define BOARD_VERSION_LEN 14 19 | 20 | #define bios_versions bios_versions_txt 21 | #define bios_versions_len bios_versions_txt_len 22 | 23 | #define board_versions board_versions_txt 24 | #define board_versions_len board_versions_txt_len 25 | 26 | #define PORT_INDEX 0x72 27 | #define PORT_DATA 0x73 28 | 29 | #define PORT_INDEX_VALUE 0xf7 30 | #define PORT_DATA_VALUE_LOCK 0x00 31 | #define PORT_DATA_VALUE_UNLOCK 0x77 32 | 33 | #endif 34 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2021 crito 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in all 11 | copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | SOFTWARE. 20 | -------------------------------------------------------------------------------- /src/yoga-bios-unlock.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | #include 9 | #include 10 | 11 | #include "yoga.h" 12 | 13 | #define DMI_PATH "/sys/class/dmi/id" 14 | 15 | enum { 16 | MODE_RESERVED = 0, 17 | MODE_READ = 1, 18 | MODE_UNLOCK = 2, 19 | MODE_LOCK = 3 20 | } runmodes; 21 | 22 | int check_dmi(const char *file, char *value, uint8_t dmi_workaround); 23 | int is_yoga(void); 24 | int read_sysfs(const char *file, char *buffer, size_t n); 25 | 26 | int check_dmi(const char *file, char *value, uint8_t dmi_workaround) { 27 | size_t l = 128; 28 | char buffer[l]; 29 | 30 | memset(buffer, 0, 128); 31 | if (read_sysfs(file, buffer, l) < 0) { 32 | fprintf(stderr, "cannot read %s/%s\n", DMI_PATH, file); 33 | return -1; 34 | } 35 | 36 | // some notebooks return trailing trash in board_version string 37 | // compare on best guess seems fair enough 38 | if (dmi_workaround == 1) { 39 | if (memcmp(value, buffer, strlen(value)) == 0) 40 | return 0; 41 | } else { 42 | if (strcmp(value, buffer) == 0) 43 | return 0; 44 | } 45 | 46 | return -2; 47 | } 48 | 49 | int is_yoga(void) { 50 | int chk = 0; 51 | unsigned int i = 0; 52 | char bios_version[BIOS_VERSION_LEN + 1]; 53 | char board_version[BOARD_VERSION_LEN + 3]; 54 | 55 | if (check_dmi("bios_vendor", BIOS_VENDOR, 0) < 0) { 56 | fprintf(stderr, "bios vendor does not match\n"); 57 | return -1; 58 | } 59 | if (check_dmi("board_vendor", BOARD_VENDOR, 0) < 0) { 60 | fprintf(stderr, "board vendor does not match\n"); 61 | return -2; 62 | } 63 | if (check_dmi("board_name", BOARD_NAME, 0) < 0) { 64 | fprintf(stderr, "board name does not match\n"); 65 | return -3; 66 | } 67 | if (check_dmi("chassis_version", CHASSIS_VERSION, 0) < 0 && check_dmi("chassis_version", CHASSIS_VERSION_CN, 0) < 0) { 68 | fprintf(stderr, "chassis version does not match\n"); 69 | return -4; 70 | } 71 | 72 | for (i = 0; i < bios_versions_len; i += (BIOS_VERSION_LEN + 1)) { 73 | memset(&bios_version, 0, sizeof(char) * (BIOS_VERSION_LEN + 1)); 74 | memcpy(&bios_version, &bios_versions[i], sizeof(char) * BIOS_VERSION_LEN); 75 | chk = check_dmi("bios_version", bios_version, 0); 76 | if (chk == 0) 77 | break; 78 | } 79 | 80 | if (chk < 0) { 81 | fprintf(stderr, "bios version does not match\n"); 82 | return -5; 83 | } 84 | 85 | for (i = 0; i < board_versions_len; i += (BOARD_VERSION_LEN + 1)) { 86 | memset(&board_version, 0, sizeof(char) * (BOARD_VERSION_LEN + 3)); 87 | memcpy(&board_version, &board_versions[i], sizeof(char) * BOARD_VERSION_LEN); 88 | // all known boards are postfixed with two whitespaces 89 | // auto appending them seems better than dealing with them in 90 | // board_version.txt as long as no board proofs me wrong 91 | board_version[14] = ' '; 92 | board_version[15] = ' '; 93 | chk = check_dmi("board_version", board_version, 1); 94 | if (chk == 0) 95 | break; 96 | } 97 | 98 | if (chk < 0) { 99 | fprintf(stderr, "board version does not match\n"); 100 | return -6; 101 | } 102 | 103 | return 0; 104 | } 105 | 106 | int read_sysfs(const char *file, char *buffer, size_t n) { 107 | size_t l = strlen(DMI_PATH) + strlen(file) + 2; 108 | char filename[l]; 109 | FILE *fd; 110 | size_t c; 111 | 112 | memset(filename, 0, l); 113 | snprintf(filename, l, "%s/%s", DMI_PATH, file); 114 | fd = fopen(filename, "r"); 115 | if (fd == NULL) 116 | return -1; 117 | 118 | if ((c = fread(buffer, 1, n, fd)) != n) { 119 | if (feof(fd) == 0) { 120 | fclose(fd); 121 | return -2; 122 | } 123 | } 124 | 125 | buffer[c - 1] = '\0'; 126 | fclose(fd); 127 | return 0; 128 | } 129 | 130 | int main(int argc, const char *argv[]) { 131 | char ack; 132 | // 0 = reserved, 1 = read, 2 = unlock, 3 = lock 133 | uint8_t mode = MODE_RESERVED; 134 | uint8_t force = 0; 135 | unsigned char cache; 136 | 137 | if (argc < 2 || argc > 3) { 138 | fprintf(stdout, "USAGE: %s [-r|--read] [-u|--unlock] [-l|--lock] [-f|--force]\n", argv[0]); 139 | return EXIT_FAILURE; 140 | } 141 | 142 | if ((strcmp(argv[1], "--read") == 0 || strcmp(argv[1], "-r") == 0)) { 143 | fprintf(stdout, "Run in read mode\n"); 144 | fprintf(stdout, "Be aware that readmode temporarily changes value of port 0x%02x to index 0x%02x\n", 145 | PORT_INDEX, PORT_INDEX_VALUE); 146 | mode = MODE_READ; 147 | } 148 | 149 | if ((strcmp(argv[1], "--unlock") == 0 || strcmp(argv[1], "-u") == 0)) { 150 | fprintf(stdout, "Run in unlock mode\n"); 151 | mode = MODE_UNLOCK; 152 | } 153 | 154 | if ((strcmp(argv[1], "--lock") == 0 || strcmp(argv[1], "-l") == 0)) { 155 | fprintf(stdout, "Run in lock mode\n"); 156 | mode = MODE_LOCK; 157 | } 158 | 159 | if (argc == 3) { 160 | if ((strcmp(argv[2], "--force") == 0 || strcmp(argv[2], "-f") == 0)) { 161 | fprintf(stdout, "Platform checks are disabled - hopefully you know what you do\n"); 162 | force = 1; 163 | } 164 | } 165 | 166 | if (is_yoga() < 0 && force == 0) { 167 | fprintf(stderr, "Wrong device, aborting!\n"); 168 | return EXIT_FAILURE; 169 | } 170 | 171 | if (geteuid() != 0) { 172 | fprintf(stderr, "Requires root privileges!\n"); 173 | return EXIT_FAILURE; 174 | } 175 | 176 | fprintf(stdout, "WARNING: use at your own risk!\n"); 177 | fprintf(stdout, "Agree? (y/n) "); 178 | if (scanf("%1s", &ack) != 1) { 179 | fprintf(stderr, "Can't read from stdin\n"); 180 | return EXIT_FAILURE; 181 | } 182 | 183 | if (ack != 'y' && ack != 'Y') { 184 | fprintf(stdout, "nothing to do here\n"); 185 | return EXIT_SUCCESS; 186 | } 187 | 188 | if (iopl(3) < 0) { 189 | fprintf(stderr, "Can't set I/O privilege level (%s)\n", strerror(errno)); 190 | fprintf(stderr, "Please try again after disable secure boot temporarily!\n"); 191 | return EXIT_FAILURE; 192 | } 193 | 194 | if (ioperm(PORT_INDEX, 2, 1) < 0) { 195 | fprintf(stderr, "Can't set I/O permission (%s)\n", strerror(errno)); 196 | return EXIT_FAILURE; 197 | } 198 | 199 | cache = inb_p(PORT_INDEX); 200 | fprintf(stdout, "Port 0x%02x is 0x%02x and will be set to 0x%02x\n", 201 | PORT_INDEX, cache, PORT_INDEX_VALUE); 202 | outb_p(PORT_INDEX_VALUE, PORT_INDEX); 203 | 204 | switch (mode) { 205 | case MODE_READ: 206 | fprintf(stdout, "Port 0x%02x is 0x%02x\n", 207 | PORT_DATA, inb_p(PORT_DATA)); 208 | break; 209 | case MODE_UNLOCK: 210 | outb_p(PORT_DATA_VALUE_UNLOCK, PORT_DATA); 211 | break; 212 | case MODE_LOCK: 213 | outb_p(PORT_DATA_VALUE_LOCK, PORT_DATA); 214 | break; 215 | } 216 | 217 | outb_p(cache, PORT_INDEX); 218 | 219 | return EXIT_SUCCESS; 220 | } 221 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # yoga-bios-unlock 2 | 3 | Based on FlyGoat's work to unlock the BIOS advanced menu documented [here](https://zhuanlan.zhihu.com/p/184982689), 4 | I wrote that tool to unlock my yoga laptop without using a proprietary software which is only available on Windows. 5 | 6 | I'd like to thank FlyGoat a lot for giving me the right direction on how to translate his guide into low-level functions 7 | provided by glibc (see also [FlyGoats gist](https://gist.github.com/FlyGoat/5f0dba5b5ccc1b6ab73023489e1e989a)). 8 | 9 | This tool will unlock the advanced menu in your Lenovo Yoga Slim 7 14ARE05. 10 | 11 | To unlock the advanced menu it's necessary to change the data field on port `0x73` at index `0xf7`. 12 | Port `0x72` is the index port that defines which value at `0x73` will be accessed. 13 | 14 | \/ 15 | | 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 16 | ---+------------------------------------------------ 17 | 00 | 21 bc 21 63 00 00 5a a5 18 70 f6 7c 00 f5 19 00 18 | 10 | 80 00 a6 20 00 44 00 02 00 00 94 80 89 00 e0 49 19 | 20 | 00 0d 04 30 21 00 24 00 00 10 00 04 00 00 04 ec 20 | 30 | 55 55 55 55 ff 07 00 20 29 00 8c 00 0a a8 00 08 21 | 40 | f4 00 00 00 01 20 01 01 08 00 00 00 10 11 00 00 22 | 50 | 00 00 80 00 00 00 41 00 00 00 00 00 ff 07 00 00 23 | 60 | 00 00 00 00 00 10 00 20 02 00 00 00 00 00 00 00 24 | 70 | 00 00 00 00 08 01 08 00 00 00 00 00 86 22 00 00 25 | 80 | c0 0c 00 80 09 52 00 00 00 00 00 00 00 00 00 00 26 | 90 | 00 00 00 00 08 00 00 80 00 00 04 40 00 80 00 00 27 | a0 | 00 00 00 00 00 00 00 00 20 40 00 00 20 00 01 00 28 | b0 | 00 00 08 20 00 00 40 00 00 00 00 00 00 42 00 00 29 | c0 | 02 02 00 00 00 40 00 00 00 00 80 80 00 00 00 40 30 | d0 | 00 40 14 00 02 00 82 00 00 00 00 80 81 08 00 80 31 | e0 | 00 02 00 01 00 00 00 00 00 00 00 00 00 00 01 00 32 | > f0 | 29 a4 a7 a7 00 00 00 77 e0 00 24 04 00 10 10 00 33 | /\ 34 | 35 | ## Disclaimer 36 | 37 | > This tool may eat your cat, burn your house or do anything else beside the expected task. 38 | > So use it at your own risk and be aware that you're playing around with your BIOS which may end in a bricked device. 39 | 40 | ## Compatibility 41 | 42 | | Version | Missing features | 43 | | -------- | ------------------- | 44 | | DMCN27WW | | 45 | | DMCN29WW | | 46 | | DMCN32WW | | 47 | | DMCN34WW | no XFR enhancements | 48 | | DMCN35WW | no XFR enhancements | 49 | | DMCN36WW | no XFR enhancements | 50 | | DMCN38WW | no XFR enhancements | 51 | | DMCN39WW | no XFR enhancements | 52 | | DMCN41WW | no XFR enhancements | 53 | | DMCN44WW | no XFR enhancements | 54 | 55 | If you're aware of any further differences in BIOS version please raise a [ticket](https://github.com/esno/yoga-bios-unlock/issues/new) 56 | or open a pull request. 57 | 58 | ### BIOS downgrade 59 | 60 | Boot into BIOS and go to `Configuration` tab. 61 | There is an option called `BIOS Back Flash` which is disabled by default. 62 | 63 | The product page of [lenovo's Yoga Slim 7](https://pcsupport.lenovo.com/de/de/products/laptops-and-netbooks/ideapad-s-series-netbooks/slim-7-14are05/downloads/driver-list/component?name=BIOS) 64 | provides the latest BIOS version. Thanks to lenovo they do not obfuscate their download links therefore 65 | it's quiet easy to estimate former versions and download them. 66 | 67 | Former BIOS versions are available at lenovo servers (Readme and installation instructions are also available): 68 | 69 | * [DMCN27WW](https://download.lenovo.com/consumer/mobiles/dmcn27ww.exe) ([ReadMe](https://download.lenovo.com/consumer/mobiles/dmcn27ww.txt)) 70 | * [DMCN29WW](https://download.lenovo.com/consumer/mobiles/dmcn29ww.exe) ([ReadMe](https://download.lenovo.com/consumer/mobiles/dmcn29ww.txt)) 71 | * [DMCN32WW](https://download.lenovo.com/consumer/mobiles/dmcn32ww.exe) ([ReadMe](https://download.lenovo.com/consumer/mobiles/dmcn32ww.txt)) 72 | * [DMCN34WW](https://download.lenovo.com/consumer/mobiles/dmcn34ww.exe) ([ReadMe](https://download.lenovo.com/consumer/mobiles/dmcn34ww.txt)) 73 | * [DMCN35WW](https://download.lenovo.com/consumer/mobiles/dmcn35ww.exe) ([ReadMe](https://download.lenovo.com/consumer/mobiles/dmcn35ww.txt)) 74 | * [DMCN36WW](https://download.lenovo.com/consumer/mobiles/dmcn36ww.exe) ([ReadMe](https://download.lenovo.com/consumer/mobiles/dmcn36ww.txt)) 75 | * [DMCN38WW](https://download.lenovo.com/consumer/mobiles/dmcn38ww.exe) ([ReadMe](https://download.lenovo.com/consumer/mobiles/dmcn38ww.txt)) 76 | * [DMCN39WW](https://download.lenovo.com/consumer/mobiles/dmcn39ww.exe) ([ReadMe](https://download.lenovo.com/consumer/mobiles/dmcn39ww.txt)) 77 | * [DMCN41WW](https://download.lenovo.com/consumer/mobiles/dmcn41ww.exe) ([ReadMe](https://download.lenovo.com/consumer/mobiles/dmcn41ww.txt)) 78 | * [DMCN44WW](https://download.lenovo.com/consumer/mobiles/dmcn44ww.exe) ([ReadMe](https://download.lenovo.com/consumer/mobiles/dmcn44ww.txt)) 79 | 80 | ## Known Issues 81 | 82 | If you hit the following issue please disable secure boot first and try again: 83 | 84 | Can't set I/O privilege level (Operation not permitted) 85 | 86 | ## Usage 87 | 88 | > BIOS versions greater or equal to `DMCN34WW` are supported but hiding some menus. 89 | > Using `DMCN32WW` is recommended. 90 | 91 | ### Build from source 92 | 93 | git clone https://github.com/esno/yoga-bios-unlock.git 94 | cd ./yoga-bios-unlock 95 | make 96 | 97 | #### Add new bios/board versions 98 | 99 | New supported bios and board versions can be added by appending the version string either to [bios-versions.txt](https://github.com/esno/yoga-bios-unlock/blob/master/bios-versions.txt) 100 | or to [board-versions.txt](https://github.com/esno/yoga-bios-unlock/blob/master/board-versions.txt). 101 | Afterwards the headers needs to be regenerated with 102 | 103 | make headers 104 | 105 | ### Verify current value of data port 106 | 107 | # ./yoga-bios-unlock --read 108 | Run in read mode 109 | Be aware that readmode temporarily changes value of port 0x72 to index 0xf7 110 | WARNING: use at your own risk! 111 | Agree? (y/n) y 112 | Port 0x72 is 0xf4 and will be set to 0xf7 113 | Port 0x73 is 0x00 and would be set to 0x77 114 | 115 | ### Unlock your BIOS 116 | 117 | # ./yoga-bios-unlock --unlock 118 | Run in unlock mode 119 | WARNING: use at your own risk! 120 | Agree? (y/n) y 121 | Port 0x72 is 0xf4 and will be set to 0xf7 122 | 123 | ### Lock your BIOS 124 | 125 | # ./yoga-bios-unlock --lock 126 | Run in lock mode 127 | WARNING: use at your own risk! 128 | Agree? (y/n) y 129 | Port 0x72 is 0xf4 and will be set to 0xf7 130 | 131 | ### Ignore platform check results 132 | 133 | If you know that you're on Lenovo Yoga Slim 7 (14ARE05) but either board version might differ 134 | or BIOS version is currently not supported by this tool you can enforce an unlock. 135 | If you do please open a ticket/PR to notify me that your current BIOS version/board version works well. 136 | 137 | #### Enforce unlock your BIOS 138 | 139 | # ./yoga-bios-unlock --unlock --force 140 | Run in unlock mode 141 | Platform checks are disabled - hopefully you know what you do 142 | WARNING: use at your own risk! 143 | Agree? (y/n) y 144 | Port 0x72 is 0xf4 and will be set to 0xf7 145 | --------------------------------------------------------------------------------