mirror of
https://github.com/ipxe/ipxe
synced 2026-01-21 18:30:56 +03:00
Almost all image consumers do not need to modify the content of the image. Now that the image data is a pointer type (rather than the opaque userptr_t type), we can rely on the compiler to enforce this at build time. Change the .data field to be a const pointer, so that the compiler can verify that image consumers do not modify the image content. Provide a transparent .rwdata field for consumers who have a legitimate (and now explicit) reason to modify the image content. We do not attempt to impose any runtime restriction on checking whether or not an image is writable. The only existing instances of genuinely read-only images are the various unit test images, and it is acceptable for defective test cases to result in a segfault rather than a runtime error. Signed-off-by: Michael Brown <mcb30@ipxe.org>
68 lines
1.7 KiB
C
68 lines
1.7 KiB
C
#ifndef _PIXBUF_TEST_H
|
|
#define _PIXBUF_TEST_H
|
|
|
|
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
|
|
|
#include <stdint.h>
|
|
#include <ipxe/refcnt.h>
|
|
#include <ipxe/image.h>
|
|
#include <ipxe/test.h>
|
|
|
|
/** A pixel buffer test */
|
|
struct pixel_buffer_test {
|
|
/** Image type */
|
|
struct image_type *type;
|
|
/** Source image */
|
|
struct image *image;
|
|
/** Pixel data */
|
|
const uint32_t *data;
|
|
/** Length of pixel data */
|
|
size_t len;
|
|
/** Width */
|
|
unsigned int width;
|
|
/** Height */
|
|
unsigned int height;
|
|
};
|
|
|
|
/**
|
|
* Define a pixel buffer test
|
|
*
|
|
* @v _name Test name
|
|
* @v _type Test image file type
|
|
* @v _file Test image file data
|
|
* @v _width Expected pixel buffer width
|
|
* @v _height Expected pixel buffer height
|
|
* @v _data Expected pixel buffer data
|
|
* @ret test Pixel buffer test
|
|
*/
|
|
#define PIX( _name, _type, _file, _width, _height, _data ) \
|
|
static const char _name ## __file[] = _file; \
|
|
static const uint32_t _name ## __data[] = _data; \
|
|
static struct image _name ## __image = { \
|
|
.refcnt = REF_INIT ( ref_no_free ), \
|
|
.name = #_name, \
|
|
.flags = ( IMAGE_STATIC | IMAGE_STATIC_NAME ), \
|
|
.data = _name ## __file, \
|
|
.len = sizeof ( _name ## __file ), \
|
|
}; \
|
|
static struct pixel_buffer_test _name = { \
|
|
.type = _type, \
|
|
.image = & _name ## __image, \
|
|
.data = _name ## __data, \
|
|
.len = sizeof ( _name ## __data ), \
|
|
.width = _width, \
|
|
.height = _height, \
|
|
};
|
|
|
|
extern void pixbuf_okx ( struct pixel_buffer_test *test, const char *file,
|
|
unsigned int line );
|
|
|
|
/**
|
|
* Report pixel buffer test result
|
|
*
|
|
* @v test Pixel buffer test
|
|
*/
|
|
#define pixbuf_ok( test ) pixbuf_okx ( test, __FILE__, __LINE__ )
|
|
|
|
#endif /* _PIXBUF_TEST_H */
|