Commit e6e1ace9 authored by H. Peter Anvin's avatar H. Peter Anvin

x86 setup: sizeof() is unsigned, unbreak comparisons

We use signed values for limit checking since the values can go
negative under certain circumstances.  However, sizeof() is unsigned
and forces the comparison to be unsigned, so move the comparison into
the heap_free() macros so we can ensure it is a signed comparison.
Signed-off-by: default avatarH. Peter Anvin <hpa@zytor.com>
parent 6b6815c6
...@@ -216,9 +216,9 @@ static inline char *__get_heap(size_t s, size_t a, size_t n) ...@@ -216,9 +216,9 @@ static inline char *__get_heap(size_t s, size_t a, size_t n)
#define GET_HEAP(type, n) \ #define GET_HEAP(type, n) \
((type *)__get_heap(sizeof(type),__alignof__(type),(n))) ((type *)__get_heap(sizeof(type),__alignof__(type),(n)))
static inline int heap_free(void) static inline bool heap_free(size_t n)
{ {
return heap_end-HEAP; return (int)(heap_end-HEAP) >= (int)n;
} }
/* copy.S */ /* copy.S */
......
...@@ -79,7 +79,7 @@ static int bios_probe(void) ...@@ -79,7 +79,7 @@ static int bios_probe(void)
video_bios.modes = GET_HEAP(struct mode_info, 0); video_bios.modes = GET_HEAP(struct mode_info, 0);
for (mode = 0x14; mode <= 0x7f; mode++) { for (mode = 0x14; mode <= 0x7f; mode++) {
if (heap_free() < sizeof(struct mode_info)) if (!heap_free(sizeof(struct mode_info)))
break; break;
if (mode_defined(VIDEO_FIRST_BIOS+mode)) if (mode_defined(VIDEO_FIRST_BIOS+mode))
......
...@@ -57,7 +57,7 @@ static int vesa_probe(void) ...@@ -57,7 +57,7 @@ static int vesa_probe(void)
while ((mode = rdfs16(mode_ptr)) != 0xffff) { while ((mode = rdfs16(mode_ptr)) != 0xffff) {
mode_ptr += 2; mode_ptr += 2;
if (heap_free() < sizeof(struct mode_info)) if (!heap_free(sizeof(struct mode_info)))
break; /* Heap full, can't save mode info */ break; /* Heap full, can't save mode info */
if (mode & ~0x1ff) if (mode & ~0x1ff)
......
...@@ -371,7 +371,7 @@ static void save_screen(void) ...@@ -371,7 +371,7 @@ static void save_screen(void)
saved.curx = boot_params.screen_info.orig_x; saved.curx = boot_params.screen_info.orig_x;
saved.cury = boot_params.screen_info.orig_y; saved.cury = boot_params.screen_info.orig_y;
if (heap_free() < saved.x*saved.y*sizeof(u16)+512) if (!heap_free(saved.x*saved.y*sizeof(u16)+512))
return; /* Not enough heap to save the screen */ return; /* Not enough heap to save the screen */
saved.data = GET_HEAP(u16, saved.x*saved.y); saved.data = GET_HEAP(u16, saved.x*saved.y);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment