j
: Next unread message k
: Previous unread message j a
: Jump to all threads
j l
: Jump to MailingList overview
convert_to_ints() converts all the string resolutions in the resolutions property of the QEMU,VGA node and converts them to an int array. Needed to support the VGA driver.
Signed-off-by: John Arbuckle programmingkidx@gmail.com --- v2 changes: Added function resolutions_property_available() - used to determine if there is a resolutions property. Removed convert_to_ints() prototype.
arch/ppc/qemu/init.c | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 108 insertions(+), 1 deletion(-)
diff --git a/arch/ppc/qemu/init.c b/arch/ppc/qemu/init.c index 6f21814..b950a61 100644 --- a/arch/ppc/qemu/init.c +++ b/arch/ppc/qemu/init.c @@ -619,6 +619,106 @@ id_cpu(void) } }
+ +/* convert ASCII string to number */ +static int atoi(const char *str) +{ + int result = 0; + while (*str) { + result = result * 10 + *str - '0'; + str++; + } + return result; +} + + +/* Converts the QEMU,VGA node's resolutions property to int's*/ +static void convert_to_ints(void) +{ + const int max_buffer_size = 200; + char *orig_property; + char buffer[max_buffer_size]; + int index, count, value, addr, len; + char c; + + count = 0; + index = 0; + push_str("/pci/QEMU,VGA"); + fword("find-package"); + if (POP() == 0) { + fword("cr"); + push_str("convert-to-ints(): could not find package /pci/QEMU,VGA!"); + fword("type"); + fword("cr"); + return; + } + fword("active-package!"); + push_str("resolutions"); + fword("active-package"); + fword("get-package-property"); + if (POP() == -1) { + fword("cr"); + push_str("convert-to-ints(): could not find resolutions property!"); + fword("type"); + fword("cr"); + return; + } + len = POP(); + addr = POP(); + orig_property = (char *) malloc(len); + strncpy(orig_property, (char *)addr, len); + c = orig_property[0]; + while(c != '\0') { + if (c == 'x' || c == ',') { + buffer[index] = '\0'; + value = atoi(buffer); + count++; + if (count == 3) { + count = 1; + fword("encode+"); + continue; + } + PUSH(value); + fword("encode-int"); + index = -1; + } + else { + buffer[index] = c; + } + index++; + c = *(++orig_property); + } + fword("encode+"); + push_str("resolutions"); + fword("property"); + free(orig_property); +} + + +/* Determines if there is a resolutions property in the options node*/ +static bool resolutions_property_available(void) +{ + push_str("/options"); + fword("find-package"); + if (POP() != -1) { + return false; + } + fword("active-package!"); + push_str("resolutions"); + fword("active-package"); + fword("get-package-property"); + if (POP() == -1) { + return false; + } + + /* Remove str-addr and str-len */ + POP(); + POP(); + + return true; +} + + static void go(void); unsigned int start_elf(unsigned long entry_point, unsigned long param);
@@ -631,7 +731,13 @@ go(void) if (find_dev("/rom/macos")) { fword("insert-copyright-property"); } - + + /* Used to support user specified resolutions */ + if (resolutions_property_available()) { + fword("copy-resolutions-property"); + convert_to_ints(); + } + feval("saved-program-state >sps.entry @"); addr = POP();
@@ -1078,3 +1184,4 @@ arch_of_init(void) bind_func("platform-boot", boot); bind_func("(go)", go); } +