diff options
author | RajithaY <rajithax.yerrumsetty@intel.com> | 2017-04-25 03:31:15 -0700 |
---|---|---|
committer | Rajitha Yerrumchetty <rajithax.yerrumsetty@intel.com> | 2017-05-22 06:48:08 +0000 |
commit | bb756eebdac6fd24e8919e2c43f7d2c8c4091f59 (patch) | |
tree | ca11e03542edf2d8f631efeca5e1626d211107e3 /qemu/roms/openbios/packages/sun-parts.c | |
parent | a14b48d18a9ed03ec191cf16b162206998a895ce (diff) |
Adding qemu as a submodule of KVMFORNFV
This Patch includes the changes to add qemu as a submodule to
kvmfornfv repo and make use of the updated latest qemu for the
execution of all testcase
Change-Id: I1280af507a857675c7f81d30c95255635667bdd7
Signed-off-by:RajithaY<rajithax.yerrumsetty@intel.com>
Diffstat (limited to 'qemu/roms/openbios/packages/sun-parts.c')
-rw-r--r-- | qemu/roms/openbios/packages/sun-parts.c | 343 |
1 files changed, 0 insertions, 343 deletions
diff --git a/qemu/roms/openbios/packages/sun-parts.c b/qemu/roms/openbios/packages/sun-parts.c deleted file mode 100644 index 16b281b6e..000000000 --- a/qemu/roms/openbios/packages/sun-parts.c +++ /dev/null @@ -1,343 +0,0 @@ -/* - * Sun (Sparc32/64) partition support - * - * Copyright (C) 2004 Stefan Reinauer - * - * This code is based (and copied in many places) from - * mac partition support by Samuel Rydh (samuel@ibrium.se) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 - * - */ - -#include "config.h" -#include "libopenbios/bindings.h" -#include "libopenbios/load.h" -#include "libc/byteorder.h" -#include "libc/vsprintf.h" -#include "packages.h" - -//#define DEBUG_SUN_PARTS - -#ifdef DEBUG_SUN_PARTS -#define DPRINTF(fmt, args...) \ - do { printk(fmt , ##args); } while (0) -#else -#define DPRINTF(fmt, args...) -#endif - -typedef struct { - xt_t seek_xt, read_xt; - ucell offs_hi, offs_lo; - ucell size_hi, size_lo; - int type; - phandle_t filesystem_ph; -} sunparts_info_t; - -DECLARE_NODE( sunparts, INSTALL_OPEN, sizeof(sunparts_info_t), "+/packages/sun-parts" ); - -#define SEEK( pos ) ({ DPUSH(pos); call_parent(di->seek_xt); POP(); }) -#define READ( buf, size ) ({ PUSH((ucell)buf); PUSH(size); call_parent(di->read_xt); POP(); }) - -/* Layout of SUN partition table */ -struct sun_disklabel { - uint8_t info[128]; /* Informative text string */ - uint8_t spare0[14]; - struct sun_info { - uint16_t id; - uint16_t flags; - } infos[8]; - uint8_t spare[246]; /* Boot information etc. */ - uint16_t rspeed; /* Disk rotational speed */ - uint16_t pcylcount; /* Physical cylinder count */ - uint16_t sparecyl; /* extra sects per cylinder */ - uint8_t spare2[4]; /* More magic... */ - uint16_t ilfact; /* Interleave factor */ - uint16_t ncyl; /* Data cylinder count */ - uint16_t nacyl; /* Alt. cylinder count */ - uint16_t ntrks; /* Tracks per cylinder */ - uint16_t nsect; /* Sectors per track */ - uint8_t spare3[4]; /* Even more magic... */ - struct sun_partition { - uint32_t start_cylinder; - uint32_t num_sectors; - } partitions[8]; - uint16_t magic; /* Magic number */ - uint16_t csum; /* Label xor'd checksum */ -}; - -/* two helper functions */ - -static inline int -has_sun_part_magic(unsigned char *sect) -{ - struct sun_disklabel *p = (struct sun_disklabel *)sect; - uint16_t csum, *ush, tmp16; - - if (__be16_to_cpu(p->magic) != 0xDABE) - return 0; - - csum = 0; - for (ush = (uint16_t *)p; ush < (uint16_t *)(p + 1); ush++) { - tmp16 = __be16_to_cpu(*ush); - csum ^= tmp16; - } - return csum == 0; -} - -/* ( open -- flag ) */ -static void -sunparts_open( sunparts_info_t *di ) -{ - char *str = my_args_copy(); - char *argstr = NULL; - char *parstr = NULL; - int parnum = -1; - unsigned char buf[512]; - struct sun_disklabel *p; - unsigned int i, bs; - ducell offs, size; - phandle_t ph; - - DPRINTF("sunparts_open '%s'\n", str ); - - /* - Arguments that we accept: - id: [0-7] | [a-h] - [(id)][,][filespec] - */ - - if ( str && strlen(str) ) { - /* Detect the arguments */ - if ((*str >= '0' && *str <= '9') || (*str >= 'a' && *str < ('a' + 8)) || (*str == ',')) { - push_str(str); - PUSH(','); - fword("left-parse-string"); - parstr = pop_fstr_copy(); - argstr = pop_fstr_copy(); - } else { - argstr = str; - } - - /* Convert the id to a partition number */ - if (parstr && strlen(parstr)) { - if (parstr[0] >= 'a' && parstr[0] < ('a' + 8)) - parnum = parstr[0] - 'a'; - else - parnum = atol(parstr); - } - } - - /* Make sure argstr is not null */ - if (argstr == NULL) - argstr = strdup(""); - - DPRINTF("parstr: %s argstr: %s parnum: %d\n", parstr, argstr, parnum); - - di->filesystem_ph = 0; - di->read_xt = find_parent_method("read"); - di->seek_xt = find_parent_method("seek"); - - SEEK( 0 ); - if (READ(buf, 512) != 512) { - free(str); - RET(0); - } - - /* Check Magic */ - if (!has_sun_part_magic(buf)) { - DPRINTF("Sun partition magic not found.\n"); - free(str); - RET(0); - } - - bs = 512; - /* get partition data */ - p = (struct sun_disklabel *)buf; - - for (i = 0; i < 8; i++) { - DPRINTF("%c: %d + %d, id %x, flags %x\n", 'a' + i, - __be32_to_cpu(p->partitions[i].start_cylinder), - __be32_to_cpu(p->partitions[i].num_sectors), - __be16_to_cpu(p->infos[i].id), - __be16_to_cpu(p->infos[i].flags)); - } - - if (parnum < 0) - parnum = 0; - - DPRINTF("Selected partition %d\n", parnum); - - offs = (long long)__be32_to_cpu(p->partitions[parnum].start_cylinder) * - __be16_to_cpu(p->ntrks) * __be16_to_cpu(p->nsect) * bs; - - di->offs_hi = offs >> BITS; - di->offs_lo = offs & (ucell) -1; - size = (long long)__be32_to_cpu(p->partitions[parnum].num_sectors) * bs; - if (size == 0) { - DPRINTF("Partition size is 0, exiting\n"); - free(str); - RET(0); - } - di->size_hi = size >> BITS; - di->size_lo = size & (ucell) -1; - di->type = __be16_to_cpu(p->infos[parnum].id); - - DPRINTF("Found Sun partition, offs %lld size %lld\n", - (long long)offs, (long long)size); - - /* Probe for filesystem at current offset */ - DPRINTF("sun-parts: about to probe for fs\n"); - DPUSH( offs ); - PUSH_ih( my_parent() ); - parword("find-filesystem"); - DPRINTF("sun-parts: done fs probe\n"); - - ph = POP_ph(); - if( ph ) { - DPRINTF("sun-parts: filesystem found with ph " FMT_ucellx " and args %s\n", ph, argstr); - di->filesystem_ph = ph; - - /* If we have been asked to open a particular file, interpose the filesystem package with - the passed filename as an argument */ - if (argstr && strlen(argstr)) { - push_str( argstr ); - PUSH_ph( ph ); - fword("interpose"); - } - } else { - DPRINTF("sun-parts: no filesystem found; bypassing misc-files interpose\n"); - - /* Solaris Fcode boot blocks assume that the disk-label package will always - automatically interpose the "ufs-file-system" package if it exists! We - need to mimic this behaviour in order for the boot to work. */ - push_str("ufs-file-system"); - feval("find-package"); - ph = POP_ph(); - - if (argstr && strlen(argstr) && ph) { - ph = POP_ph(); - push_str(argstr); - PUSH_ph(ph); - fword("interpose"); - } - } - - free( str ); - RET( -1 ); -} - -/* ( block0 -- flag? ) */ -static void -sunparts_probe( __attribute__((unused))sunparts_info_t *dummy ) -{ - unsigned char *buf = (unsigned char *)POP(); - - DPRINTF("probing for Sun partitions\n"); - - RET ( has_sun_part_magic(buf) ); -} - -/* ( -- type offset.d size.d ) */ -static void -sunparts_get_info( sunparts_info_t *di ) -{ - DPRINTF("Sun get_info\n"); - PUSH( di->type ); - PUSH( di->offs_lo ); - PUSH( di->offs_hi ); - PUSH( di->size_lo ); - PUSH( di->size_hi ); -} - -static void -sunparts_block_size( __attribute__((unused))sunparts_info_t *di ) -{ - PUSH(512); -} - -static void -sunparts_initialize( __attribute__((unused))sunparts_info_t *di ) -{ - fword("register-partition-package"); -} - -/* ( pos.d -- status ) */ -static void -sunparts_seek(sunparts_info_t *di ) -{ - long long pos = DPOP(); - long long offs, size;; - - DPRINTF("sunparts_seek %llx:\n", pos); - - /* Seek is invalid if we reach the end of the device */ - size = ((ducell)di->size_hi << BITS) | di->size_lo; - if (pos > size) - RET( -1 ); - - /* Calculate the seek offset for the parent */ - offs = ((ducell)di->offs_hi << BITS) | di->offs_lo; - offs += pos; - DPUSH(offs); - - DPRINTF("sunparts_seek parent offset %llx:\n", offs); - - call_package(di->seek_xt, my_parent()); -} - -/* ( buf len -- actlen ) */ -static void -sunparts_read(sunparts_info_t *di ) -{ - DPRINTF("sunparts_read\n"); - - /* Pass the read back up to the parent */ - call_package(di->read_xt, my_parent()); -} - -/* ( addr -- size ) */ -static void -sunparts_load( __attribute__((unused))sunparts_info_t *di ) -{ - /* Invoke the loader */ - load(my_self()); -} - -/* ( pathstr len -- ) */ -static void -sunparts_dir( sunparts_info_t *di ) -{ - if ( di->filesystem_ph) { - PUSH( my_self() ); - push_str("dir"); - PUSH( di->filesystem_ph ); - fword("find-method"); - POP(); - fword("execute"); - } else { - forth_printf("sun-parts: Unable to determine filesystem\n"); - POP(); - POP(); - } -} - -NODE_METHODS( sunparts ) = { - { "probe", sunparts_probe }, - { "open", sunparts_open }, - { "get-info", sunparts_get_info }, - { "block-size", sunparts_block_size }, - { "seek", sunparts_seek }, - { "read", sunparts_read }, - { "load", sunparts_load }, - { "dir", sunparts_dir }, - { NULL, sunparts_initialize }, -}; - -void -sunparts_init( void ) -{ - REGISTER_NODE( sunparts ); -} |