提交 e6e1ace9 编写于 作者: H 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: NH. Peter Anvin <hpa@zytor.com>
上级 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% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册