aboutsummaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorBill Paul <wpaul@FreeBSD.org>2003-12-13 07:41:12 +0000
committerBill Paul <wpaul@FreeBSD.org>2003-12-13 07:41:12 +0000
commitd3eb09f083535c8c7d2c2a4f0261dfe4bfdd18f0 (patch)
tree03832d9c290b781875682251ae26613ab2e8c44b /sys
parent7359dfc0b17a150818f82a4a833080f33b52c585 (diff)
Notes
Diffstat (limited to 'sys')
-rw-r--r--sys/compat/ndis/ntoskrnl_var.h8
-rw-r--r--sys/compat/ndis/subr_ndis.c47
-rw-r--r--sys/compat/ndis/subr_ntoskrnl.c81
3 files changed, 103 insertions, 33 deletions
diff --git a/sys/compat/ndis/ntoskrnl_var.h b/sys/compat/ndis/ntoskrnl_var.h
index 236d6fd3610c..68c79bd197eb 100644
--- a/sys/compat/ndis/ntoskrnl_var.h
+++ b/sys/compat/ndis/ntoskrnl_var.h
@@ -54,6 +54,13 @@ union slist_header {
typedef union slist_header slist_header;
+struct list_entry {
+ struct list_entry *nle_flink;
+ struct list_entry *nle_blink;
+};
+
+typedef struct list_entry list_entry;
+
struct general_lookaside {
slist_header gl_listhead;
uint16_t gl_depth;
@@ -73,6 +80,7 @@ struct general_lookaside {
uint32_t gl_size;
void *gl_allocfunc;
void *gl_freefunc;
+ list_entry gl_listent;
uint32_t gl_lasttotallocs;
union {
uint32_t gl_lastallocmisses;
diff --git a/sys/compat/ndis/subr_ndis.c b/sys/compat/ndis/subr_ndis.c
index d01866b3cd0f..c6e9a489db8a 100644
--- a/sys/compat/ndis/subr_ndis.c
+++ b/sys/compat/ndis/subr_ndis.c
@@ -209,6 +209,9 @@ __stdcall static ndis_list_entry *ndis_insert_tail(ndis_list_entry *,
__stdcall static uint8_t ndis_sync_with_intr(ndis_miniport_interrupt *,
void *, void *);
__stdcall static void ndis_time(uint64_t *);
+__stdcall static void ndis_init_string(ndis_unicode_string **, char *);
+__stdcall static void ndis_free_string(ndis_unicode_string *);
+__stdcall static ndis_status ndis_remove_miniport(ndis_handle *);
__stdcall static void dummy(void);
@@ -1851,11 +1854,50 @@ ndis_time(tval)
{
struct timespec ts;
nanotime(&ts);
- *tval = (ts.tv_nsec / 100) + (ts.tv_nsec * 10000000);
+ *tval = (ts.tv_nsec / 100) + (ts.tv_nsec * 10000000);
+ *tval += 11644473600;
return;
}
__stdcall static void
+ndis_init_string(dst, src)
+ ndis_unicode_string **dst;
+ char *src;
+{
+ ndis_unicode_string *u;
+
+ u = malloc(sizeof(ndis_unicode_string), M_DEVBUF, M_NOWAIT);
+ if (u == NULL)
+ return;
+ u->nus_buf = NULL;
+ if (ndis_ascii_to_unicode(src, &u->nus_buf)) {
+ free(u, M_DEVBUF);
+ return;
+ }
+ u->nus_len = u->nus_maxlen = strlen(src) * 2;
+ return;
+}
+
+__stdcall static void
+ndis_free_string(str)
+ ndis_unicode_string *str;
+{
+ if (str == NULL)
+ return;
+ if (str->nus_buf != NULL)
+ free(str->nus_buf, M_DEVBUF);
+ free(str, M_DEVBUF);
+ return;
+}
+
+__stdcall static ndis_status
+ndis_remove_miniport(adapter)
+ ndis_handle *adapter;
+{
+ return(NDIS_STATUS_SUCCESS);
+}
+
+__stdcall static void
dummy()
{
printf ("NDIS dummy called...\n");
@@ -1863,6 +1905,9 @@ dummy()
}
image_patch_table ndis_functbl[] = {
+ { "NdisMRemoveMiniport", (FUNC)ndis_remove_miniport },
+ { "NdisInitializeString", (FUNC)ndis_init_string },
+ { "NdisFreeString", (FUNC)ndis_free_string },
{ "NdisGetCurrentSystemTime", (FUNC)ndis_time },
{ "NdisMSynchronizeWithInterrupt", (FUNC)ndis_sync_with_intr },
{ "NdisMAllocateSharedMemoryAsync", (FUNC)ndis_alloc_sharedmem_async },
diff --git a/sys/compat/ndis/subr_ntoskrnl.c b/sys/compat/ndis/subr_ntoskrnl.c
index 3a1d12585e9b..e9fcb3bae2ec 100644
--- a/sys/compat/ndis/subr_ntoskrnl.c
+++ b/sys/compat/ndis/subr_ntoskrnl.c
@@ -95,11 +95,13 @@ __stdcall static void ntoskrnl_init_nplookaside(npaged_lookaside_list *,
lookaside_alloc_func *, lookaside_free_func *,
uint32_t, size_t, uint32_t, uint16_t);
__stdcall static void ntoskrnl_delete_nplookaside(npaged_lookaside_list *);
-static slist_entry *ntoskrnl_push_slist(slist_entry *, slist_entry *);
-static slist_entry *ntoskrnl_pop_slist(slist_entry *);
-static slist_entry *ntoskrnl_push_slist_ex(slist_entry *,
- slist_entry *, kspin_lock *);
-static slist_entry *ntoskrnl_pop_slist_ex(slist_entry *, kspin_lock *);
+__stdcall static slist_entry *ntoskrnl_push_slist(/*slist_entry *,
+ slist_entry * */ void);
+__stdcall static slist_entry *ntoskrnl_pop_slist(/*slist_entry * */ void);
+__stdcall static slist_entry *ntoskrnl_push_slist_ex(/*slist_entry *,
+ slist_entry *,*/ kspin_lock *);
+__stdcall static slist_entry *ntoskrnl_pop_slist_ex(/*slist_entry *,
+ kspin_lock * */void);
__stdcall static void dummy(void);
static struct mtx ntoskrnl_interlock;
@@ -434,64 +436,79 @@ ntoskrnl_delete_nplookaside(lookaside)
/*
* Note: the interlocked slist push and pop routines are
- * declared to be _fastcall in Windows, which means they
- * use the _cdecl calling convention here.
+ * declared to be _fastcall in Windows. gcc 3.4 is supposed
+ * to have support for this calling convention, however we
+ * don't have that version available yet, so we kludge things
+ * up using some inline assembly.
*/
-static slist_entry *
-ntoskrnl_push_slist(head, entry)
- slist_entry *head;
- slist_entry *entry;
+
+__stdcall static slist_entry *
+ntoskrnl_push_slist(/*head, entry*/ void)
{
+ slist_header *head;
+ slist_entry *entry;
slist_entry *oldhead;
+
+ __asm__("movl %%ecx, %%ecx" : "=c" (head));
+ __asm__("movl %%edx, %%edx" : "=d" (entry));
+
mtx_lock(&ntoskrnl_interlock);
- oldhead = head->sl_next;
- entry->sl_next = head->sl_next;
- head->sl_next = entry;
+ oldhead = head->slh_list.slh_next;
+ entry->sl_next = head->slh_list.slh_next;
+ head->slh_list.slh_next = entry;
mtx_unlock(&ntoskrnl_interlock);
return(oldhead);
}
-static slist_entry *
-ntoskrnl_pop_slist(head)
- slist_entry *head;
+__stdcall static slist_entry *
+ntoskrnl_pop_slist(/*head*/ void)
{
+ slist_header *head;
slist_entry *first;
+
+ __asm__("movl %%ecx, %%ecx" : "=c" (head));
+
mtx_lock(&ntoskrnl_interlock);
- first = head->sl_next;
+ first = head->slh_list.slh_next;
if (first != NULL)
- head->sl_next = first->sl_next;
+ head->slh_list.slh_next = first->sl_next;
mtx_unlock(&ntoskrnl_interlock);
return(first);
}
__stdcall static slist_entry *
-ntoskrnl_push_slist_ex(head, entry, lock)
- slist_entry *head;
- slist_entry *entry;
+ntoskrnl_push_slist_ex(/*head, entry,*/ lock)
kspin_lock *lock;
{
+ slist_header *head;
+ slist_entry *entry;
slist_entry *oldhead;
- return(NULL);
+
+ __asm__("movl %%ecx, %%ecx" : "=c" (head));
+ __asm__("movl %%edx, %%edx" : "=d" (entry));
+
mtx_lock((struct mtx *)*lock);
- oldhead = head->sl_next;
- entry->sl_next = head->sl_next;
- head->sl_next = entry;
+ oldhead = head->slh_list.slh_next;
+ entry->sl_next = head->slh_list.slh_next;
+ head->slh_list.slh_next = entry;
mtx_unlock((struct mtx *)*lock);
return(oldhead);
}
__stdcall static slist_entry *
-ntoskrnl_pop_slist_ex(head, lock)
- slist_entry *head;
- kspin_lock *lock;
+ntoskrnl_pop_slist_ex(/*head, lock*/ void)
{
+ slist_header *head;
+ kspin_lock *lock;
slist_entry *first;
- return(NULL);
+ __asm__("movl %%ecx, %%ecx" : "=c" (head));
+ __asm__("movl %%edx, %%edx" : "=d" (lock));
+
mtx_lock((struct mtx *)*lock);
- first = head->sl_next;
+ first = head->slh_list.slh_next;
if (first != NULL)
- head->sl_next = first->sl_next;
+ head->slh_list.slh_next = first->sl_next;
mtx_unlock((struct mtx *)*lock);
return(first);
}