74
74
#define MOUSE_STATUS_ENABLED 0x20
75
75
#define MOUSE_STATUS_SCALE21 0x10
76
76
77
- #define PS2_QUEUE_SIZE 16 /* Buffer size required by PS/2 protocol */
77
+ /*
78
+ * PS/2 buffer size. Keep 256 bytes for compatibility with
79
+ * older QEMU versions.
80
+ */
81
+ #define PS2_BUFFER_SIZE 256
82
+ #define PS2_QUEUE_SIZE 16 /* Queue size required by PS/2 protocol */
78
83
79
84
/* Bits for 'modifiers' field in PS2KbdState */
80
85
#define MOD_CTRL_L (1 << 0)
85
90
#define MOD_ALT_R (1 << 5)
86
91
87
92
typedef struct {
88
- /* Keep the data array 256 bytes long, which compatibility
89
- with older qemu versions. */
90
- uint8_t data [256 ];
93
+ uint8_t data [PS2_BUFFER_SIZE ];
91
94
int rptr , wptr , count ;
92
95
} PS2Queue ;
93
96
@@ -200,8 +203,9 @@ void ps2_queue_noirq(PS2State *s, int b)
200
203
}
201
204
202
205
q -> data [q -> wptr ] = b ;
203
- if (++ q -> wptr == PS2_QUEUE_SIZE )
206
+ if (++ q -> wptr == PS2_BUFFER_SIZE ) {
204
207
q -> wptr = 0 ;
208
+ }
205
209
q -> count ++ ;
206
210
}
207
211
@@ -509,13 +513,15 @@ uint32_t ps2_read_data(PS2State *s)
509
513
(needed for EMM386) */
510
514
/* XXX: need a timer to do things correctly */
511
515
index = q -> rptr - 1 ;
512
- if (index < 0 )
513
- index = PS2_QUEUE_SIZE - 1 ;
516
+ if (index < 0 ) {
517
+ index = PS2_BUFFER_SIZE - 1 ;
518
+ }
514
519
val = q -> data [index ];
515
520
} else {
516
521
val = q -> data [q -> rptr ];
517
- if (++ q -> rptr == PS2_QUEUE_SIZE )
522
+ if (++ q -> rptr == PS2_BUFFER_SIZE ) {
518
523
q -> rptr = 0 ;
524
+ }
519
525
q -> count -- ;
520
526
/* reading deasserts IRQ */
521
527
s -> update_irq (s -> update_arg , 0 );
@@ -926,30 +932,17 @@ static void ps2_common_reset(PS2State *s)
926
932
static void ps2_common_post_load (PS2State * s )
927
933
{
928
934
PS2Queue * q = & s -> queue ;
929
- uint8_t i , size ;
930
- uint8_t tmp_data [PS2_QUEUE_SIZE ];
931
935
932
- /* set the useful data buffer queue size, < PS2_QUEUE_SIZE */
933
- size = q -> count ;
936
+ /* set the useful data buffer queue size <= PS2_QUEUE_SIZE */
934
937
if (q -> count < 0 ) {
935
- size = 0 ;
938
+ q -> count = 0 ;
936
939
} else if (q -> count > PS2_QUEUE_SIZE ) {
937
- size = PS2_QUEUE_SIZE ;
938
- }
939
-
940
- /* move the queue elements to the start of data array */
941
- for (i = 0 ; i < size ; i ++ ) {
942
- if (q -> rptr < 0 || q -> rptr >= sizeof (q -> data )) {
943
- q -> rptr = 0 ;
944
- }
945
- tmp_data [i ] = q -> data [q -> rptr ++ ];
940
+ q -> count = PS2_QUEUE_SIZE ;
946
941
}
947
- memcpy (q -> data , tmp_data , size );
948
942
949
- /* reset rptr/wptr/count */
950
- q -> rptr = 0 ;
951
- q -> wptr = (size == PS2_QUEUE_SIZE ) ? 0 : size ;
952
- q -> count = size ;
943
+ /* sanitize rptr and recalculate wptr */
944
+ q -> rptr = q -> rptr & (PS2_BUFFER_SIZE - 1 );
945
+ q -> wptr = (q -> rptr + q -> count ) & (PS2_BUFFER_SIZE - 1 );
953
946
}
954
947
955
948
static void ps2_kbd_reset (void * opaque )
@@ -1053,22 +1046,11 @@ static int ps2_kbd_post_load(void* opaque, int version_id)
1053
1046
return 0 ;
1054
1047
}
1055
1048
1056
- static int ps2_kbd_pre_save (void * opaque )
1057
- {
1058
- PS2KbdState * s = (PS2KbdState * )opaque ;
1059
- PS2State * ps2 = & s -> common ;
1060
-
1061
- ps2_common_post_load (ps2 );
1062
-
1063
- return 0 ;
1064
- }
1065
-
1066
1049
static const VMStateDescription vmstate_ps2_keyboard = {
1067
1050
.name = "ps2kbd" ,
1068
1051
.version_id = 3 ,
1069
1052
.minimum_version_id = 2 ,
1070
1053
.post_load = ps2_kbd_post_load ,
1071
- .pre_save = ps2_kbd_pre_save ,
1072
1054
.fields = (VMStateField []) {
1073
1055
VMSTATE_STRUCT (common , PS2KbdState , 0 , vmstate_ps2_common , PS2State ),
1074
1056
VMSTATE_INT32 (scan_enabled , PS2KbdState ),
@@ -1093,22 +1075,11 @@ static int ps2_mouse_post_load(void *opaque, int version_id)
1093
1075
return 0 ;
1094
1076
}
1095
1077
1096
- static int ps2_mouse_pre_save (void * opaque )
1097
- {
1098
- PS2MouseState * s = (PS2MouseState * )opaque ;
1099
- PS2State * ps2 = & s -> common ;
1100
-
1101
- ps2_common_post_load (ps2 );
1102
-
1103
- return 0 ;
1104
- }
1105
-
1106
1078
static const VMStateDescription vmstate_ps2_mouse = {
1107
1079
.name = "ps2mouse" ,
1108
1080
.version_id = 2 ,
1109
1081
.minimum_version_id = 2 ,
1110
1082
.post_load = ps2_mouse_post_load ,
1111
- .pre_save = ps2_mouse_pre_save ,
1112
1083
.fields = (VMStateField []) {
1113
1084
VMSTATE_STRUCT (common , PS2MouseState , 0 , vmstate_ps2_common , PS2State ),
1114
1085
VMSTATE_UINT8 (mouse_status , PS2MouseState ),
0 commit comments