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