if (ret != ERR_SUCCESS) goto cleanup;
word_t *modes = (word_t*)((info.videomodes[1] << 4) + info.videomodes[0]);
- ret = read_physical(modes, available_modes, sizeof(word_t) * MAX_NUM_MODES);
+ word_t *numbers = __builtin_alloca(sizeof(word_t) * MAX_NUM_MODES);
+ ret = read_physical(modes, numbers, sizeof(word_t) * MAX_NUM_MODES);
if (ret != ERR_SUCCESS) goto cleanup;
num_available_modes = 0;
- for (i = 0; (available_mode_numbers[i] != 0xFFFF) && (i < MAX_NUM_MODES); i++)
+ for (i = 0; (numbers[i] != 0xFFFF) && (i < MAX_NUM_MODES); i++)
{
vbe_mode_info_t mode_info;
regs.eax = 0x4F01;
- regs.ecx = available_mode_numbers[i];
+ regs.ecx = numbers[i];
regs.es = data_segment;
regs.edi = 0x0000;
vm86_interrupt(0x10, ®s);
-
if (regs.eax != 0x4F) continue;
- if (mode_info.mem_model_type != 0 && mode_info.mem_model_type != 4 && mode_info.mem_model_type != 6) continue;
ret = read_physical((void*)(data_segment << 4), &mode_info, sizeof(vbe_mode_info_t));
+ if (mode_info.mem_model_type != 0 && mode_info.mem_model_type != 4 && mode_info.mem_model_type != 6) continue;
+
+ available_mode_numbers[num_available_modes] = numbers[i];
+ available_modes[num_available_modes] = mode_info;
num_available_modes++;
}
if (ret != ERR_SUCCESS) return ret;
device->current_mode = mode_info;
+ return ERR_SUCCESS;
}
else
{
list[0] = num_available_modes;
- for (i = 0; i < num_available_modes && out_length >= (i * sizeof(dword_t)); i++)
+ for (i = 0; i < num_available_modes && out_length >= ((i + 2) * sizeof(dword_t)); i++)
{
list[i + 1] = available_mode_numbers[i];
}