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 #define _putchar(chr) \ <<
034 outb((chr), SOS_BOCHS_IOPORT) <<
035 <<
036 sos_ret_t sos_bochs_putchar(char c) <<
037 { <<
038 _putchar(c); <<
039 033
040 return SOS_OK; !! 034 #define sos_bochs_putchar(chr) \
041 } !! 035 outb((chr), SOS_BOCHS_IOPORT)
042 036
043 sos_ret_t sos_bochs_putstring(const char* str) 037 sos_ret_t sos_bochs_putstring(const char* str)
044 { 038 {
045 for ( ; str && (*str != '\0') ; str++) 039 for ( ; str && (*str != '\0') ; str++)
046 _putchar(*str); !! 040 sos_bochs_putchar(*str);
047 041
048 return SOS_OK; 042 return SOS_OK;
049 } 043 }
050 044
>> 045
051 sos_ret_t sos_bochs_puthex(unsigned val, int n 046 sos_ret_t sos_bochs_puthex(unsigned val, int nbytes)
052 { 047 {
053 unsigned c; 048 unsigned c;
054 049
055 #define BOCHS_PRTHEX(q) \ 050 #define BOCHS_PRTHEX(q) \
056 ({ unsigned char r; if ((q) >= 10) r='a'+(q) 051 ({ unsigned char r; if ((q) >= 10) r='a'+(q)-10; \
057 else r='0'+(q); _putchar(r); }) !! 052 else r='0'+(q); sos_bochs_putchar(r); })
058 053
059 switch (nbytes) 054 switch (nbytes)
060 { 055 {
061 case 4: 056 case 4:
062 c = (val >> 24) & 0xff; 057 c = (val >> 24) & 0xff;
063 BOCHS_PRTHEX((c >> 4)&0xf); 058 BOCHS_PRTHEX((c >> 4)&0xf);
064 BOCHS_PRTHEX(c&0xf); 059 BOCHS_PRTHEX(c&0xf);
065 case 3: 060 case 3:
066 c = (val >> 16) & 0xff; 061 c = (val >> 16) & 0xff;
067 BOCHS_PRTHEX((c >> 4)&0xf); 062 BOCHS_PRTHEX((c >> 4)&0xf);
068 BOCHS_PRTHEX(c&0xf); 063 BOCHS_PRTHEX(c&0xf);
069 case 2: 064 case 2:
070 c = (val >> 8) & 0xff; 065 c = (val >> 8) & 0xff;
071 BOCHS_PRTHEX((c >> 4)&0xf); 066 BOCHS_PRTHEX((c >> 4)&0xf);
072 BOCHS_PRTHEX(c&0xf); 067 BOCHS_PRTHEX(c&0xf);
073 case 1: 068 case 1:
074 c = val & 0xff; 069 c = val & 0xff;
075 BOCHS_PRTHEX((c >> 4)&0xf); 070 BOCHS_PRTHEX((c >> 4)&0xf);
076 BOCHS_PRTHEX(c&0xf); 071 BOCHS_PRTHEX(c&0xf);
077 } 072 }
078 073
079 return SOS_OK; 074 return SOS_OK;
080 } 075 }
081 076
082 077
083 sos_ret_t sos_bochs_hexdump(const void* addr, 078 sos_ret_t sos_bochs_hexdump(const void* addr, int nbytes)
084 { 079 {
085 int offs; 080 int offs;
086 for (offs = 0 ; offs < nbytes ; offs++) 081 for (offs = 0 ; offs < nbytes ; offs++)
087 { 082 {
088 const unsigned char *c; 083 const unsigned char *c;
089 084
090 if ((offs % 16) == 0) 085 if ((offs % 16) == 0)
091 { 086 {
092 sos_bochs_putstring("0x"); 087 sos_bochs_putstring("0x");
093 sos_bochs_puthex(offs, 4); 088 sos_bochs_puthex(offs, 4);
094 } 089 }
095 090
096 if ((offs % 8) == 0) 091 if ((offs % 8) == 0)
097 sos_bochs_putstring(" "); 092 sos_bochs_putstring(" ");
098 093
099 c = (const unsigned char*)(addr + offs); 094 c = (const unsigned char*)(addr + offs);
100 sos_bochs_puthex(*c, 1); 095 sos_bochs_puthex(*c, 1);
101 sos_bochs_putstring(" "); 096 sos_bochs_putstring(" ");
102 097
103 if (((offs + 1) % 16) == 0) 098 if (((offs + 1) % 16) == 0)
104 sos_bochs_putstring("\n"); 099 sos_bochs_putstring("\n");
105 } 100 }
106 101
107 if (offs % 16) 102 if (offs % 16)
108 sos_bochs_putstring("\n"); 103 sos_bochs_putstring("\n");
109 104
110 return SOS_OK; 105 return SOS_OK;
111 } 106 }
112 107
113 108
114 sos_ret_t sos_bochs_printf(const char *format, 109 sos_ret_t sos_bochs_printf(const char *format, ...)
115 { 110 {
116 char buff[256]; 111 char buff[256];
117 va_list ap; 112 va_list ap;
118 113
119 va_start(ap, format); 114 va_start(ap, format);
120 vsnprintf(buff, sizeof(buff), format, ap); 115 vsnprintf(buff, sizeof(buff), format, ap);
121 va_end(ap); 116 va_end(ap);
122 117
123 return sos_bochs_putstring(buff); 118 return sos_bochs_putstring(buff);
124 } 119 }