diff options
Diffstat (limited to 'qemu/roms/sgabios/csum8.c')
-rw-r--r-- | qemu/roms/sgabios/csum8.c | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/qemu/roms/sgabios/csum8.c b/qemu/roms/sgabios/csum8.c new file mode 100644 index 000000000..69629139c --- /dev/null +++ b/qemu/roms/sgabios/csum8.c @@ -0,0 +1,64 @@ +/* + * Copyright 2010 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * compute rom checksum byte + */ + +#include <stdio.h> +#include <unistd.h> +#include <stdlib.h> +#include <fcntl.h> +#include <sys/types.h> + +#define MAX_SIZE 65536 +unsigned char buf[MAX_SIZE]; + +int main(int argc, char **argv) +{ + ssize_t fsize; + int i, sum, fd; + unsigned char csum; + + if (argc < 2) { + fprintf(stderr, "usage: %s filename\n", argv[0]); + exit(1); + } + if ((fd = open(argv[1], O_RDWR)) < 0) { + perror(argv[1]); + exit(1); + } + if ((fsize = read(fd, buf, MAX_SIZE)) < 0) { + perror(argv[1]); + exit(1); + } + if (fsize >= MAX_SIZE && read(fd, &buf[MAX_SIZE - 1], 1) > 0) { + fprintf(stderr, "FAIL: %s is larger than %d bytes\n", argv[1], MAX_SIZE); + exit(1); + } + i = fsize - 2048 * (fsize / 2048); + if (i != 2047) { + fprintf(stderr, "FAIL: %s is %zd bytes, need 2K pad-1\n", argv[1], fsize); + exit(1); + } + for (i = sum = 0; i < fsize; i++) { + sum += buf[i]; + } + sum &= 0xff; + csum = -sum & 0xff; + write(fd, &csum, 1); + close(fd); + fprintf(stderr, "%s: sum = 0x%02x, wrote byte 0x%02x\n", argv[1], sum, csum); + return 0; +} |