From 651feb717ce36545bf5e1b0d97a6ca59b206e3ad Mon Sep 17 00:00:00 2001 From: Xilin Wu Date: Thu, 12 May 2022 16:26:29 +0800 Subject: [PATCH] Add SOSI addr patcher --- bin/sosi-patcher-arm64 | Bin 0 -> 13968 bytes bin/sosi-patcher-x64 | Bin 0 -> 17440 bytes bin/sosi-patcher.c | 126 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 126 insertions(+) create mode 100755 bin/sosi-patcher-arm64 create mode 100755 bin/sosi-patcher-x64 create mode 100755 bin/sosi-patcher.c diff --git a/bin/sosi-patcher-arm64 b/bin/sosi-patcher-arm64 new file mode 100755 index 0000000000000000000000000000000000000000..8ec4118f7aafa92c217538eeb17d9377280f8034 GIT binary patch literal 13968 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 literal 0 HcmV?d00001 diff --git a/bin/sosi-patcher-x64 b/bin/sosi-patcher-x64 new file mode 100755 index 0000000000000000000000000000000000000000..732223ab3da4e4740c1ea60fd3ee60d292c83272 GIT binary patch literal 17440 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 jq8z)jRKHX7-~pw}Bjk3Kl +#include +#include +#include +#include +#include +#include +#include +#include +#include +struct acpi_header{ + uint32_t sign; + uint32_t len; + uint8_t rev; + uint8_t checksum; + char oemid[6]; + char oemtableid[8]; + uint32_t oemrev; + uint32_t creatorid; + uint32_t creatorrev; +}; +int main(int argc,char**argv){ + if(argc!=4){ + fprintf(stderr,"Usage: sosi-patcher \n"); + return 1; + } + char*es=NULL; + uint64_t val=(uint64_t)strtoll(argv[3],&es,0); + if(errno!=0||es==argv[3]){ + perror("invalid value"); + return 1; + } + printf("target value: 0x%016lX\n",val); + printf("input file: %s\n",argv[1]); + printf("output file: %s\n",argv[2]); + int fdin=open(argv[1],O_RDONLY); + if(fdin<0){ + perror("open input failed"); + return 1; + } + int fdout=open(argv[2],O_RDWR|O_CREAT|O_TRUNC,0644); + if(fdout<0){ + perror("open output failed"); + close(fdin); + return 1; + } + struct stat st; + if(fstat(fdin,&st)<0){ + perror("fstat failed"); + close(fdin); + close(fdout); + return 1; + } + if(st.st_size<=16){ + fprintf(stderr,"input file too small\n"); + close(fdin); + close(fdout); + return 1; + } + printf("file size: %zu bytes\n",st.st_size); + ssize_t r=sendfile(fdout,fdin,0,st.st_size); + if(r<0||(size_t)r!=(size_t)st.st_size){ + perror("sendfile failed"); + close(fdin); + close(fdout); + return 1; + } + fdatasync(fdout); + void*addr=mmap(NULL,st.st_size,PROT_READ|PROT_WRITE,MAP_SHARED,fdout,0); + if(addr==MAP_FAILED||!addr){ + perror("mmap failed"); + close(fdin); + close(fdout); + return 1; + } + struct acpi_header*header=addr; + char*pos=addr,oldsum=header->checksum,sum=0; + uint32_t size=header->len; + printf( + "acpi sign: \"%.*s\"\n", + (int)sizeof(header->sign),(char*)&header->sign + ); + printf("acpi rev: 0x%08x\n",header->rev); + printf("acpi len: %d bytes\n",size); + printf("acpi checksum: %02X\n",oldsum); + printf( + "acpi oem id: \"%.*s\" tableid: \"%.*s\" rev: 0x%08x\n", + (int)sizeof(header->oemid),header->oemid, + (int)sizeof(header->oemtableid),header->oemtableid, + header->oemrev + ); + printf( + "acpi creator id: \"%.*s\" rev: 0x%08x\n", + (int)sizeof(header->creatorid),(char*)&header->creatorid, + header->creatorrev + ); + header->checksum=0; + while((size--)!=0)sum=(uint8_t)(sum+(*pos++)); + sum=(uint8_t)(0xFF-sum+1); + printf("current checksum: %02X\n",sum); + if(header->len!=st.st_size) + printf("warning: acpi length mismatch\n"); + if(sum!=oldsum) + printf("warning: acpi checksum mismatch\n"); + pos=addr; + for(size_t s=0;s<(size_t)st.st_size-16;s++,pos++){ + if(strncmp(pos,"SOSI",4)!=0)continue; + printf("found SOSI at 0x%08zX\n",s); + uint64_t*value=(uint64_t*)&pos[5]; + printf("old value: 0x%016lx\n",*value); + *value=val; + printf("new value: 0x%016lx\n",*value); + break; + } + pos=addr,size=header->len,header->checksum=0; + while((size--)!=0)sum=(uint8_t)(sum+(*pos++)); + sum=(uint8_t)(0xFF-sum+1); + printf("new checksum: %02X\n",sum); + header->checksum=sum; + munmap(addr,st.st_size); + fdatasync(fdout); + close(fdin); + close(fdout); + printf("done\n"); + return 0; +} -- 2.45.2