Kyösti Mälkki (kyosti.malkki@gmail.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/1009
-gerrit
commit 0d60737c88cc8e46b99f15e483dd9a1d172980ea Author: Kyösti Mälkki kyosti.malkki@gmail.com Date: Sat May 5 18:24:14 2012 +0300
SerialICE factoring: new wrappers
Follow-up will fix bad indentation.
Change-Id: I53e2233613a604f5728f934cdd03f208ea7267ea Signed-off-by: Kyösti Mälkki kyosti.malkki@gmail.com --- qemu-0.15.x/serialice-com.c | 247 ++++++++++--------------------------------- 1 files changed, 55 insertions(+), 192 deletions(-)
diff --git a/qemu-0.15.x/serialice-com.c b/qemu-0.15.x/serialice-com.c index 82d3ce0..478d0d8 100644 --- a/qemu-0.15.x/serialice-com.c +++ b/qemu-0.15.x/serialice-com.c @@ -1,179 +1,109 @@ -uint8_t serialice_inb(uint16_t port) -{ - uint8_t ret; - uint32_t data; - int filtered; - - filtered = serialice_io_read_filter(&data, port, 1);
- if (filtered) { - ret = data & 0xff; - } else { +uint32_t serialice_io_read_wrapper(uint16_t port, unsigned int size) +{ + uint32_t ret; + switch (size) { + case 1: sprintf(s->command, "*ri%04x.b", port); // command read back: "\n00" (3 characters) serialice_command(s->command, 3); ret = (uint8_t) strtoul(s->buffer + 1, (char **)NULL, 16); - } - - serialice_log(LOG_READ | LOG_IO, ret, port, 1); - - return ret; -} - -uint16_t serialice_inw(uint16_t port) -{ - uint16_t ret; - uint32_t data; - int filtered; - - filtered = serialice_io_read_filter(&data, port, 2); - - if (filtered) { - ret = data & 0xffff; - } else { + return ret; + case 2: sprintf(s->command, "*ri%04x.w", port); // command read back: "\n0000" (5 characters) serialice_command(s->command, 5); ret = (uint16_t) strtoul(s->buffer + 1, (char **)NULL, 16); - } - - serialice_log(LOG_READ | LOG_IO, ret, port, 2); - - return ret; -} - -uint32_t serialice_inl(uint16_t port) -{ - uint32_t ret; - uint32_t data; - int filtered; - - filtered = serialice_io_read_filter(&data, port, 4); - - if (filtered) { - ret = data; - } else { + return ret; + case 4: sprintf(s->command, "*ri%04x.l", port); // command read back: "\n00000000" (9 characters) serialice_command(s->command, 9); ret = (uint32_t) strtoul(s->buffer + 1, (char **)NULL, 16); + return ret; + default: + printf("WARNING: unknown read access size %d @%08x\n", size, port); + return -1; } - - serialice_log(LOG_READ | LOG_IO, ret, port, 4); - - return ret; }
-void serialice_outb(uint8_t data, uint16_t port) +void serialice_io_write_wrapper(uint16_t port, unsigned int size, uint32_t data) { - uint32_t filtered_data = (uint32_t) data; - int filtered; - - filtered = serialice_io_write_filter(&filtered_data, port, 1); - - if (filtered) { - data = (uint8_t) filtered_data; - } else { - data = (uint8_t) filtered_data; + switch (size) { + case 1: sprintf(s->command, "*wi%04x.b=%02x", port, data); serialice_command(s->command, 0); - } - - serialice_log(LOG_WRITE | LOG_IO, data, port, 1); -} - -void serialice_outw(uint16_t data, uint16_t port) -{ - uint32_t filtered_data = (uint32_t) data; - int filtered; - - filtered = serialice_io_write_filter(&filtered_data, port, 2); - - if (filtered) { - data = (uint16_t) filtered_data; - } else { - data = (uint16_t) filtered_data; + return; + case 2: sprintf(s->command, "*wi%04x.w=%04x", port, data); serialice_command(s->command, 0); - } - - serialice_log(LOG_WRITE | LOG_IO, data, port, 2); -} - -void serialice_outl(uint32_t data, uint16_t port) -{ - uint32_t filtered_data = data; - int filtered; - - filtered = serialice_io_write_filter(&filtered_data, port, 4); - - if (filtered) { - data = filtered_data; - } else { - data = filtered_data; + return; + case 4: sprintf(s->command, "*wi%04x.l=%08x", port, data); serialice_command(s->command, 0); + return; + default: + printf("WARNING: unknown write access size %d @%08x\n", size, port); } - - serialice_log(LOG_WRITE | LOG_IO, data, port, 4); + return; }
-uint8_t serialice_readb(uint32_t addr) + +uint32_t serialice_load_wrapper(uint32_t addr, unsigned int size) { + uint32_t ret; + switch (size) { + case 1: uint8_t ret; sprintf(s->command, "*rm%08x.b", addr); // command read back: "\n00" (3 characters) serialice_command(s->command, 3); ret = (uint8_t) strtoul(s->buffer + 1, (char **)NULL, 16); return ret; -} - -uint16_t serialice_readw(uint32_t addr) -{ - uint16_t ret; + case 2: sprintf(s->command, "*rm%08x.w", addr); // command read back: "\n0000" (5 characters) serialice_command(s->command, 5); ret = (uint16_t) strtoul(s->buffer + 1, (char **)NULL, 16); return ret; -} - -uint32_t serialice_readl(uint32_t addr) -{ - uint32_t ret; + case 4: sprintf(s->command, "*rm%08x.l", addr); // command read back: "\n00000000" (9 characters) serialice_command(s->command, 9); ret = (uint32_t) strtoul(s->buffer + 1, (char **)NULL, 16); return ret; + default: + printf("WARNING: unknown read access size %d @%08x\n", size, addr); + } + return 0; }
-void serialice_writeb(uint8_t data, uint32_t addr) +void serialice_store_wrapper(uint32_t addr, unsigned int size, + uint32_t data) { + switch (size) { + case 1: sprintf(s->command, "*wm%08x.b=%02x", addr, data); serialice_command(s->command, 0); -} - -void serialice_writew(uint16_t data, uint32_t addr) -{ + break; + case 2: sprintf(s->command, "*wm%08x.w=%04x", addr, data); serialice_command(s->command, 0); -} - -void serialice_writel(uint32_t data, uint32_t addr) -{ + break; + case 4: sprintf(s->command, "*wm%08x.l=%08x", addr, data); serialice_command(s->command, 0); + break; + default: + printf("WARNING: unknown write access size %d @%08x\n", size, addr); + } }
-uint64_t serialice_rdmsr(uint32_t addr, uint32_t key) -{ - uint32_t hi, lo; - uint64_t ret; - int filtered;
- filtered = serialice_msr_filter(FILTER_READ, addr, &hi, &lo); - if (!filtered) { + +void serialice_rdmsr_wrapper(uint32_t addr, uint32_t key, + uint32_t *hi, uint32_t *lo) +{ sprintf(s->command, "*rc%08x.%08x", addr, key);
// command read back: "\n00000000.00000000" (18 characters) @@ -182,45 +112,18 @@ uint64_t serialice_rdmsr(uint32_t addr, uint32_t key) s->buffer[9] = 0; // . -> \0 hi = (uint32_t) strtoul(s->buffer + 1, (char **)NULL, 16); lo = (uint32_t) strtoul(s->buffer + 10, (char **)NULL, 16); - } - - ret = hi; - ret <<= 32; - ret |= lo; - - serialice_msr_log(LOG_READ, addr, hi, lo, filtered); - - return ret; }
-void serialice_wrmsr(uint64_t data, uint32_t addr, uint32_t key) +void serialice_wrmsr_wrapper(uint32_t addr, uint32_t key, + uint32_t hi, uint32_t lo) { - uint32_t hi, lo; - int filtered; - - hi = (data >> 32); - lo = (data & 0xffffffff); - - filtered = serialice_msr_filter(FILTER_WRITE, addr, &hi, &lo); - - if (!filtered) { sprintf(s->command, "*wc%08x.%08x=%08x.%08x", addr, key, hi, lo); serialice_command(s->command, 0); - } - - serialice_msr_log(LOG_WRITE, addr, hi, lo, filtered); }
-cpuid_regs_t serialice_cpuid(uint32_t eax, uint32_t ecx) -{ - cpuid_regs_t ret; - int filtered; - - ret.eax = eax; - ret.ebx = 0; // either set by filter or by target - ret.ecx = ecx; - ret.edx = 0; // either set by filter or by target
+void serialice_cpuid_wrapper(uint32_t eax, uint32_t ecx, cpuid_regs_t ret) +{ sprintf(s->command, "*ci%08x.%08x", eax, ecx);
// command read back: "\n000006f2.00000000.00001234.12340324" @@ -234,45 +137,5 @@ cpuid_regs_t serialice_cpuid(uint32_t eax, uint32_t ecx) ret.ebx = (uint32_t) strtoul(s->buffer + 10, (char **)NULL, 16); ret.ecx = (uint32_t) strtoul(s->buffer + 19, (char **)NULL, 16); ret.edx = (uint32_t) strtoul(s->buffer + 28, (char **)NULL, 16); - - filtered = serialice_cpuid_filter(eax, ecx, &ret); - - serialice_cpuid_log(eax, ecx, ret, filtered); - - return ret; }
-static uint32_t serialice_load_wrapper(uint32_t addr, unsigned int size) -{ - switch (size) { - case 1: - return (uint32_t) serialice_readb(addr); - case 2: - return (uint32_t) serialice_readw(addr); - case 4: - return (uint32_t) serialice_readl(addr); - default: - printf("WARNING: unknown read access size %d @%08x\n", size, addr); - } - return 0; -} - -static void serialice_store_wrapper(uint32_t addr, unsigned int size, - uint32_t data) -{ - switch (size) { - case 1: - serialice_writeb((uint8_t) data, addr); - break; - case 2: - serialice_writew((uint16_t) data, addr); - break; - case 4: - serialice_writel((uint32_t) data, addr); - break; - default: - printf("WARNING: unknown write access size %d @%08x\n", size, addr); - } -} - -