Article View: gnu.gcc.bug
Article #1370ipc_input1111bug.c
From: Jeffrey A Law
Date: Wed, 11 Nov 1992 15:07
Date: Wed, 11 Nov 1992 15:07
1479 lines
41274 bytes
41274 bytes
configuration i386-mach.
Compile with gcc-2.3.1 "-O" to make cc1 core dump:
typedef unsigned int vm_offset_t;
typedef unsigned int vm_size_t;
typedef int kern_return_t;
typedef int boolean_t;
typedef unsigned int mach_port_t;
typedef mach_port_t *mach_port_array_t;
typedef unsigned int mach_port_right_t;
typedef unsigned int mach_port_type_t;
typedef mach_port_type_t *mach_port_type_array_t;
typedef unsigned int mach_port_urefs_t;
typedef int mach_port_delta_t;
typedef unsigned int mach_port_seqno_t;
typedef unsigned int mach_port_mscount_t;
typedef unsigned int mach_port_msgcount_t;
typedef unsigned int mach_port_rights_t;
typedef struct mach_port_status {
mach_port_t mps_pset;
mach_port_seqno_t mps_seqno;
mach_port_mscount_t mps_mscount;
mach_port_msgcount_t mps_qlimit;
mach_port_msgcount_t mps_msgcount;
mach_port_rights_t mps_sorights;
boolean_t mps_srights;
boolean_t mps_pdrequest;
boolean_t mps_nsrequest;
} mach_port_status_t;
typedef struct old_mach_port_status {
mach_port_t mps_pset;
mach_port_mscount_t mps_mscount;
mach_port_msgcount_t mps_qlimit;
mach_port_msgcount_t mps_msgcount;
mach_port_rights_t mps_sorights;
boolean_t mps_srights;
boolean_t mps_pdrequest;
boolean_t mps_nsrequest;
} old_mach_port_status_t;
typedef int port_name_t;
typedef port_name_t port_set_name_t;
typedef port_name_t *port_name_array_t;
typedef int port_type_t;
typedef port_type_t *port_type_array_t;
typedef port_name_t port_t;
typedef port_t port_rcv_t;
typedef port_t port_own_t;
typedef port_t port_all_t;
typedef port_t *port_array_t;
typedef unsigned int mach_msg_timeout_t;
typedef unsigned int mach_msg_bits_t;
typedef unsigned int mach_msg_size_t;
typedef unsigned int mach_msg_seqno_t;
typedef int mach_msg_id_t;
typedef struct {
mach_msg_bits_t msgh_bits;
mach_msg_size_t msgh_size;
mach_port_t msgh_remote_port;
mach_port_t msgh_local_port;
mach_port_seqno_t msgh_seqno;
mach_msg_id_t msgh_id;
} mach_msg_header_t;
typedef unsigned int mach_msg_type_name_t;
typedef unsigned int mach_msg_type_size_t;
typedef unsigned int mach_msg_type_number_t;
typedef struct {
unsigned int msgt_name : 8,
msgt_size : 8,
msgt_number : 12,
msgt_inline : 1,
msgt_longform : 1,
msgt_deallocate : 1,
msgt_unused : 1;
} mach_msg_type_t;
typedef struct {
mach_msg_type_t msgtl_header;
unsigned short msgtl_name;
unsigned short msgtl_size;
unsigned int msgtl_number;
} mach_msg_type_long_t;
typedef int mach_msg_option_t;
typedef kern_return_t mach_msg_return_t;
extern mach_msg_return_t
mach_msg_trap
(mach_msg_header_t *msg,
mach_msg_option_t option,
mach_msg_size_t send_size,
mach_msg_size_t rcv_size,
mach_port_t rcv_name,
mach_msg_timeout_t timeout,
mach_port_t notify);
extern mach_msg_return_t
mach_msg
(mach_msg_header_t *msg,
mach_msg_option_t option,
mach_msg_size_t send_size,
mach_msg_size_t rcv_size,
mach_port_t rcv_name,
mach_msg_timeout_t timeout,
mach_port_t notify);
typedef unsigned int msg_size_t;
typedef struct {
unsigned int msg_unused : 24,
msg_simple : 8;
msg_size_t msg_size;
int msg_type;
port_t msg_local_port;
port_t msg_remote_port;
int msg_id;
} msg_header_t;
typedef struct {
unsigned int msg_type_name : 8,
msg_type_size : 8,
msg_type_number : 12,
msg_type_inline : 1,
msg_type_longform : 1,
msg_type_deallocate : 1,
msg_type_unused : 1;
} msg_type_t;
typedef struct {
msg_type_t msg_type_header;
unsigned short msg_type_long_name;
unsigned short msg_type_long_size;
unsigned int msg_type_long_number;
} msg_type_long_t;
typedef unsigned int msg_timeout_t;
typedef int msg_option_t;
typedef int msg_return_t;
msg_return_t msg_send(
msg_header_t *header,
msg_option_t option,
msg_timeout_t timeout);
msg_return_t msg_receive(
msg_header_t *header,
msg_option_t option,
msg_timeout_t timeout);
msg_return_t msg_rpc(
msg_header_t *header,
msg_option_t option,
msg_size_t rcv_size,
msg_timeout_t send_timeout,
msg_timeout_t rcv_timeout);
msg_return_t msg_send_trap(
msg_header_t *header,
msg_option_t option,
msg_size_t send_size,
msg_timeout_t timeout);
msg_return_t msg_receive_trap(
msg_header_t *header,
msg_option_t option,
msg_size_t rcv_size,
port_name_t rcv_name,
msg_timeout_t timeout);
msg_return_t msg_rpc_trap(
msg_header_t *header,
msg_option_t option,
msg_size_t send_size,
msg_size_t rcv_size,
msg_timeout_t send_timeout,
msg_timeout_t rcv_timeout);
extern void Assert();
int master_cpu;
extern vm_offset_t kalloc();
extern vm_offset_t kget();
extern void kfree();
extern void kalloc_init();
typedef struct ipc_marequest {
struct ipc_space *imar_space;
mach_port_t imar_name;
struct ipc_port *imar_soright;
struct ipc_marequest *imar_next;
} *ipc_marequest_t;
extern void
ipc_marequest_init();
extern unsigned int
ipc_marequest_info( );
extern mach_msg_return_t
ipc_marequest_create(
);
extern void
ipc_marequest_cancel( );
extern void
ipc_marequest_rename(
);
extern void
ipc_marequest_destroy( );
typedef int vm_prot_t;
extern vm_size_t page_size;
extern vm_size_t page_mask;
extern int page_shift;
extern vm_size_t mem_size;
extern vm_offset_t first_addr;
extern vm_offset_t last_addr;
typedef mach_port_t memory_object_t;
typedef mach_port_t memory_object_control_t;
typedef mach_port_t memory_object_name_t;
typedef int memory_object_copy_strategy_t;
typedef int memory_object_return_t;
struct slock {
int lock_data;
};
typedef struct slock simple_lock_data_t;
typedef struct slock *simple_lock_t;
struct lock {
unsigned int read_count:16,
want_upgrade:1,
want_write:1,
waiting:1,
can_sleep:1,
:0;
char *thread;
int recursion_depth;
};
typedef struct lock lock_data_t;
typedef struct lock *lock_t;
extern void lock_init();
extern void lock_sleepable();
extern void lock_write();
extern void lock_read();
extern void lock_done();
extern boolean_t lock_read_to_write();
extern void lock_write_to_read();
extern boolean_t lock_try_write();
extern boolean_t lock_try_read();
extern boolean_t lock_try_read_to_write();
extern void lock_set_recursive();
extern void lock_clear_recursive();
struct queue_entry {
struct queue_entry *next;
struct queue_entry *prev;
};
typedef struct queue_entry *queue_t;
typedef struct queue_entry queue_head_t;
typedef struct queue_entry queue_chain_t;
typedef struct queue_entry *queue_entry_t;
void enqueue_head();
void enqueue_tail();
queue_entry_t dequeue_head();
queue_entry_t dequeue_tail();
void remqueue();
struct mpqueue_head {
struct queue_entry head;
struct slock lock;
};
typedef struct mpqueue_head mpqueue_head_t;
typedef struct vm_external {
int existence_size;
char *existence_map;
int existence_count;
} *vm_external_t;
typedef int vm_external_state_t;
extern void vm_external_module_initialize();
extern vm_external_t vm_external_create();
extern void vm_external_destroy();
extern void vm_external_state_set();
extern vm_external_state_t _vm_external_state_get();
typedef struct xmm_obj * pager_request_t;
struct vm_object {
queue_chain_t memq;
vm_size_t size;
short ref_count;
short resident_page_count;
struct vm_object *copy;
struct vm_object *shadow;
vm_offset_t shadow_offset;
struct ipc_port *pager;
vm_offset_t paging_offset;
pager_request_t pager_request;
struct ipc_port *pager_name;
memory_object_copy_strategy_t
copy_strategy;
unsigned int
absent_count;
unsigned int
all_wanted;
unsigned int
paging_in_progress:16,
pager_created:1,
pager_initialized:1,
pager_ready:1,
can_persist:1,
internal:1,
temporary:1,
alive:1,
lock_in_progress : 1,
lock_restart : 1,
use_old_pageout : 1,
use_shared_copy : 1,
shadowed: 1;
queue_chain_t cached_list;
vm_offset_t last_alloc;
vm_external_t existence_info;
};
typedef struct vm_object *vm_object_t;
extern
vm_object_t kernel_object;
extern void vm_object_bootstrap();
extern void vm_object_init();
extern void vm_object_terminate();
extern vm_object_t vm_object_allocate();
extern void vm_object_reference();
extern void vm_object_deallocate();
extern void vm_object_pmap_protect();
extern void vm_object_pmap_remove();
extern void vm_object_page_remove();
extern void vm_object_shadow();
extern void vm_object_collapse();
extern vm_object_t vm_object_lookup();
extern vm_object_t vm_object_lookup_name();
extern struct ipc_port *vm_object_name();
extern void vm_object_remove();
extern boolean_t vm_object_copy_temporary();
extern kern_return_t vm_object_copy_strategically();
extern kern_return_t vm_object_copy_slowly();
extern vm_object_t vm_object_enter();
extern void vm_object_pager_create();
extern void vm_object_destroy();
extern void vm_object_print();
extern vm_object_t vm_object_request_object();
typedef struct zone {
int count;
vm_offset_t free_elements;
vm_size_t cur_size;
vm_size_t max_size;
vm_size_t elem_size;
vm_size_t alloc_size;
boolean_t doing_alloc;
char *zone_name;
unsigned int
pageable :1,
sleepable :1,
exhaustible :1,
collectable :1,
expandable :1;
lock_data_t complex_lock;
struct zone * next_zone;
} *zone_t;
extern void zone_gc();
extern void consider_zone_gc();
extern vm_offset_t zalloc();
extern vm_offset_t zget();
extern zone_t zinit();
extern void zfree();
extern void zchange();
extern void zcollectable();
extern vm_offset_t zdata;
extern vm_offset_t zdata_size;
extern void zcram();
extern void zone_bootstrap();
extern void zone_init();
extern void sched_init();
extern void assert_wait();
extern void clear_wait();
extern void thread_sleep();
extern void thread_wakeup();
extern void thread_wakeup_prim();
extern boolean_t thread_invoke();
extern void thread_block();
extern void thread_run();
extern void thread_set_timeout();
extern void thread_setrun();
extern void thread_dispatch();
extern void thread_continue();
extern void thread_go();
extern void thread_will_wait();
extern void thread_will_wait_with_timeout();
extern boolean_t thread_handoff();
extern void recompute_priorities();
extern void thread_bootstrap_return();
extern void thread_exception_return();
extern void thread_syscall_return();
extern struct thread *switch_context();
extern void stack_handoff();
extern void stack_alloc();
extern boolean_t stack_alloc_try();
extern void stack_free();
struct vm_page {
queue_chain_t pageq;
queue_chain_t listq;
struct vm_page *next;
vm_object_t object;
vm_offset_t offset;
unsigned int wire_count:16,
inactive:1,
active:1,
laundry:1,
free:1,
reference:1,
:0;
unsigned int
busy:1,
wanted:1,
tabled:1,
fictitious:1,
private:1,
absent:1,
error:1,
dirty:1,
precious:1,
overwriting:1,
:0;
vm_offset_t phys_addr;
vm_prot_t page_lock;
vm_prot_t unlock_request;
};
typedef struct vm_page *vm_page_t;
extern
vm_page_t vm_page_queue_free;
extern
vm_page_t vm_page_queue_fictitious;
extern
queue_head_t vm_page_queue_active;
extern
queue_head_t vm_page_queue_inactive;
extern
vm_offset_t first_phys_addr;
extern
vm_offset_t last_phys_addr;
extern
int vm_page_free_count;
extern
int vm_page_fictitious_count;
extern
int vm_page_active_count;
extern
int vm_page_inactive_count;
extern
int vm_page_wire_count;
extern
int vm_page_free_target;
extern
int vm_page_free_min;
extern
int vm_page_inactive_target;
extern
int vm_page_free_reserved;
extern
int vm_page_laundry_count;
extern unsigned int vm_page_free_wanted;
extern vm_offset_t vm_page_fictitious_addr;
extern void vm_page_bootstrap();
extern void vm_page_module_init();
extern void vm_page_create();
extern vm_page_t vm_page_lookup();
extern vm_page_t vm_page_grab_fictitious();
extern void vm_page_release_fictitious();
extern boolean_t vm_page_convert();
extern void vm_page_more_fictitious();
extern vm_page_t vm_page_grab();
extern void vm_page_release();
extern void vm_page_wait();
extern vm_page_t vm_page_alloc();
extern void vm_page_attach();
extern void vm_page_init();
extern void vm_page_free();
extern void vm_page_activate();
extern void vm_page_deactivate();
extern void vm_page_rename();
extern void vm_page_insert();
extern void vm_page_remove();
extern void vm_page_zero_fill();
extern void vm_page_copy();
extern void vm_page_wire();
extern void vm_page_unwire();
extern void vm_set_page_size();
extern unsigned int vm_page_info();
extern void vm_page_check_queues();
typedef int vm_inherit_t;
struct vm_statistics {
long pagesize;
long free_count;
long active_count;
long inactive_count;
long wire_count;
long zero_fill_count;
long reactivations;
long pageins;
long pageouts;
long faults;
long cow_faults;
long lookups;
long hits;
};
typedef struct vm_statistics *vm_statistics_t;
typedef struct vm_statistics vm_statistics_data_t;
extern vm_statistics_data_t vm_stat;
struct pmap_statistics {
long resident_count;
long wired_count;
long pageins;
};
typedef struct pmap_statistics *pmap_statistics_t;
typedef struct pmap_statistics pmap_statistics_data_t;
typedef unsigned int pt_entry_t;
typedef volatile long cpu_set;
struct pmap {
pt_entry_t *dirbase;
int ref_count;
struct pmap_statistics stats;
cpu_set cpus_using;
};
typedef struct pmap *pmap_t;
pt_entry_t *pmap_pte();
extern vm_offset_t pmap_steal_memory();
extern unsigned int pmap_free_pages();
extern void pmap_startup();
extern void pmap_init();
extern boolean_t pmap_next_page();
extern void pmap_virtual_space();
extern pmap_t pmap_create();
extern void pmap_reference();
extern void pmap_destroy();
extern void pmap_enter();
extern void pmap_remove();
extern void pmap_protect();
extern void pmap_activate();
extern void pmap_deactivate();
extern void pmap_page_protect();
extern void pmap_clear_reference();
extern boolean_t pmap_is_referenced();
extern void pmap_clear_modify();
extern boolean_t pmap_is_modified();
extern void pmap_statistics();
extern vm_offset_t pmap_extract();
extern boolean_t pmap_access();
extern void pmap_collect();
extern void pmap_change_wiring();
extern pmap_t kernel_pmap;
typedef union vm_map_object {
struct vm_object *vm_object;
struct vm_map *sub_map;
} vm_map_object_t;
struct vm_map_links {
struct vm_map_entry *prev;
struct vm_map_entry *next;
vm_offset_t start;
vm_offset_t end;
};
struct vm_map_entry {
struct vm_map_links links;
union vm_map_object object;
vm_offset_t offset;
unsigned int
is_shared:1,
is_sub_map:1,
in_transition:1,
needs_wakeup:1,
needs_copy:1;
vm_prot_t protection;
vm_prot_t max_protection;
vm_inherit_t inheritance;
unsigned short wired_count;
unsigned short user_wired_count;
};
typedef struct vm_map_entry *vm_map_entry_t;
struct vm_map_header {
struct vm_map_links links;
int nentries;
boolean_t entries_pageable;
};
typedef struct vm_map {
lock_data_t lock;
struct vm_map_header hdr;
pmap_t pmap;
vm_size_t size;
int ref_count;
vm_map_entry_t hint;
vm_map_entry_t first_free;
boolean_t wait_for_space;
boolean_t wiring_required;
unsigned int timestamp;
} *vm_map_t;
typedef struct vm_map_version {
unsigned int main_timestamp;
} vm_map_version_t;
typedef struct vm_map_copy {
int type;
vm_offset_t offset;
vm_size_t size;
union {
struct vm_map_header hdr;
struct {
vm_object_t object;
vm_size_t index;
} c_o;
struct {
int npages;
boolean_t pages_loose;
kern_return_t (*cont)();
char *cont_args;
vm_page_t page_list[8 ];
} c_p;
} c_u;
} *vm_map_copy_t;
typedef struct {
vm_map_t map;
vm_offset_t src_addr;
vm_size_t src_len;
vm_offset_t destroy_addr;
vm_size_t destroy_len;
boolean_t steal_pages;
} vm_map_copyin_args_data_t, *vm_map_copyin_args_t;
extern vm_offset_t kentry_data;
extern vm_offset_t kentry_data_size;
extern int kentry_count;
extern void vm_map_init();
extern vm_map_t vm_map_create();
extern vm_map_t vm_map_fork();
extern void vm_map_reference();
extern void vm_map_deallocate();
extern kern_return_t vm_map_enter();
extern kern_return_t vm_map_find_entry();
extern kern_return_t vm_map_remove();
extern kern_return_t vm_map_protect();
extern kern_return_t vm_map_inherit();
extern void vm_map_print();
extern kern_return_t vm_map_lookup();
extern boolean_t vm_map_verify();
extern kern_return_t vm_map_copyin_common();
extern kern_return_t vm_map_copyin_page_list();
extern kern_return_t vm_map_copyout();
extern kern_return_t vm_map_copy_overwrite();
extern void vm_map_copy_discard();
extern kern_return_t vm_map_copy_discard_cont();
extern kern_return_t vm_map_machine_attribute();
extern kern_return_t vm_map_pageable_common();
extern vm_object_t vm_submap_object;
typedef struct ipc_kmsg {
struct ipc_kmsg *ikm_next, *ikm_prev;
vm_size_t ikm_size;
ipc_marequest_t ikm_marequest;
vm_page_t ikm_page;
vm_map_copy_t ikm_copy;
unsigned long ikm_source_node;
union {
boolean_t ikmu_norma_acked;
boolean_t ikmu_has_dest_right;
} ikmu;
mach_msg_header_t ikm_header;
} *ipc_kmsg_t;
extern ipc_kmsg_t ipc_kmsg_cache[1 ];
typedef unsigned int ast_t;
extern volatile ast_t need_ast[1 ];
extern void ast_taken();
struct run_queue {
queue_head_t runq[32 ];
int low;
int count;
};
typedef struct run_queue *run_queue_t;
extern struct run_queue *rem_runq();
extern struct thread *choose_thread();
extern queue_head_t action_queue;
;
extern int min_quantum;
struct shift {
int shift1;
int shift2;
};
typedef struct shift *shift_t, shift_data_t;
extern unsigned sched_tick;
struct processor_set {
struct run_queue runq;
queue_head_t idle_queue;
int idle_count;
queue_head_t processors;
int processor_count;
boolean_t empty;
queue_head_t tasks;
int task_count;
queue_head_t threads;
int thread_count;
int ref_count;
queue_chain_t all_psets;
boolean_t active;
struct ipc_port * pset_self;
struct ipc_port * pset_name_self;
int max_priority;
int set_quantum;
long mach_factor;
long load_average;
long sched_load;
};
typedef struct processor_set *processor_set_t;
extern struct processor_set default_pset;
struct processor {
struct run_queue runq;
queue_chain_t processor_queue;
int state;
struct thread *next_thread;
struct thread *idle_thread;
int quantum;
boolean_t first_quantum;
int last_quantum;
processor_set_t processor_set;
processor_set_t processor_set_next;
queue_chain_t processors;
struct ipc_port *processor_self;
int slot_num;
};
typedef struct processor *processor_t;
extern struct processor processor_array[1 ];
extern queue_head_t all_psets;
extern int all_psets_count;
;
extern processor_t master_processor;
extern processor_t processor_ptr[1 ];
typedef mach_port_t *processor_array_t;
typedef mach_port_t *processor_set_array_t;
typedef mach_port_t *processor_set_name_array_t;
struct time_value {
long seconds;
long microseconds;
};
typedef struct time_value time_value_t;
typedef struct mapped_time_value {
long seconds;
long microseconds;
long check_seconds;
} mapped_time_value_t;
typedef vm_offset_t eml_routine_t;
typedef struct eml_dispatch {
int ref_count;
int disp_count;
int disp_min;
eml_routine_t disp_vector[1];
} *eml_dispatch_t;
typedef vm_offset_t *emulation_vector_t;
struct task {
int ref_count;
boolean_t active;
vm_map_t map;
queue_chain_t pset_tasks;
int suspend_count;
queue_head_t thread_list;
int thread_count;
processor_set_t processor_set;
boolean_t may_assign;
boolean_t assign_active;
int user_stop_count;
int priority;
time_value_t total_user_time;
time_value_t total_system_time;
boolean_t task_profiled;
struct prof_data *profil_buffer;
struct ipc_port *itk_self;
struct ipc_port *itk_sself;
struct ipc_port *itk_exception;
struct ipc_port *itk_bootstrap;
struct ipc_port *itk_registered[4 ];
struct ipc_space *itk_space;
struct eml_dispatch *eml_dispatch;
long child_node;
};
typedef struct task *task_t;
typedef mach_port_t *task_array_t;
extern kern_return_t task_create();
extern kern_return_t task_terminate();
extern kern_return_t task_suspend();
extern kern_return_t task_resume();
extern kern_return_t task_threads();
extern kern_return_t task_ports();
extern kern_return_t task_info();
extern kern_return_t task_get_special_port();
extern kern_return_t task_set_special_port();
extern kern_return_t task_assign();
extern kern_return_t task_assign_default();
extern void task_init();
extern void task_reference();
extern void task_deallocate();
extern kern_return_t task_hold();
extern kern_return_t task_dowait();
extern kern_return_t task_release();
extern kern_return_t task_halt();
extern kern_return_t task_suspend_nowait();
extern task_t kernel_task_create();
extern task_t kernel_task;
extern unsigned long elapsed_ticks;
extern int hz;
extern int tick;
struct timer_elt {
queue_chain_t chain;
int (*fcn)();
char * param;
unsigned long ticks;
int set;
};
typedef struct timer_elt timer_elt_data_t;
typedef struct timer_elt *timer_elt_t;
extern void set_timeout();
extern boolean_t reset_timeout();
extern void timeout();
extern boolean_t untimeout();
struct timer {
unsigned low_bits;
unsigned high_bits;
unsigned high_bits_check;
unsigned tstamp;
};
typedef struct timer timer_data_t;
typedef struct timer *timer_t;
extern timer_t current_timer[1 ];
extern timer_data_t kernel_timer[1 ];
struct timer_save {
unsigned low;
unsigned high;
};
typedef struct timer_save timer_save_data_t, *timer_save_t;
extern void timer_read();
extern void thread_read_times();
extern unsigned timer_delta();
struct i386_fp_save {
unsigned short fp_control;
unsigned short fp_unused_1;
unsigned short fp_status;
unsigned short fp_unused_2;
unsigned short fp_tag;
unsigned short fp_unused_3;
unsigned int fp_eip;
unsigned short fp_cs;
unsigned short fp_opcode;
unsigned int fp_dp;
unsigned short fp_ds;
unsigned short fp_unused_4;
};
struct i386_fp_regs {
unsigned short fp_reg_word[5][8];
};
struct i386_tss {
int back_link;
int esp0;
int ss0;
int esp1;
int ss1;
int esp2;
int ss2;
int cr3;
int eip;
int eflags;
int eax;
int ecx;
int edx;
int ebx;
int esp;
int ebp;
int esi;
int edi;
int es;
int cs;
int ss;
int ds;
int fs;
int gs;
int ldt;
unsigned short trace_trap;
unsigned short io_bit_map_offset;
};
typedef unsigned char isa_iopb[((((0x3ff +1)+(8)-1)/(8)) ) ];
struct iopb_tss {
struct i386_tss tss;
isa_iopb bitmap;
unsigned int barrier;
queue_head_t io_port_list;
int iopb_desc[2];
};
typedef struct iopb_tss *iopb_tss_t;
struct i386_saved_state {
unsigned int gs;
unsigned int fs;
unsigned int es;
unsigned int ds;
unsigned int edi;
unsigned int esi;
unsigned int ebp;
unsigned int cr2;
unsigned int ebx;
unsigned int edx;
unsigned int ecx;
unsigned int eax;
unsigned int trapno;
unsigned int err;
unsigned int eip;
unsigned int cs;
unsigned int efl;
unsigned int uesp;
unsigned int ss;
struct v86_segs {
unsigned int v86_es;
unsigned int v86_ds;
unsigned int v86_fs;
unsigned int v86_gs;
} v86_segs;
};
struct i386_exception_link {
struct i386_saved_state *saved_state;
};
struct i386_kernel_state {
int k_ebx;
int k_esp;
int k_ebp;
int k_edi;
int k_esi;
int k_eip;
};
struct i386_fpsave_state {
boolean_t fp_valid;
struct i386_fp_save fp_save_state;
struct i386_fp_regs fp_regs;
};
struct v86_assist_state {
vm_offset_t int_table;
unsigned short int_count;
unsigned short flags;
};
struct i386_interrupt_state {
int es;
int ds;
int edx;
int ecx;
int eax;
int eip;
int cs;
int efl;
};
struct i386_machine_state {
iopb_tss_t io_tss;
struct user_ldt * ldt;
struct i386_fpsave_state *ifps;
struct v86_assist_state v86s;
};
typedef struct pcb {
struct i386_interrupt_state iis[2];
struct i386_saved_state iss;
struct i386_machine_state ims;
} *pcb_t;
struct thread {
queue_chain_t links;
run_queue_t runq;
task_t task;
queue_chain_t thread_list;
queue_chain_t pset_threads;
int ref_count;
pcb_t pcb;
vm_offset_t kernel_stack;
vm_offset_t stack_privilege;
int wait_event;
int suspend_count;
kern_return_t wait_result;
boolean_t wake_active;
int state;
void (*swap_func)();
int priority;
int max_priority;
int sched_pri;
int depress_priority;
unsigned int cpu_usage;
unsigned int sched_usage;
unsigned int sched_stamp;
vm_offset_t recover;
boolean_t vm_privilege;
int user_stop_count;
struct thread *ith_next, *ith_prev;
mach_msg_return_t ith_state;
union {
mach_msg_size_t msize;
struct ipc_kmsg *kmsg;
} data;
mach_port_seqno_t ith_seqno;
struct ipc_kmsg_queue {
struct ipc_kmsg *ikmq_base;
} ith_messages;
struct ipc_port *ith_self;
struct ipc_port *ith_sself;
struct ipc_port *ith_exception;
struct ipc_port *ith_reply;
mach_port_t ith_mig_reply;
struct ipc_port *ith_rpc_reply;
union {
struct {
mach_msg_header_t *msg;
mach_msg_option_t option;
mach_msg_size_t rcv_size;
mach_msg_timeout_t timeout;
mach_port_t notify;
struct ipc_object *object;
struct ipc_mqueue *mqueue;
} receive;
struct {
struct ipc_port *port;
int exc;
int code;
int subcode;
} exception;
char *other;
} saved;
timer_data_t user_timer;
timer_data_t system_timer;
timer_save_data_t user_timer_save;
timer_save_data_t system_timer_save;
unsigned int cpu_delta;
unsigned int sched_delta;
timer_elt_data_t timer;
timer_elt_data_t depress_timer;
boolean_t thread_profiled;
boolean_t thread_profiled_own;
struct prof_data *profil_buffer;
boolean_t active;
int ast;
processor_set_t processor_set;
processor_t bound_processor;
};
typedef struct thread *thread_t;
typedef mach_port_t *thread_array_t;
extern thread_t active_threads[1 ];
extern vm_offset_t active_stacks[1 ];
extern kern_return_t thread_create();
extern kern_return_t thread_terminate();
extern kern_return_t thread_suspend();
extern kern_return_t thread_resume();
extern kern_return_t thread_abort();
extern kern_return_t thread_get_state();
extern kern_return_t thread_set_state();
extern kern_return_t thread_get_special_port();
extern kern_return_t thread_set_special_port();
extern kern_return_t thread_info();
extern kern_return_t thread_assign();
extern kern_return_t thread_assign_default();
extern void thread_init();
extern void thread_reference();
extern void thread_deallocate();
extern void thread_hold();
extern kern_return_t thread_dowait();
extern void thread_release();
extern kern_return_t thread_halt();
extern void thread_halt_self();
extern void thread_set_own_priority();
extern thread_t kernel_thread();
extern void reaper_thread();
typedef struct ipc_kmsg_queue *ipc_kmsg_queue_t;
extern void
ipc_kmsg_enqueue( );
extern ipc_kmsg_t
ipc_kmsg_dequeue( );
extern void
ipc_kmsg_rmqueue( );
extern ipc_kmsg_t
ipc_kmsg_queue_next( );
extern void
ipc_kmsg_destroy( );
extern void
ipc_kmsg_clean( );
extern void
ipc_kmsg_free( );
extern mach_msg_return_t
ipc_kmsg_get( );
extern mach_msg_return_t
ipc_kmsg_get_from_kernel(
);
extern mach_msg_return_t
ipc_kmsg_put( );
extern void
ipc_kmsg_put_to_kernel( );
extern mach_msg_return_t
ipc_kmsg_copyin_header( );
extern mach_msg_return_t
ipc_kmsg_copyin( );
extern void
ipc_kmsg_copyin_from_kernel( );
extern mach_msg_return_t
ipc_kmsg_copyout_header( );
extern mach_msg_return_t
ipc_kmsg_copyout_object(
);
extern mach_msg_return_t
ipc_kmsg_copyout_body( );
extern mach_msg_return_t
ipc_kmsg_copyout( );
extern mach_msg_return_t
ipc_kmsg_copyout_pseudo( );
extern void
ipc_kmsg_copyout_dest( );
extern mach_msg_return_t
ipc_kmsg_copyin_compat( );
extern mach_msg_return_t
ipc_kmsg_copyout_compat( );
typedef unsigned int ipc_kobject_t;
typedef unsigned int ipc_kobject_type_t;
extern struct ipc_kmsg *
ipc_kobject_server( );
extern void
ipc_kobject_set( );
extern void
ipc_kobject_destroy( );
typedef unsigned int ipc_object_refs_t;
typedef unsigned int ipc_object_bits_t;
typedef unsigned int ipc_object_type_t;
typedef struct ipc_object {
ipc_object_refs_t io_references;
ipc_object_bits_t io_bits;
} *ipc_object_t;
extern zone_t ipc_object_zones[ 2 ];
extern void
ipc_object_reference( );
extern void
ipc_object_release( );
extern kern_return_t
ipc_object_translate(
);
extern kern_return_t
ipc_object_alloc_dead( );
extern kern_return_t
ipc_object_alloc_dead_name( );
extern kern_return_t
ipc_object_alloc(
);
extern kern_return_t
ipc_object_alloc_name(
);
extern mach_msg_type_name_t
ipc_object_copyin_type( );
extern kern_return_t
ipc_object_copyin(
);
extern void
ipc_object_copyin_from_kernel( );
extern void
ipc_object_destroy( );
extern kern_return_t
ipc_object_copyout(
);
extern kern_return_t
ipc_object_copyout_name(
);
extern void
ipc_object_copyout_dest(
);
extern kern_return_t
ipc_object_rename( );
extern mach_msg_type_name_t
ipc_object_copyout_type_compat( );
extern kern_return_t
ipc_object_copyin_compat(
);
extern kern_return_t
ipc_object_copyin_header(
);
extern kern_return_t
ipc_object_copyout_compat(
);
extern kern_return_t
ipc_object_copyout_name_compat(
);
extern void
ipc_object_print( );
typedef thread_t ipc_thread_t;
typedef struct ipc_thread_queue {
ipc_thread_t ithq_base;
} *ipc_thread_queue_t;
extern void
ipc_thread_enqueue( );
extern ipc_thread_t
ipc_thread_dequeue( );
extern void
ipc_thread_rmqueue( );
typedef struct ipc_mqueue {
struct ipc_kmsg_queue imq_messages;
struct ipc_thread_queue imq_threads;
} *ipc_mqueue_t;
extern void
ipc_mqueue_init( );
extern void
ipc_mqueue_move( );
extern void
ipc_mqueue_changed( );
extern mach_msg_return_t
ipc_mqueue_send( );
extern mach_msg_return_t
ipc_mqueue_receive(
);
typedef unsigned int ipc_table_index_t;
typedef unsigned int ipc_table_elems_t;
typedef struct ipc_table_size {
ipc_table_elems_t its_size;
} *ipc_table_size_t;
extern ipc_table_size_t ipc_table_entries;
extern ipc_table_size_t ipc_table_dnrequests;
extern void
ipc_table_init();
extern vm_offset_t
ipc_table_alloc( );
extern vm_offset_t
ipc_table_realloc( );
extern void
ipc_table_free( );
typedef unsigned int ipc_port_timestamp_t;
typedef struct ipc_port {
struct ipc_object ip_object;
union {
struct ipc_space *receiver;
struct ipc_port *destination;
ipc_port_timestamp_t timestamp;
} data;
mach_port_t ip_receiver_name;
ipc_kobject_t ip_kobject;
mach_port_mscount_t ip_mscount;
mach_port_rights_t ip_srights;
mach_port_rights_t ip_sorights;
struct ipc_port *ip_nsrequest;
struct ipc_port *ip_pdrequest;
struct ipc_port_request *ip_dnrequests;
struct ipc_pset *ip_pset;
mach_port_seqno_t ip_seqno;
unsigned short ip_msgcount;
unsigned short ip_qlimit;
struct ipc_mqueue ip_messages;
struct ipc_thread_queue ip_blocked;
unsigned long ip_norma_uid;
unsigned long ip_norma_dest_node;
long ip_norma_stransit;
long ip_norma_sotransit;
long ip_norma_xmm_object_refs;
boolean_t ip_norma_is_proxy;
boolean_t ip_norma_is_special;
boolean_t ip_norma_atrium_waiter;
boolean_t ip_norma_forward;
boolean_t ip_norma_sync;
struct ipc_port *ip_norma_atrium;
struct ipc_port *ip_norma_queue_next;
struct ipc_port *ip_norma_xmm_object;
struct ipc_port *ip_norma_next;
long ip_norma_spare1;
long ip_norma_spare2;
long ip_norma_spare3;
long ip_norma_spare4;
} *ipc_port_t;
typedef ipc_table_index_t ipc_port_request_index_t;
typedef struct ipc_port_request {
union {
struct ipc_port *port;
ipc_port_request_index_t index;
} notify;
union {
mach_port_t name;
struct ipc_table_size *size;
} name;
} *ipc_port_request_t;
extern ipc_port_timestamp_t ipc_port_timestamp_data;
extern ipc_port_timestamp_t
ipc_port_timestamp();
extern kern_return_t
ipc_port_dnrequest(
);
extern kern_return_t
ipc_port_dngrow( );
extern ipc_port_t
ipc_port_dncancel( );
extern void
ipc_port_pdrequest( );
extern void
ipc_port_nsrequest(
);
extern void
ipc_port_set_qlimit( );
extern void
ipc_port_set_seqno( );
extern void
ipc_port_clear_receiver( );
extern void
ipc_port_init( );
extern kern_return_t
ipc_port_alloc( );
extern kern_return_t
ipc_port_alloc_name( );
extern void
ipc_port_destroy( );
extern boolean_t
ipc_port_check_circularity( );
extern ipc_port_t
ipc_port_lookup_notify( );
extern ipc_port_t
ipc_port_make_send( );
extern ipc_port_t
ipc_port_copy_send( );
extern mach_port_t
ipc_port_copyout_send( );
extern void
ipc_port_release_send( );
extern ipc_port_t
ipc_port_make_sonce( );
extern void
ipc_port_release_sonce( );
extern void
ipc_port_release_receive( );
extern ipc_port_t
ipc_port_alloc_special( );
extern void
ipc_port_dealloc_special( );
extern kern_return_t
ipc_port_alloc_compat( );
extern mach_port_t
ipc_port_copyout_send_compat( );
extern mach_port_t
ipc_port_copyout_receiver( );
extern void
ipc_port_print( );
extern void kmem_init();
extern kern_return_t kmem_alloc();
extern kern_return_t kmem_alloc_pageable();
extern kern_return_t kmem_alloc_wired();
extern kern_return_t kmem_alloc_aligned();
extern kern_return_t kmem_realloc();
extern void kmem_free();
extern vm_map_t kmem_suballoc();
extern kern_return_t kmem_io_map_copyout();
extern void kmem_io_map_deallocate();
extern vm_map_t kernel_map;
extern vm_map_t kernel_pageable_map;
extern vm_map_t ipc_kernel_map;
extern ipc_port_t host_special_port[ 40 ];
struct netvec {
unsigned long addr;
unsigned long size;
};
typedef char * va_list;
struct pginfo {
unsigned long pg_msgh_offset;
boolean_t pg_page_first;
boolean_t pg_page_last;
boolean_t pg_copy_last;
unsigned long pg_copy_offset;
unsigned long pg_copy_size;
unsigned long pg_first_seqid;
unsigned long pg_remote_port;
unsigned long pg_copy_index;
unsigned long pg_copy_npages;
unsigned long pg_msgh_id;
};
struct netipc_hdr {
unsigned long checksum;
unsigned long type;
unsigned long seqid;
struct pginfo pg;
unsigned long remote;
unsigned long ctl;
unsigned long ctl_seqid;
kern_return_t ctl_status;
unsigned long ctl_data;
unsigned long incarnation;
};
extern void netipc_thread_lock();
extern void netipc_thread_unlock();
extern void netipc_copy_ungrab();
typedef struct netipc_packet *netipc_packet_t;
struct netipc_packet {
unsigned long dp_type;
unsigned long dp_remote;
unsigned long dp_seqid;
unsigned long dp_first_seqid;
unsigned long dp_last_seqid;
unsigned long dp_last_unacked;
ipc_kmsg_t dp_kmsg;
unsigned long dp_offset;
netipc_packet_t dp_next;
ipc_port_t dp_remote_port;
vm_map_copy_t dp_copy;
unsigned long dp_copy_index;
unsigned long dp_copy_npages;
unsigned long dp_copy_last;
unsigned long dp_page_list_base;
boolean_t dp_has_continuation;
boolean_t dp_being_continued;
boolean_t dp_reconstruct_complete;
};
typedef struct netipc_packet_state {
netipc_packet_t netipc_packet;
netipc_packet_t suspended_packet;
ipc_port_t suspended_ports;
unsigned int state;
} *netipc_packet_state_t;
struct netipc_packet_state netipc_packet_state[ 256 ];
extern void netipc_start();
extern boolean_t norma_ipc_prepare_dest();
extern void norma_ipc_send_dest();
extern unsigned long norma_ipc_send_port();
static boolean_t dp_advance();
netipc_packet_t netipc_packet_allocate();
void netipc_packet_deallocate();
void netipc_set_node_state();
void norma_ipc_queue_port();
zone_t netipc_packet_zone;
ipc_kmsg_t netipc_kmsg_cache;
vm_size_t netipc_kmsg_first_half;
int netipc_kmsg_cache_hits;
int netipc_kmsg_cache_misses;
int netipc_kmsg_splits;
struct netipc_hdr send_hdr_p;
struct netipc_hdr send_hdr_k;
struct netipc_hdr send_hdr_m;
struct netipc_hdr send_hdr_o;
struct netvec netvec_p[3];
struct netvec netvec_k[3];
struct netvec netvec_m[3];
struct netvec netvec_o[3];
struct vm_map_copy netipc_kmsg_more_copy;
struct vm_map_copy netipc_ool_ports_copy;
unsigned int netipc_output_replenish_cleaned = 0;
extern kern_return_t vm_map_copy_discard_cont();
netipc_send_page(remote, dp)
unsigned long remote;
register netipc_packet_t dp;
{
vm_page_t *page_list;
unsigned long align;
unsigned long length;
unsigned long offset;
char *__ntr_func_name__ = "netipc_send_page" ;
offset = 0;
align = dp->dp_copy->offset & page_mask;
if (dp->dp_copy_index < dp->dp_copy_npages - 1) {
length = page_size ;
} else {
length = ((dp->dp_copy->size + align) & page_mask);
if (length == 0) {
length = page_size ;
} else {
length = ((((unsigned long)(length)) + (4 - 1)
) & ~(4 - 1) ) ;
}
}
do { if (!(((((unsigned long)(offset)) & (4 - 1) ) == 0) ))
Assert("../../../../../src/mk/kernel/norma/ipc_output.c", 1246);
} while ( ((boolean_t) 0) ) ;
do { if (!(((((unsigned long)(length)) & (4 - 1) ) == 0) ))
Assert("../../../../../src/mk/kernel/norma/ipc_output.c", 1247);
} while ( ((boolean_t) 0) ) ;
do { if (!(length > 0))
Assert("../../../../../src/mk/kernel/norma/ipc_output.c", 1248);
} while ( ((boolean_t) 0) ) ;
do { if (!(length <= page_size ))
Assert("../../../../../src/mk/kernel/norma/ipc_output.c", 1249);
} while ( ((boolean_t) 0) ) ;
netipc_set_node_state(&send_hdr_p.type, remote);
send_hdr_p.pg.pg_copy_offset = align;
send_hdr_p.pg.pg_msgh_offset = dp->dp_offset;
send_hdr_p.pg.pg_copy_size = dp->dp_copy->size;
send_hdr_p.pg.pg_page_first = (dp->dp_copy_index == 0);
send_hdr_p.pg.pg_page_last = (dp->dp_copy_index ==
dp->dp_copy_npages - 1);
send_hdr_p.pg.pg_copy_last = dp->dp_copy_last;
send_hdr_p.seqid = dp->dp_seqid;
send_hdr_p.pg.pg_first_seqid = dp->dp_first_seqid;
send_hdr_p.pg.pg_remote_port = (unsigned long)
dp->dp_remote_port->ip_norma_uid;
send_hdr_p.pg.pg_copy_index = (unsigned long) dp->dp_copy_index;
send_hdr_p.pg.pg_msgh_id = (unsigned long)
dp->dp_kmsg->ikm_header.msgh_id;
send_hdr_p.pg.pg_copy_npages = (unsigned long) dp->dp_copy_npages;
page_list = &dp->dp_copy-> c_u.c_p.page_list [dp->dp_copy_index];
if (offset + length > page_size ) {
vm_offset_t first_half = page_size - offset;
netvec_p[1].addr =
(((vm_offset_t)((page_list[0])->phys_addr) + ((vm_offset_t) 0xc0000000)
) ) + offset;
netvec_p[1].size = first_half;
netvec_p[2].addr =
(((vm_offset_t)((page_list[1])->phys_addr) + ((vm_offset_t) 0xc0000000) ) ) ;
netvec_p[2].size = length - first_half;
netipc_send_with_timeout(remote, netvec_p, 3,
(unsigned long) dp, dp->dp_seqid);
} else {
netvec_p[1].addr =
(((vm_offset_t)((page_list[0])->phys_addr) + ((vm_offset_t) 0xc0000000)
) ) + offset;
netvec_p[1].size = length;
netipc_send_with_timeout(remote, netvec_p, 2,
(unsigned long) dp, dp->dp_seqid);
}
}
Technical Details
Message-ID:
<10097.721494475@schirf.cs.utah.edu>Path:
arc1-ca.pugleaf.net!sparky!uunet!ogicse!emory!swrinde!zaphod.mps.ohio-state.edu!cis.ohio-state.edu!schirf.cs.utah.edu!lawShow Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!sparky!uunet!ogicse!emory!swrinde!zaphod.mps.ohio-state.edu!cis.ohio-state.edu!schirf.cs.utah.edu!law From: law@schirf.cs.utah.edu (Jeffrey A Law) Newsgroups: gnu.gcc.bug Subject: ipc_input1111bug.c Message-ID: <10097.721494475@schirf.cs.utah.edu> Date: 11 Nov 92 15:07:55 GMT Article-I.D.: schirf.10097.721494475 Sender: gnulists@ai.mit.edu Reply-To: law@cs.utah.edu Distribution: gnu Organization: Gnus Not Usenet Lines: 1479 Approved: bug-gcc@prep.ai.mit.edu