6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker/*
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * CDDL HEADER START
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker *
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * The contents of this file are subject to the terms of the
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * Common Development and Distribution License (the "License").
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * You may not use this file except in compliance with the License.
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker *
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * or http://www.opensolaris.org/os/licensing.
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * See the License for the specific language governing permissions
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * and limitations under the License.
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker *
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * When distributing Covered Code, include this CDDL HEADER in each
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * If applicable, add the following below this CDDL HEADER, with the
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * fields enclosed by brackets "[]" replaced with your own identifying
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * information: Portions Copyright [yyyy] [name of copyright owner]
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker *
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * CDDL HEADER END
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker/*
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker#include <stdio.h>
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker#include <stdlib.h>
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker#include <alloca.h>
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker#include <sys/byteorder.h>
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker#include "fru_access_impl.h"
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker#include "fruraw.h"
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker#pragma init(initialize_raw_access)
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerstatic hash_obj_t *hash_table[TABLE_SIZE];
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerextern raw_list_t *g_raw;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerstatic void
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerinitialize_raw_access(void)
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker{
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker int count;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker for (count = 0; count < TABLE_SIZE; count++) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_table[count] = NULL;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker}
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerstatic hash_obj_t *
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerlookup_handle_object(handle_t handle, int object_type)
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker{
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker handle_t index_to_hash;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj_t *first_hash_obj;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj_t *next_hash_obj;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker index_to_hash = (handle % TABLE_SIZE);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker first_hash_obj = hash_table[index_to_hash];
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker for (next_hash_obj = first_hash_obj; next_hash_obj != NULL;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker next_hash_obj = next_hash_obj->next) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if ((handle == next_hash_obj->obj_hdl) &&
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker (object_type == next_hash_obj->object_type)) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (next_hash_obj);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (NULL);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker}
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerstatic void
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickeradd_hashobject_to_hashtable(hash_obj_t *hash_obj)
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker{
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker handle_t index_to_hash;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker static uint64_t handle_count = 0;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj->obj_hdl = ++handle_count; /* store the handle */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker /* where to add ? */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker index_to_hash = ((hash_obj->obj_hdl) % TABLE_SIZE);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj->next = hash_table[index_to_hash];
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_table[index_to_hash] = hash_obj; /* hash obj. added */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (hash_obj->next != NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj->next->prev = hash_obj;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker}
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerstatic hash_obj_t *
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickercreate_container_hash_object(void)
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker{
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj_t *hash_obj;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker container_obj_t *cont_obj;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker cont_obj = malloc(sizeof (container_obj_t));
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (cont_obj == NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (NULL);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj = malloc(sizeof (hash_obj_t));
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (hash_obj == NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker free(cont_obj);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (NULL);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker cont_obj->sec_obj_list = NULL;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj->object_type = CONTAINER_TYPE;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj->u.cont_obj = cont_obj;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj->next = NULL;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj->prev = NULL;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (hash_obj);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker}
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerstatic hash_obj_t *
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickercreate_section_hash_object(void)
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker{
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj_t *hash_obj;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker section_obj_t *sec_obj;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker sec_obj = malloc(sizeof (section_obj_t));
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (sec_obj == NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (NULL);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj = malloc(sizeof (hash_obj_t));
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (hash_obj == NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker free(sec_obj);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (NULL);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker sec_obj->next = NULL;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker sec_obj->seg_obj_list = NULL;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj->u.sec_obj = sec_obj;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj->object_type = SECTION_TYPE;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj->next = NULL;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj->prev = NULL;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (hash_obj);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker}
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerstatic hash_obj_t *
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickercreate_segment_hash_object(void)
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker{
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj_t *hash_obj;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker segment_obj_t *seg_obj;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker seg_obj = malloc(sizeof (segment_obj_t));
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (seg_obj == NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (NULL);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj = malloc(sizeof (hash_obj_t));
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (hash_obj == NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker free(seg_obj);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (NULL);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker seg_obj->next = NULL;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker seg_obj->pkt_obj_list = NULL;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj->object_type = SEGMENT_TYPE;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj->u.seg_obj = seg_obj;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj->next = NULL;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj->prev = NULL;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (hash_obj);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker}
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerstatic hash_obj_t *
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickercreate_packet_hash_object(void)
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker{
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj_t *hash_obj;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker packet_obj_t *pkt_obj;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker pkt_obj = malloc(sizeof (packet_obj_t));
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (pkt_obj == NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (NULL);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj = malloc(sizeof (hash_obj_t));
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (hash_obj == NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker free(pkt_obj);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (NULL);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker pkt_obj->next = NULL;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj->object_type = PACKET_TYPE;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj->u.pkt_obj = pkt_obj;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj->next = NULL;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj->prev = NULL;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (hash_obj);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker}
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerstatic hash_obj_t *
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerget_container_hash_object(int object_type, handle_t handle)
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker{
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj_t *hash_obj;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker switch (object_type) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker case CONTAINER_TYPE:
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker break;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker case SECTION_TYPE:
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj = lookup_handle_object(handle, CONTAINER_TYPE);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (hash_obj == NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (NULL);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker break;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker case SEGMENT_TYPE:
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj = lookup_handle_object(handle, SECTION_TYPE);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (hash_obj == NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (NULL);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj = lookup_handle_object(hash_obj->u.sec_obj->cont_hdl,
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker CONTAINER_TYPE);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker break;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker case PACKET_TYPE:
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker break;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker default:
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (NULL);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (hash_obj);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker}
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerstatic void
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickeradd_to_pkt_object_list(hash_obj_t *parent_obj, hash_obj_t *child_obj)
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker{
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj_t *next_hash;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker /* add the packet object in the end of list */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker child_obj->u.pkt_obj->segment_hdl = parent_obj->obj_hdl;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (parent_obj->u.seg_obj->pkt_obj_list == NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker parent_obj->u.seg_obj->pkt_obj_list = child_obj;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker for (next_hash = parent_obj->u.seg_obj->pkt_obj_list;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker next_hash->u.pkt_obj->next != NULL;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker next_hash = next_hash->u.pkt_obj->next) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker ;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker next_hash->u.pkt_obj->next = child_obj;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker}
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerstatic void
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerfree_pkt_object_list(hash_obj_t *hash_obj)
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker{
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj_t *next_obj;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj_t *free_obj;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker next_obj = hash_obj->u.seg_obj->pkt_obj_list;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker while (next_obj != NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker free_obj = next_obj;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker next_obj = next_obj->u.pkt_obj->next;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker /* if prev is NULL it's the first object in the list */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (free_obj->prev == NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_table[(free_obj->obj_hdl % TABLE_SIZE)] =
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker free_obj->next;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (free_obj->next != NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker free_obj->next->prev = free_obj->prev;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker } else {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker free_obj->prev->next = free_obj->next;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (free_obj->next != NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker free_obj->next->prev = free_obj->prev;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker free(free_obj->u.pkt_obj->payload);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker free(free_obj->u.pkt_obj);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker free(free_obj);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj->u.seg_obj->pkt_obj_list = NULL;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker}
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerstatic void
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerfree_segment_hash(handle_t handle, hash_obj_t *sec_hash)
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker{
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj_t *seg_hash;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj_t *next_hash;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker seg_hash = sec_hash->u.sec_obj->seg_obj_list;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (seg_hash == NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (seg_hash->obj_hdl == handle) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker sec_hash->u.sec_obj->seg_obj_list = seg_hash->u.seg_obj->next;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker } else {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker while (seg_hash->obj_hdl != handle) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker next_hash = seg_hash;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker seg_hash = seg_hash->u.seg_obj->next;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (seg_hash == NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker next_hash->u.seg_obj->next = seg_hash->u.seg_obj->next;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (seg_hash->prev == NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_table[(seg_hash->obj_hdl % TABLE_SIZE)] = seg_hash->next;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (seg_hash->next != NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker seg_hash->next->prev = NULL;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker } else {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker seg_hash->prev->next = seg_hash->next;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (seg_hash->next != NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker seg_hash->next->prev = seg_hash->prev;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker free_pkt_object_list(seg_hash);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker free(seg_hash->u.seg_obj);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker free(seg_hash);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker}
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerstatic void
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickeradd_to_sec_object_list(hash_obj_t *parent_obj, hash_obj_t *child_obj)
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker{
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj_t *next_hash;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker child_obj->u.sec_obj->cont_hdl = parent_obj->obj_hdl;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (parent_obj->u.cont_obj->sec_obj_list == NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker parent_obj->u.cont_obj->sec_obj_list = child_obj;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker for (next_hash = parent_obj->u.cont_obj->sec_obj_list;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker next_hash->u.sec_obj->next != NULL;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker next_hash = next_hash->u.sec_obj->next) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker ;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker next_hash->u.sec_obj->next = child_obj;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker}
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerstatic void
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickeradd_to_seg_object_list(hash_obj_t *parent_obj, hash_obj_t *child_obj)
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker{
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj_t *next_hash;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker child_obj->u.seg_obj->section_hdl = parent_obj->obj_hdl;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (parent_obj->u.sec_obj->seg_obj_list == NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker parent_obj->u.sec_obj->seg_obj_list = child_obj;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker for (next_hash = parent_obj->u.sec_obj->seg_obj_list;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker next_hash->u.seg_obj->next != NULL;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker next_hash = next_hash->u.seg_obj->next) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker ;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker next_hash->u.seg_obj->next = child_obj;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker}
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerstatic char *
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickertokenizer(char *buf, char *separator, char **nextBuf, char *matched)
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker{
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker int i = 0;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker int j = 0;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker for (i = 0; buf[i] != '\0'; i++) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker for (j = 0; j < strlen(separator); j++) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (buf[i] == separator[j]) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker buf[i] = '\0';
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker *nextBuf = &(buf[i+1]);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker *matched = separator[j];
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (buf);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker *nextBuf = buf;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker *matched = '\0';
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (NULL);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker}
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerstatic void
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickercopy_segment_layout(segment_t *seghdr, void *layout)
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker{
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker segment_layout_t *seg_layout;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker seg_layout = (segment_layout_t *)layout;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker (void) memcpy(seghdr->name, &seg_layout->name, SEG_NAME_LEN);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker seghdr->descriptor = GET_SEGMENT_DESCRIPTOR;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker seghdr->offset = BE_16(seg_layout->offset);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker seghdr->length = BE_16(seg_layout->length);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker}
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerstatic int
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerget_container_info(const char *def_file, const char *cont_desc_str,
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker container_info_t *cont_info)
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker{
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker char *item;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker char *token;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker char *field;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker char matched;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker char buf[1024];
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker int foundIt = 0;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker FILE *file = fopen(def_file, "r");
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (file == NULL)
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (-1);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker cont_info->num_sections = 0;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker while (fgets(buf, sizeof (buf), file) != NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker /* ignore all comments */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker token = tokenizer(buf, "#", &field, &matched);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker /* find the names */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker token = tokenizer(buf, ":", &field, &matched);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (token != 0x00) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker token = tokenizer(token, "|", &item, &matched);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker while (token != 0x00) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (strcmp(token, cont_desc_str) == 0) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker foundIt = 1;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker goto found;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker token = tokenizer(item, "|", &item, &matched);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker /* check the last remaining item */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if ((item != 0x00) &&
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker (strcmp(item, cont_desc_str) == 0)) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker foundIt = 1;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker goto found;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerfound :
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (foundIt == 1) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker token = tokenizer(field, ":", &field, &matched);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (token == 0x00) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker (void) fclose(file);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (-1);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker cont_info->header_ver = (headerrev_t)atoi(token);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker token = tokenizer(field, ":\n", &field, &matched);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker while (token != 0x00) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker token = tokenizer(token, ",", &item, &matched);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (token == 0x00) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker (void) fclose(file);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (-1);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (atoi(token) == 1) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker cont_info->section_info[cont_info->
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker num_sections].description.field.read_only
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker = 1;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker } else if (atoi(token) == 0) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker cont_info->section_info[cont_info->
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker num_sections].description.field.read_only
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker = 0;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker } else {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker (void) fclose(file);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (-1);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker token = tokenizer(item, ",", &item, &matched);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (token == 0x00) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker (void) fclose(file);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (-1);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker cont_info->section_info[cont_info->
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker num_sections].address = atoi(token);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (item == '\0') {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker (void) fclose(file);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (-1);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker cont_info->section_info[cont_info->num_sections].size =
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker atoi(item);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker (cont_info->num_sections)++;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker token = tokenizer(field, ":\n ", &field, &matched);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker (void) fclose(file);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (0);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker}
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker/* ARGSUSED */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerint
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerfru_get_segments(section_hdl_t section, segment_t *segment, int maxseg,
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker door_cred_t *cred)
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker{
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker int count;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj_t *sec_object;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj_t *seg_object;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker section_obj_t *sec_obj;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker sec_object = lookup_handle_object(section, SECTION_TYPE);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (sec_object == NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (-1);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker sec_obj = sec_object->u.sec_obj;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (sec_obj == NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (-1);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (sec_obj->num_of_segment > maxseg) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (-1);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker seg_object = sec_object->u.sec_obj->seg_obj_list;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (seg_object == NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (-1);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker for (count = 0; count < sec_obj->num_of_segment; count++) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker /* populate segment_t */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker segment->handle = seg_object->obj_hdl;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker (void) memcpy(segment->name,
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker seg_object->u.seg_obj->segment.name, SEG_NAME_LEN);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker segment->descriptor = seg_object->u.seg_obj->segment.descriptor;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker segment->offset = seg_object->u.seg_obj->segment.offset;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker segment->length = seg_object->u.seg_obj->segment.length;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker seg_object = seg_object->u.seg_obj->next;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker segment++;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (0);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker}
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerstatic int
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerraw_memcpy(void *buffer, raw_list_t *rawlist, int offset, int size)
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker{
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (offset + size > rawlist->size) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker size = rawlist->size - offset;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker (void) memcpy(buffer, &rawlist->raw[offset], size);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (size);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker}
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerstatic int
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerverify_header_crc8(headerrev_t head_ver, unsigned char *bytes, int length)
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker{
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker int crc_offset = 0;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker unsigned char orig_crc8 = 0;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker unsigned char calc_crc8 = 0;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker switch (head_ver) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker case SECTION_HDR_VER:
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker crc_offset = 4;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker break;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker default:
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker errno = EINVAL;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (0);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker orig_crc8 = bytes[crc_offset];
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker bytes[crc_offset] = 0x00; /* clear for calc */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker calc_crc8 = compute_crc8(bytes, length);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker bytes[crc_offset] = orig_crc8; /* restore */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (orig_crc8 == calc_crc8);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker}
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerstatic int
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerget_section(raw_list_t *rawlist, hash_obj_t *sec_hash, section_t *section)
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker{
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker int retval;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker int size;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker int count;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker uint16_t hdrver;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj_t *seg_hash;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker unsigned char *buffer;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker section_obj_t *sec_obj;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker section_layout_t sec_hdr;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker segment_layout_t *seg_hdr;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker segment_layout_t *seg_buf;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker sec_obj = sec_hash->u.sec_obj;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (sec_obj == NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (-1);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker /* populate section_t */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker section->handle = sec_hash->obj_hdl;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker section->offset = sec_obj->section.offset;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker section->length = sec_obj->section.length;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker section->protection = sec_obj->section.protection;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker section->version = sec_obj->section.version;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker /* read section header layout */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker retval = raw_memcpy(&sec_hdr, rawlist, sec_obj->section.offset,
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker sizeof (sec_hdr));
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (retval != sizeof (sec_hdr)) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (-1);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hdrver = GET_SECTION_HDR_VERSION;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if ((sec_hdr.headertag != SECTION_HDR_TAG) &&
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker (hdrver != section->version)) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (-1);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker /* size = section layout + total sizeof segment header */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker size = sizeof (sec_hdr) + ((sec_hdr.segmentcount)
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * sizeof (segment_layout_t));
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker buffer = alloca(size);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (buffer == NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (-1);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker /* segment header buffer */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker seg_buf = alloca(size - sizeof (sec_hdr));
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (seg_buf == NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (-1);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker /* read segment header */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker retval = raw_memcpy(seg_buf, rawlist,
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker sec_obj->section.offset + sizeof (sec_hdr),
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker size - sizeof (sec_hdr));
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (retval != (size - sizeof (sec_hdr))) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (-1);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker /* copy section header layout */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker (void) memcpy(buffer, &sec_hdr, sizeof (sec_hdr));
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker /* copy segment header layout */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker (void) memcpy(buffer + sizeof (sec_hdr), seg_buf, size -
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker sizeof (sec_hdr));
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker /* verify crc8 */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker retval = verify_header_crc8(hdrver, buffer, size);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (retval != TRUE) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (-1);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker section->version = hdrver;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker sec_obj->section.version = hdrver;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker seg_hdr = (segment_layout_t *)seg_buf;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker /* bug fix for frutool */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (sec_hash->u.sec_obj->seg_obj_list != NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (0);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker } else {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker sec_obj->num_of_segment = 0;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker for (count = 0; count < sec_hdr.segmentcount; count++, seg_hdr++) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker seg_hash = create_segment_hash_object();
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (seg_hash == NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (-1);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker add_hashobject_to_hashtable(seg_hash);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker copy_segment_layout(&seg_hash->u.seg_obj->segment, seg_hdr);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker add_to_seg_object_list(sec_hash, seg_hash);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker sec_obj->num_of_segment++;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (0);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker}
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker/* ARGSUSED */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerint
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerfru_get_sections(container_hdl_t container, section_t *section, int maxsec,
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker door_cred_t *cred)
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker{
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker int count;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker int num_sec = 0;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj_t *cont_object;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj_t *sec_hash;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker cont_object = lookup_handle_object(container, CONTAINER_TYPE);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (cont_object == NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (-1);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (cont_object->u.cont_obj->num_of_section > maxsec) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (-1);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker sec_hash = cont_object->u.cont_obj->sec_obj_list;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (sec_hash == NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (-1);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker for (count = 0; count < cont_object->u.cont_obj->num_of_section;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker count++) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker section->version = -1;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker /* populate section_t */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (get_section(g_raw, sec_hash, section) == 0) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker section++;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker num_sec++;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker sec_hash = sec_hash->u.sec_obj->next;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (num_sec);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker}
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerstatic uint32_t
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerget_checksum_crc(hash_obj_t *seg_hash, int data_size)
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker{
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker int protection;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker int offset = 0;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker uint32_t crc;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj_t *sec_hash;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj_t *pkt_hash;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker unsigned char *buffer;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker sec_hash = lookup_handle_object(seg_hash->u.seg_obj->section_hdl,
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker SECTION_TYPE);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (sec_hash == NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return ((uint32_t)-1);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker buffer = alloca(data_size);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (buffer == NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return ((uint32_t)-1);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker /* traverse the packet object list for all the tags and payload */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker for (pkt_hash = seg_hash->u.seg_obj->pkt_obj_list; pkt_hash != NULL;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker pkt_hash = pkt_hash->u.pkt_obj->next) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker (void) memcpy(buffer + offset, &pkt_hash->u.pkt_obj->tag,
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker pkt_hash->u.pkt_obj->tag_size);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker offset += pkt_hash->u.pkt_obj->tag_size;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker (void) memcpy(buffer + offset, pkt_hash->u.pkt_obj->payload,
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker pkt_hash->u.pkt_obj->paylen);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker offset += pkt_hash->u.pkt_obj->paylen;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker protection = sec_hash->u.sec_obj->section.protection;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (protection == READ_ONLY_SECTION) { /* read-only section */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker crc = compute_crc32(buffer, data_size);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker } else { /* read/write section */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker crc = compute_checksum32(buffer, data_size);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (crc); /* computed crc */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker}
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerstatic int
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerget_packet(raw_list_t *rawlist, void *buffer, int size, int offset)
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker{
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker int retval;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker retval = raw_memcpy(buffer, rawlist, offset, size);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (retval != -1) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (0);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (-1);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker}
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerstatic int
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerget_packets(hash_obj_t *seg_hash, raw_list_t *rawlist, int offset, int length)
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker{
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker int tag_size;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker int paylen;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker int retval;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker int seg_limit = 0;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker int pktcnt = 0;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker char *data;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker uint32_t crc;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker uint32_t origcrc;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker fru_tag_t tag;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj_t *pkt_hash_obj;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj_t *sec_hash;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker fru_segdesc_t *segdesc;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker fru_tagtype_t tagtype;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker char *ignore_flag;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker retval = get_packet(rawlist, &tag, sizeof (fru_tag_t), offset);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (retval == -1) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (-1);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker /* section hash object */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker sec_hash = lookup_handle_object(seg_hash->u.seg_obj->section_hdl,
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker SECTION_TYPE);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (sec_hash == NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (-1);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker seg_hash->u.seg_obj->trailer_offset = offset;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker data = (char *)&tag;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker while (data[0] != SEG_TRAILER_TAG) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker tagtype = get_tag_type(&tag); /* verify tag type */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (tagtype == -1) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (-1);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker tag_size = get_tag_size(tagtype);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (tag_size == -1) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (-1);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker seg_limit += tag_size;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (seg_limit > length) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (-1);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker paylen = get_payload_length((void *)&tag);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (paylen == -1) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (-1);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker seg_limit += paylen;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (seg_limit > length) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (-1);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if ((offset + tag_size + paylen) >
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker (sec_hash->u.sec_obj->section.offset +
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker sec_hash->u.sec_obj->section.length)) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (-1);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker pkt_hash_obj = create_packet_hash_object();
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (pkt_hash_obj == NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (-1);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker pkt_hash_obj->u.pkt_obj->payload = malloc(paylen);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (pkt_hash_obj->u.pkt_obj->payload == NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker free(pkt_hash_obj);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (-1);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker offset += tag_size;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker retval = raw_memcpy(pkt_hash_obj->u.pkt_obj->payload, rawlist,
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker offset, paylen);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (retval != paylen) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker free(pkt_hash_obj->u.pkt_obj->payload);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker free(pkt_hash_obj);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (-1);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker /* don't change this */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker pkt_hash_obj->u.pkt_obj->tag.raw_data = 0;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker (void) memcpy(&pkt_hash_obj->u.pkt_obj->tag, &tag, tag_size);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker pkt_hash_obj->u.pkt_obj->paylen = paylen;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker pkt_hash_obj->u.pkt_obj->tag_size = tag_size;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker pkt_hash_obj->u.pkt_obj->payload_offset = offset;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker offset += paylen;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker add_hashobject_to_hashtable(pkt_hash_obj);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker add_to_pkt_object_list(seg_hash, pkt_hash_obj);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker pktcnt++;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker retval = get_packet(rawlist, &tag, sizeof (fru_tag_t),
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker offset);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (retval == -1) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (retval);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker data = (char *)&tag;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker segdesc = (fru_segdesc_t *)&seg_hash->u.seg_obj->segment.descriptor;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker seg_hash->u.seg_obj->trailer_offset = offset;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (!segdesc->field.ignore_checksum) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker crc = get_checksum_crc(seg_hash, seg_limit);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker offset = seg_hash->u.seg_obj->segment.offset;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker retval = raw_memcpy(&origcrc, rawlist, offset + seg_limit + 1,
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker sizeof (origcrc));
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker ignore_flag = getenv(IGNORE_CHECK);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (ignore_flag != NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (pktcnt);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (retval != sizeof (origcrc)) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (-1);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker origcrc = BE_32(origcrc);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (origcrc != crc) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker seg_hash->u.seg_obj->trailer_offset = offset;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (-1);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (pktcnt);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker}
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker/* ARGSUSED */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerint
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerfru_get_num_sections(container_hdl_t container, door_cred_t *cred)
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker{
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj_t *hash_object;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_object = lookup_handle_object(container, CONTAINER_TYPE);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (hash_object == NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (-1);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (hash_object->u.cont_obj->num_of_section);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker}
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker/* ARGSUSED */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerint
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerfru_get_num_segments(section_hdl_t section, door_cred_t *cred)
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker{
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj_t *sec_object;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker section_obj_t *sec_obj;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker sec_object = lookup_handle_object(section, SECTION_TYPE);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (sec_object == NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (-1);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker sec_obj = sec_object->u.sec_obj;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (sec_obj == NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (-1);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (sec_obj->num_of_segment);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker}
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker/* ARGSUSED */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerint
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerfru_get_num_packets(segment_hdl_t segment, door_cred_t *cred)
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker{
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker int pktcnt;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker int length;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker uint16_t offset;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj_t *cont_hash_obj;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj_t *seg_hash;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj_t *sec_hash;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker fru_segdesc_t *segdesc;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker segment_obj_t *segment_object;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker seg_hash = lookup_handle_object(segment, SEGMENT_TYPE);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (seg_hash == NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (-1);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker segment_object = seg_hash->u.seg_obj;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (segment_object == NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (-1);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker segdesc = (fru_segdesc_t *)&segment_object->segment.descriptor;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (segdesc->field.opaque) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (0);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker offset = segment_object->segment.offset;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker length = segment_object->segment.length;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker cont_hash_obj = get_container_hash_object(SEGMENT_TYPE,
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker segment_object->section_hdl);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (cont_hash_obj == NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (-1);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (seg_hash->u.seg_obj->pkt_obj_list != NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (segment_object->num_of_packets);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker /* section hash object */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker sec_hash = lookup_handle_object(seg_hash->u.seg_obj->section_hdl,
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker SECTION_TYPE);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (sec_hash == NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (-1);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker /* valid segment header b'cos crc8 already validated */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (offset < sec_hash->u.sec_obj->section.offset) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (-1);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker segment_object->num_of_packets = 0;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker pktcnt = get_packets(seg_hash, g_raw, offset, length);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (pktcnt == -1) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker free_pkt_object_list(seg_hash);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker seg_hash->u.seg_obj->pkt_obj_list = NULL;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker segment_object->num_of_packets = pktcnt;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (segment_object->num_of_packets);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker}
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker/* ARGSUSED */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerint
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerfru_get_packets(segment_hdl_t segment, packet_t *packet, int maxpackets,
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker door_cred_t *cred)
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker{
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker int count;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj_t *seg_hash_obj;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj_t *pkt_hash_obj;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker /* segment hash object */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker seg_hash_obj = lookup_handle_object(segment, SEGMENT_TYPE);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (seg_hash_obj == NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (-1);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (seg_hash_obj->u.seg_obj->num_of_packets != maxpackets) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (-1);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker pkt_hash_obj = seg_hash_obj->u.seg_obj->pkt_obj_list;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (pkt_hash_obj == NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (-1);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker for (count = 0; count < maxpackets; count++, packet++) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker packet->handle = pkt_hash_obj->obj_hdl;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker packet->tag = 0;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker (void) memcpy(&packet->tag, &pkt_hash_obj->u.pkt_obj->tag,
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker pkt_hash_obj->u.pkt_obj->tag_size);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker pkt_hash_obj = pkt_hash_obj->u.pkt_obj->next;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (0);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker}
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker/* ARGSUSED */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerssize_t
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerfru_get_payload(packet_hdl_t packet, void *buffer, size_t nbytes,
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker door_cred_t *cred)
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker{
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj_t *packet_hash_obj;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker /* packet hash object */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker packet_hash_obj = lookup_handle_object(packet, PACKET_TYPE);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (packet_hash_obj == NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (-1);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker /* verify payload length */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (nbytes != packet_hash_obj->u.pkt_obj->paylen) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (-1);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker (void) memcpy(buffer, packet_hash_obj->u.pkt_obj->payload, nbytes);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (nbytes);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker}
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickercontainer_hdl_t
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickeropen_raw_data(raw_list_t *node)
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker{
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker char *cont_conf_file = NULL;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj_t *cont_hash_obj;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj_t *sec_hash_obj;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker container_info_t cont_info;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker int retval;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker int count;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker cont_hash_obj = create_container_hash_object();
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (cont_hash_obj == NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (NULL);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker add_hashobject_to_hashtable(cont_hash_obj);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker (void) strncpy(cont_hash_obj->u.cont_obj->device_pathname, "unknown",
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker sizeof (cont_hash_obj->u.cont_obj->device_pathname));
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker cont_conf_file = getenv(FRU_CONT_CONF_ENV_VAR);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (cont_conf_file == NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker cont_conf_file = FRU_CONT_CONF_SPARC;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker retval = get_container_info(cont_conf_file, node->cont_type,
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker &cont_info);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (retval < 0) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker cont_conf_file = FRU_CONT_CONF_X86;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker retval = get_container_info(cont_conf_file,
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker node->cont_type, &cont_info);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker } else {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker retval = get_container_info(cont_conf_file, node->cont_type,
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker &cont_info);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (retval < 0) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (NULL);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker cont_hash_obj->u.cont_obj->num_of_section = cont_info.num_sections;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker cont_hash_obj->u.cont_obj->sec_obj_list = NULL;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker for (count = 0; count < cont_info.num_sections; count++) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker sec_hash_obj = create_section_hash_object();
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (sec_hash_obj == NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (NULL);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker add_hashobject_to_hashtable(sec_hash_obj);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker sec_hash_obj->u.sec_obj->section.offset =
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker cont_info.section_info[count].address;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker sec_hash_obj->u.sec_obj->section.protection =
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker cont_info.section_info[count].description.field.read_only;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker sec_hash_obj->u.sec_obj->section.length =
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker cont_info.section_info[count].size;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker sec_hash_obj->u.sec_obj->section.version =
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker cont_info.header_ver;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker add_to_sec_object_list(cont_hash_obj, sec_hash_obj);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (cont_hash_obj->obj_hdl);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker}
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerint
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerfru_close_container(container_hdl_t container)
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker{
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj_t *hash_obj;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj_t *prev_hash;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj_t *sec_hash_obj;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker handle_t obj_hdl;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker /* lookup for container hash object */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj = lookup_handle_object(container, CONTAINER_TYPE);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (hash_obj == NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (0);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker /* points to section object list */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker sec_hash_obj = hash_obj->u.cont_obj->sec_obj_list;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker /* traverse section object list */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker while (sec_hash_obj != NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker /* traverse segment hash object in the section */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker while (sec_hash_obj->u.sec_obj->seg_obj_list != NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker /* object handle of the segment hash object */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker obj_hdl =
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker sec_hash_obj->u.sec_obj->seg_obj_list->obj_hdl;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker free_segment_hash(obj_hdl, sec_hash_obj);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker /* going to free section hash object, relink the hash object */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (sec_hash_obj->prev == NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_table[(sec_hash_obj->obj_hdl % TABLE_SIZE)] =
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker sec_hash_obj->next;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (sec_hash_obj->next != NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker sec_hash_obj->next->prev = NULL;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker } else {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker sec_hash_obj->prev->next = sec_hash_obj->next;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (sec_hash_obj->next != NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker sec_hash_obj->next->prev = sec_hash_obj->prev;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker prev_hash = sec_hash_obj;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker sec_hash_obj = sec_hash_obj->u.sec_obj->next;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim free(prev_hash->u.sec_obj); /* free section hash object */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker free(prev_hash); /* free section hash */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker /* free container hash object */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (hash_obj->prev == NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_table[(hash_obj->obj_hdl % TABLE_SIZE)] =
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj->next;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (hash_obj->next != NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj->next->prev = NULL;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker } else {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj->prev->next = hash_obj->next;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker if (hash_obj->next != NULL) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker hash_obj->next->prev = hash_obj->prev;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker }
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker free(hash_obj->u.cont_obj);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker free(hash_obj);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker return (0);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker}