001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019 #include <hwcore/ioports.h>
020 #include <sos/klibc.h>
021
022 #include "bochs.h"
023
024
025
026 #define SOS_BOCHS_IOPORT 0xe9
027
028 sos_ret_t sos_bochs_setup(void)
029 {
030 return SOS_OK;
031 }
032
033 #define _putchar(chr) \
034 outb((chr), SOS_BOCHS_IOPORT)
035
036 sos_ret_t sos_bochs_putchar(char c)
037 {
038 _putchar(c);
039
040 return SOS_OK;
041 }
042
043 sos_ret_t sos_bochs_putstring(const char* str)
044 {
045 for ( ; str && (*str != '\0') ; str++)
046 _putchar(*str);
047
048 return SOS_OK;
049 }
050
051 sos_ret_t sos_bochs_puthex(unsigned val, int nbytes)
052 {
053 unsigned c;
054
055 #define BOCHS_PRTHEX(q) \
056 ({ unsigned char r; if ((q) >= 10) r='a'+(q)-10; \
057 else r='0'+(q); _putchar(r); })
058
059 switch (nbytes)
060 {
061 case 4:
062 c = (val >> 24) & 0xff;
063 BOCHS_PRTHEX((c >> 4)&0xf);
064 BOCHS_PRTHEX(c&0xf);
065 case 3:
066 c = (val >> 16) & 0xff;
067 BOCHS_PRTHEX((c >> 4)&0xf);
068 BOCHS_PRTHEX(c&0xf);
069 case 2:
070 c = (val >> 8) & 0xff;
071 BOCHS_PRTHEX((c >> 4)&0xf);
072 BOCHS_PRTHEX(c&0xf);
073 case 1:
074 c = val & 0xff;
075 BOCHS_PRTHEX((c >> 4)&0xf);
076 BOCHS_PRTHEX(c&0xf);
077 }
078
079 return SOS_OK;
080 }
081
082
083 sos_ret_t sos_bochs_hexdump(const void* addr, int nbytes)
084 {
085 int offs;
086 for (offs = 0 ; offs < nbytes ; offs++)
087 {
088 const unsigned char *c;
089
090 if ((offs % 16) == 0)
091 {
092 sos_bochs_putstring("0x");
093 sos_bochs_puthex(offs, 4);
094 }
095
096 if ((offs % 8) == 0)
097 sos_bochs_putstring(" ");
098
099 c = (const unsigned char*)(addr + offs);
100 sos_bochs_puthex(*c, 1);
101 sos_bochs_putstring(" ");
102
103 if (((offs + 1) % 16) == 0)
104 sos_bochs_putstring("\n");
105 }
106
107 if (offs % 16)
108 sos_bochs_putstring("\n");
109
110 return SOS_OK;
111 }
112
113
114 sos_ret_t sos_bochs_printf(const char *format, ...)
115 {
116 char buff[256];
117 va_list ap;
118
119 va_start(ap, format);
120 vsnprintf(buff, sizeof(buff), format, ap);
121 va_end(ap);
122
123 return sos_bochs_putstring(buff);
124 }