diff options
author | Yang Zhang <yang.z.zhang@intel.com> | 2015-08-28 09:58:54 +0800 |
---|---|---|
committer | Yang Zhang <yang.z.zhang@intel.com> | 2015-09-01 12:44:00 +0800 |
commit | e44e3482bdb4d0ebde2d8b41830ac2cdb07948fb (patch) | |
tree | 66b09f592c55df2878107a468a91d21506104d3f /qemu/roms/sgabios/csum8.c | |
parent | 9ca8dbcc65cfc63d6f5ef3312a33184e1d726e00 (diff) |
Add qemu 2.4.0
Change-Id: Ic99cbad4b61f8b127b7dc74d04576c0bcbaaf4f5
Signed-off-by: Yang Zhang <yang.z.zhang@intel.com>
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; +} |