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