Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:magist3r:patches-leap-42.3
grub
thecus-grub.diff
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File thecus-grub.diff of Package grub
diff -ru grub-0.97/configure grub-0.97-thecus/configure --- grub-0.97/configure 2005-05-08 08:48:12.000000000 +0600 +++ grub-0.97-thecus/configure 2016-09-02 15:01:50.000000000 +0500 @@ -3891,7 +3891,7 @@ { (exit 1); exit 1; }; } fi grub_cv_prog_objcopy_absolute=yes -for link_addr in 2000 8000 7C00; do +for link_addr in 0x2000 0x8000 0x7C00; do if { ac_try='${CC-cc} ${CFLAGS} -nostdlib -Wl,-N -Wl,-Ttext -Wl,$link_addr conftest.o -o conftest.exec' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 @@ -3903,7 +3903,7 @@ echo "$as_me: error: ${CC-cc} cannot link at address $link_addr" >&2;} { (exit 1); exit 1; }; } fi - if { ac_try='${OBJCOPY-objcopy} -O binary conftest.exec conftest' + if { ac_try='${OBJCOPY-objcopy} --only-section=.text -O binary conftest.exec conftest' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? diff -ru grub-0.97/stage2/bios.c grub-0.97-thecus/stage2/bios.c --- grub-0.97/stage2/bios.c 2004-03-27 21:34:04.000000000 +0500 +++ grub-0.97-thecus/stage2/bios.c 2010-08-26 12:32:57.000000000 +0600 @@ -83,6 +83,7 @@ err = biosdisk_int13_extensions ((read + 0x42) << 8, drive, &dap); /* #undef NO_INT13_FALLBACK */ +#define NO_INT13_FALLBACK #ifndef NO_INT13_FALLBACK if (err) { diff -ru grub-0.97/stage2/builtins.c grub-0.97-thecus/stage2/builtins.c --- grub-0.97/stage2/builtins.c 2005-02-16 02:58:23.000000000 +0500 +++ grub-0.97-thecus/stage2/builtins.c 2012-05-16 09:58:43.000000000 +0600 @@ -949,6 +949,136 @@ " machine is, including all regions of physical RAM installed." }; +static int +dual_dom_set_flag (char dom_disk, char *flag) +{ + char *dummy = (char *) RAW_ADDR (0x100000); + int start_sector; + int num_sectors = 0; + int num_entries = 0; + int last_length = 0; + char ddflag_file[32]={0}; + char buf[512]={0}; + + grub_memset(buf,'0',512); + + if('a'==dom_disk) + sprintf(ddflag_file, "%s", "(hd0,1)/dual_dom"); + else + sprintf(ddflag_file, "%s", "(hd1,1)/dual_dom"); + + buf[0]=flag[0]; + buf[1]=flag[1]; + + auto void disk_read_blocklist_func (int sector, int offset, int length); + + /* collect contiguous blocks into one entry as many as possible, + and print the blocklist notation on the screen. */ + auto void disk_read_blocklist_func (int sector, int offset, int length) + { + if (num_sectors > 0) + { + if (start_sector + num_sectors == sector + && offset == 0 && last_length == SECTOR_SIZE) + { + num_sectors++; + last_length = length; + return; + } + else + { + if (last_length == SECTOR_SIZE) + grub_printf ("%s%d+%d", num_entries ? "," : "", + start_sector - part_start, num_sectors); + else if (num_sectors > 1) + grub_printf ("%s%d+%d,%d[0-%d]", num_entries ? "," : "", + start_sector - part_start, num_sectors-1, + start_sector + num_sectors-1 - part_start, + last_length); + else + grub_printf ("%s%d[0-%d]", num_entries ? "," : "", + start_sector - part_start, last_length); + num_entries++; + num_sectors = 0; + } + } + + if (offset > 0) + { + grub_printf("%s%d[%d-%d]", num_entries ? "," : "", + sector-part_start, offset, offset+length); + num_entries++; + } + else + { + start_sector = sector; + num_sectors = 1; + last_length = length; + } + } + + /* open the file. */ + if (! grub_open (ddflag_file)) + return 1; + + /* print the device name. */ + grub_printf ("(%cd%d", + (current_drive & 0x80) ? 'h' : 'f', + current_drive & ~0x80); + + if ((current_partition & 0xff0000) != 0xff0000) + grub_printf (",%d", (current_partition >> 16) & 0xff); + + if ((current_partition & 0x00ff00) != 0x00ff00) + grub_printf (",%c", 'a' + ((current_partition >> 8) & 0xff)); + + grub_printf (")"); + + /* read in the whole file to dummy. */ + disk_read_hook = disk_read_blocklist_func; + if (! grub_read (dummy, -1)) + goto fail; + + /* the last entry may not be printed yet. don't check if it is a + * full sector, since it doesn't matter if we read too much. */ + if (num_sectors > 0) + devwrite(start_sector - part_start, 1, (char *)buf); + + grub_printf ("\n"); + + fail: + disk_read_hook = 0; + grub_close (); + return errnum; +} + +static int +ddflag_func (char *arg, int flags) +{ + int ret=0; + char dom_disk='b'; + char *cmd= NULL; + + cmd=arg; + + if('a'==cmd[0]) + dom_disk='a'; + + cmd=skip_to(0, cmd); + + ret=dual_dom_set_flag(dom_disk, cmd); + return 0; + +} + +static struct builtin builtin_ddflag = +{ + "ddflag", + ddflag_func, + BUILTIN_CMDLINE | BUILTIN_HELP_LIST, + "ddflag", + "set dual dom flag" +}; /* dump FROM TO */ #ifdef GRUB_UTIL @@ -2323,6 +2453,218 @@ "Probe I/O ports used for the drive DRIVE." }; +int compare_dom_checksum(char *pOffset) +{ + char domb_filename[40] = "(hd1,2)/n5200fs.gz"; + int dev_count=2; //DOMA and DOMB + static char *devname[3]={ + "hd0", + "hd1" + }; + int file_count=2; + static char *filename[2]={ + "ramdisk", + "bzImage" + }; + + char vDomFlag[8]={0}; + char vFlag[8]={0}; + char vDirtyFlag=0; + char vFactoryFlag=0; + char chkdev[4]; + char *filepath[40],*sumpath[40],realchecksum[20]; + + char vSw=0; + char vHaveSecDom=0; + + int bufsize=4096,checksum_count=0; + unsigned char chksumbuf[bufsize]; + + int c,y,x; + int filesize=0,readsize=0; + unsigned int carrysum=0,sum=0,tmp=0; + unsigned char sumchar[20]; + + grub_memset(chkdev,0,sizeof(chkdev)); + switch (current_drive){ + case 0x80: + grub_strcpy(chkdev,devname[0]); + break; + case 0x81: + grub_strcpy(chkdev,devname[1]); + break; + default: + return 1; + break; + } + + //grub_printf("current drive = %x, dev = %s, filename = %s\n",current_drive,chkdev,filename[3]); + + for(y=0;y<dev_count;y++){ + checksum_count=0; + for(c=0;c<file_count;c++){ + grub_memset(filepath,0,sizeof(filepath)); + grub_sprintf (filepath, "(%s,%s)/boot/%s",devname[y],"0",filename[c]); + grub_sprintf (sumpath, "(%s,%s)/boot/%s.sum",devname[y],"0",filename[c]); + + grub_printf("path = %s, c=%d\n",filepath, c); + //if (grub_open("(hd0,2)/mod_2.6.rom")){ + if (grub_open(filepath)){ + filesize=filemax; + + //grub_memset(chksumbuf,0,sizeof(chksumbuf)); + sum=0; + carrysum=0; + while(filesize>0){ + if(filesize>=bufsize){ + readsize=bufsize; + }else{ + readsize=filesize; + } + //grub_printf("readsize = %d, ",readsize); + grub_memset(chksumbuf,0,sizeof(chksumbuf)); + grub_read(chksumbuf,readsize); + tmp=0; + for (x=0;x<readsize;x++){ + sum += chksumbuf[x]; + tmp += chksumbuf[x]; + + if (sum > 1000000000){ + carrysum=carrysum+1; + sum=sum-1000000000; + tmp=tmp-1000000000; + } + } + //grub_printf("tmp = %d, ",tmp); + //grub_printf("sum = %d, ",sum); + filesize-=readsize; + //grub_printf("file size = %d\n",filesize); + } + grub_memset(sumchar,0,sizeof(sumchar)); + + if (carrysum==0) + grub_sprintf(sumchar,"%d",sum); + else{ + char d[10]="000000000"; + grub_sprintf(sumchar,"%d",sum); + grub_memset(d+(9-grub_strlen(sumchar)),0,sizeof(d)-(9-grub_strlen(sumchar))); + + grub_memset(sumchar,0,sizeof(sumchar)); + grub_sprintf(sumchar,"%d%s%d",carrysum,d,sum); + } + + grub_printf("file size = %d, total sum = %s,length = %d\n ",filemax,sumchar,grub_strlen(sumchar)); + grub_close(); + + char c[20]; + if(grub_open(sumpath)){ + grub_memset(c,0,sizeof(c)); + while(grub_read(&c,grub_strlen(sumchar))){ + grub_printf("y=%d, str = %s, sum=%s\n",y,c,sumchar); + if(grub_strcmp(sumchar,c)){ + //Checksum is different + //grub_printf("not the same\n"); + if(y != 0){ + grub_printf("DOMA and DOMB Checksum failed!\n"); + grub_printf("DOM have problem, force boot from DOMA\n"); + grub_close(); + *pOffset=0; //ramdisk & bzImage checksum failed, force to boot from DOM-A + return 0; + } + }else{ + checksum_count++; + //grub_printf("str = %s\n",c,sumpath); + grub_close(); + break; + //grub_printf("the same\n"); + } + } + }else{ + //for N16000 version-1 grub, there are not checksum files + //if DOM A failed, we will boot from DOM B without checking checksum + if(y != 0){ + grub_close(); + *pOffset=1; //boot from DOM-B + return 0; + } + } + }else{ + if(y != 0){ + grub_printf("Find second DOM fail!\n"); + grub_printf("DOM have problem, not boot\n"); + grub_close(); + *pOffset=0; //open dom-b ramdisk & bzImage failed, force to boot from DOM-A + return 0; + }else{ + grub_printf("File is not exist! DOMA fail!\n"); + grub_close(); + break; + } + } + } + //grub_printf("checksum success count = %d\n",checksum_count); + if(checksum_count==file_count){ + if(y==0){ + grub_printf("Boot from DOMA\n"); + *pOffset=0; + return 0; + }else{ + grub_printf("Boot from DOMB\n"); + *pOffset=1; + return 0; + } + } + } + grub_printf("DOM have problem, force boot from DOMA\n"); + *pOffset=0; + return 0; +} + +int grub_dual_dom_check(char *pOffset) +{ + char dom_flag_filename[18] = "(hd1,1)/dual_dom"; + char vDomFlag[8]={0}; + char vFlag[8]={0}; + char vDirtyFlag=0; + char vFactoryFlag=0; + char vSw=0; + + *pOffset=0; + + if (! grub_open (dom_flag_filename)) + { + grub_printf("open dom_flag fail!!\n"); + *pOffset=0; + grub_close(); + return 1; + } + + grub_read ((char *)vFlag, 2); + vDirtyFlag = vFlag[0]; + vFactoryFlag = vFlag[1]; + grub_printf("grub_dual_dom_check - dirtyflag %c, factoryflag %c\n", vDirtyFlag, vFactoryFlag); + grub_close (); + +// get flag form dom + if('0' <= vDirtyFlag && '2' > vDirtyFlag) + { + vDomFlag[0]=vDirtyFlag + 1; + vDomFlag[1]=vFactoryFlag; + dual_dom_set_flag('b', (char *)vDomFlag); + *pOffset=0; + return 0; + } + else + { + vDomFlag[0]='0'; + vDomFlag[1]=vFactoryFlag; + dual_dom_set_flag('b', (char *)vDomFlag); + *pOffset=1; + return 0; + } + + return 0; +} /* kernel */ static int @@ -4805,6 +5147,7 @@ &builtin_cmp, &builtin_color, &builtin_configfile, + &builtin_ddflag, &builtin_debug, &builtin_default, #ifdef GRUB_UTIL diff -ru grub-0.97/stage2/disk_io.c grub-0.97-thecus/stage2/disk_io.c --- grub-0.97/stage2/disk_io.c 2004-05-23 22:35:24.000000000 +0600 +++ grub-0.97-thecus/stage2/disk_io.c 2010-10-22 08:56:31.000000000 +0600 @@ -154,7 +154,7 @@ * Check track buffer. If it isn't valid or it is from the * wrong disk, then reset the disk geometry. */ - if (buf_drive != drive) + if ((buf_drive != drive) || (buf_geom.sectors==0)) { if (get_diskinfo (drive, &buf_geom)) { diff -ru grub-0.97/stage2/gunzip.c grub-0.97-thecus/stage2/gunzip.c --- grub-0.97/stage2/gunzip.c 2003-07-09 17:45:53.000000000 +0600 +++ grub-0.97-thecus/stage2/gunzip.c 2011-05-02 14:20:20.000000000 +0600 @@ -130,7 +130,7 @@ #include "filesys.h" /* so we can disable decompression */ -int no_decompression = 0; +int no_decompression = 1; /* used to tell if "read" should be redirected to "gunzip_read" */ int compressed_file; diff -ru grub-0.97/stage2/shared.h grub-0.97-thecus/stage2/shared.h --- grub-0.97/stage2/shared.h 2004-06-19 22:40:09.000000000 +0600 +++ grub-0.97-thecus/stage2/shared.h 2010-08-26 12:32:57.000000000 +0600 @@ -991,6 +991,11 @@ void init_bios_info (void); +// ******* Doria Start ******* +int grub_dual_dom_check(char *pOffset); + +// ******* Doria end ******* + #endif /* ASM_FILE */ #endif /* ! GRUB_SHARED_HEADER */ diff -ru grub-0.97/stage2/stage2.c grub-0.97-thecus/stage2/stage2.c --- grub-0.97/stage2/stage2.c 2005-03-19 22:51:57.000000000 +0500 +++ grub-0.97-thecus/stage2/stage2.c 2011-05-02 14:20:20.000000000 +0600 @@ -1560,12 +1560,22 @@ } else { + char vOffset=0; + + //grub_dual_dom_check(&vOffset); + compare_dom_checksum(&vOffset); + //grub_printf("offset = %d\n",vOffset); + + if(vOffset >= 2){ + return 0; + } + if (*graphics_file && !password && show_menu && grub_timeout) { - run_graphics_menu(menu_entries, config_entries, num_entries,menu_entries + menu_len, default_entry); + run_graphics_menu(menu_entries, config_entries, num_entries,menu_entries + menu_len, default_entry+vOffset); } /* Run menu interface. */ - run_menu (menu_entries, config_entries, num_entries, menu_entries + menu_len, default_entry); + run_menu (menu_entries, config_entries, num_entries, menu_entries + menu_len, default_entry+vOffset); } } }
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor