From ee32b89ea094a447b07a91342d8e787293528254 Mon Sep 17 00:00:00 2001
From: Jerome Leveque <leveque.jerome@gmail.com>
Date: Tue, 13 Mar 2012 22:59:23 +0000
Subject: [PATCH] Ticket #8377: Fix page fault using user_memcpy
---
src/add-ons/kernel/generic/mpu401/mpu401.c | 11 ++++++++++-
1 files changed, 10 insertions(+), 1 deletions(-)
diff --git a/src/add-ons/kernel/generic/mpu401/mpu401.c b/src/add-ons/kernel/generic/mpu401/mpu401.c
index 7bf72c9..e68c99e 100644
a
|
b
|
midi_read(void *cookie, off_t pos, void *buffer, size_t *num_bytes)
|
279 | 279 | |
280 | 280 | unsigned char *data; |
281 | 281 | unsigned int i; |
282 | | cpu_status status; |
| 282 | cpu_status status __attribute__((unused)); |
283 | 283 | status_t bestat; |
284 | 284 | mpu401device *mpu_device = (mpu401device *)cookie; |
285 | 285 | |
… |
… |
midi_read(void *cookie, off_t pos, void *buffer, size_t *num_bytes)
|
298 | 298 | *num_bytes = 1; |
299 | 299 | return B_INTERRUPTED; |
300 | 300 | } else { |
| 301 | #ifdef __HAIKU__ |
| 302 | if (user_memcpy(data+i, &(mpubuffer[mbuf_start]), |
| 303 | sizeof(unsigned char)) == B_OK) { |
| 304 | #else |
301 | 305 | status = lock(); |
302 | 306 | *(data+i) = mpubuffer[mbuf_start]; |
| 307 | #endif |
303 | 308 | i++; |
304 | 309 | mbuf_start++; // pointer to data in ringbuffer |
305 | 310 | if (mbuf_start >= (MBUF_ELEMENTS-1)) |
… |
… |
midi_read(void *cookie, off_t pos, void *buffer, size_t *num_bytes)
|
307 | 312 | *num_bytes = 1; // How many bytes are being returned in buffer |
308 | 313 | if (mbuf_bytes > 0) |
309 | 314 | mbuf_bytes--; // bytes read from buffer, so decrement buffer count |
| 315 | #ifdef __HAIKU__ |
| 316 | } |
| 317 | #else |
310 | 318 | unlock(status); |
| 319 | #endif |
311 | 320 | //PRINT(("bytes in buffer: %d\n",mbuf_bytes)); |
312 | 321 | } |
313 | 322 | |