blob: e88f6f4091d3ad2e9380d4857d4cc7a4e2753e95 [file] [log] [blame]
/*
* Copyright 2013, Google Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following disclaimer
* in the documentation and/or other materials provided with the
* distribution.
* * Neither the name of Google Inc. nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Alternatively, this software may be distributed under the terms of the
* GNU General Public License ("GPL") version 2 as published by the Free
* Software Foundation.
*
* This is ported from the flashmap utility: http://flashmap.googlecode.com
*/
#ifndef FLASHMAP_LIB_SEARCH_H__
#define FLASHMAP_LIB_SEARCH_H__
/* Our current state in the search process */
enum search_state_t {
SEARCH_STATE_START,
SEARCH_STATE_USE_HANDLER, /* Call handler function */
SEARCH_STATE_BINARY_SEARCH, /* Fast binary search */
SEARCH_STATE_FULL_SEARCH, /* Slow incremental search */
SEARCH_STATE_DONE, /* Search completed */
};
/* Keeps track of the state of our search */
struct search_info {
struct flashctx *flash; /* Flash information */
enum search_state_t state; /* Current state */
long int ceiling_size; /* Lowest power of 2 >= flash size */
long int stride; /* Current binary search stride */
off_t offset; /* Next offset to return */
uint8_t *image; /* Cache of entire flash image */
int min_size; /* Minimum size of data to find */
/*
* Utility wrapper for using external programs to aid in our search.
* @search: Pointer to search information
* @offset: Wrapper will set this if successful
*
* @return 0 if successful, -1 to indicate failure or offset not
* found by utility
*/
int (*handler)(struct search_info *search, off_t *offset);
};
/**
* search_find_next() - Find the next offset to check in a search operation
*
* If search->image is not NULL, then it contains the full flash image and
* the caller can use this instead of reading the data again.
*
* @search: Search information, set up by search_init()
* @offsetp: Returns next offset to check
* @return 0 if we have an offset, -1 if we have run out of places to look
*/
int search_find_next(struct search_info *search, off_t *offsetp);
/** search_init() - Get ready to start a search
*
* @search: Search information, set up by this function
* @flash: Information about the flash chip
* @min_size: Minimum size of region that we want to find
*/
void search_init(struct search_info *search, struct flashctx *flash,
int min_size);
/** search_free() - Free memory allocated by search
*
* @search: Search information, set up by search_init()
*/
void search_free(struct search_info *search);
#endif