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