1/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved. 2 * Use of this source code is governed by a BSD-style license that can be 3 * found in the LICENSE file. 4 * 5 * Implementations of stateful memory operations. 6 */ 7 8#include "sysincludes.h" 9 10#include "stateful_util.h" 11#include "utility.h" 12 13void StatefulInit(MemcpyState *state, void *buf, uint64_t len) 14{ 15 state->remaining_buf = buf; 16 state->remaining_len = len; 17 state->overrun = 0; 18} 19 20void *StatefulSkip(MemcpyState *state, uint64_t len) 21{ 22 if (state->overrun) 23 return NULL; 24 if (len > state->remaining_len) { 25 state->overrun = 1; 26 return NULL; 27 } 28 state->remaining_buf += len; 29 state->remaining_len -= len; 30 return state; /* Must return something non-NULL. */ 31} 32 33void *StatefulMemcpy(MemcpyState *state, void *dst, uint64_t len) 34{ 35 if (state->overrun) 36 return NULL; 37 if (len > state->remaining_len) { 38 state->overrun = 1; 39 return NULL; 40 } 41 Memcpy(dst, state->remaining_buf, len); 42 state->remaining_buf += len; 43 state->remaining_len -= len; 44 return dst; 45} 46 47const void *StatefulMemcpy_r(MemcpyState *state, const void *src, uint64_t len) 48{ 49 if (state->overrun) 50 return NULL; 51 if (len > state->remaining_len) { 52 state->overrun = 1; 53 return NULL; 54 } 55 Memcpy(state->remaining_buf, src, len); 56 state->remaining_buf += len; 57 state->remaining_len -= len; 58 return src; 59} 60 61const void *StatefulMemset_r(MemcpyState *state, const uint8_t val, 62 uint64_t len) 63{ 64 if (state->overrun) 65 return NULL; 66 if (len > state->remaining_len) { 67 state->overrun = 1; 68 return NULL; 69 } 70 Memset(state->remaining_buf, val, len); 71 state->remaining_buf += len; 72 state->remaining_len -= len; 73 return state; /* Must return something non-NULL. */ 74} 75