1 /* Copyright (c) 2014 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  * Stub implementations of stream APIs.
6  */
7 
8 #include <stdint.h>
9 
10 #define _STUB_IMPLEMENTATION_
11 
12 #include "vboot_api.h"
13 
14 /* The stub implementation assumes 512-byte disk sectors */
15 #define LBA_BYTES 512
16 
17 /* Internal struct to simulate a stream for sector-based disks */
18 struct disk_stream {
19 	/* Disk handle */
20 	VbExDiskHandle_t handle;
21 
22 	/* Next sector to read */
23 	uint64_t sector;
24 
25 	/* Number of sectors left in partition */
26 	uint64_t sectors_left;
27 };
28 
VbExStreamOpen(VbExDiskHandle_t handle,uint64_t lba_start,uint64_t lba_count,VbExStream_t * stream)29 VbError_t VbExStreamOpen(VbExDiskHandle_t handle, uint64_t lba_start,
30 			 uint64_t lba_count, VbExStream_t *stream)
31 {
32 	struct disk_stream *s;
33 
34 	if (!handle) {
35 		*stream = NULL;
36 		return VBERROR_UNKNOWN;
37 	}
38 
39 	s = VbExMalloc(sizeof(*s));
40 	s->handle = handle;
41 	s->sector = lba_start;
42 	s->sectors_left = lba_count;
43 
44 	*stream = (void *)s;
45 
46 	return VBERROR_SUCCESS;
47 }
48 
VbExStreamRead(VbExStream_t stream,uint32_t bytes,void * buffer)49 VbError_t VbExStreamRead(VbExStream_t stream, uint32_t bytes, void *buffer)
50 {
51 	struct disk_stream *s = (struct disk_stream *)stream;
52 	uint64_t sectors;
53 	VbError_t rv;
54 
55 	if (!s)
56 		return VBERROR_UNKNOWN;
57 
58 	/* For now, require reads to be a multiple of the LBA size */
59 	if (bytes % LBA_BYTES)
60 		return VBERROR_UNKNOWN;
61 
62 	/* Fail on overflow */
63 	sectors = bytes / LBA_BYTES;
64 	if (sectors > s->sectors_left)
65 		return VBERROR_UNKNOWN;
66 
67 	rv = VbExDiskRead(s->handle, s->sector, sectors, buffer);
68 	if (rv != VBERROR_SUCCESS)
69 		return rv;
70 
71 	s->sector += sectors;
72 	s->sectors_left -= sectors;
73 
74 	return VBERROR_SUCCESS;
75 }
76 
VbExStreamClose(VbExStream_t stream)77 void VbExStreamClose(VbExStream_t stream)
78 {
79 	struct disk_stream *s = (struct disk_stream *)stream;
80 
81 	/* Allow freeing a null pointer */
82 	if (!s)
83 		return;
84 
85 	VbExFree(s);
86 	return;
87 }
88