r = kfd_dbg_trap_set_flags(target, &args->set_flags.flags);
                break;
        case KFD_IOC_DBG_TRAP_QUERY_DEBUG_EVENT:
+               r = kfd_dbg_ev_query_debug_event(target,
+                               &args->query_debug_event.queue_id,
+                               &args->query_debug_event.gpu_id,
+                               args->query_debug_event.exception_mask,
+                               &args->query_debug_event.exception_mask);
+               break;
        case KFD_IOC_DBG_TRAP_QUERY_EXCEPTION_INFO:
        case KFD_IOC_DBG_TRAP_GET_QUEUE_SNAPSHOT:
        case KFD_IOC_DBG_TRAP_GET_DEVICE_SNAPSHOT:
 
 
 #define MAX_WATCH_ADDRESSES    4
 
+int kfd_dbg_ev_query_debug_event(struct kfd_process *process,
+                     unsigned int *queue_id,
+                     unsigned int *gpu_id,
+                     uint64_t exception_clear_mask,
+                     uint64_t *event_status)
+{
+       struct process_queue_manager *pqm;
+       struct process_queue_node *pqn;
+       int i;
+
+       if (!(process && process->debug_trap_enabled))
+               return -ENODATA;
+
+       mutex_lock(&process->event_mutex);
+       *event_status = 0;
+       *queue_id = 0;
+       *gpu_id = 0;
+
+       /* find and report queue events */
+       pqm = &process->pqm;
+       list_for_each_entry(pqn, &pqm->queues, process_queue_list) {
+               uint64_t tmp = process->exception_enable_mask;
+
+               if (!pqn->q)
+                       continue;
+
+               tmp &= pqn->q->properties.exception_status;
+
+               if (!tmp)
+                       continue;
+
+               *event_status = pqn->q->properties.exception_status;
+               *queue_id = pqn->q->properties.queue_id;
+               *gpu_id = pqn->q->device->id;
+               pqn->q->properties.exception_status &= ~exception_clear_mask;
+               goto out;
+       }
+
+       /* find and report device events */
+       for (i = 0; i < process->n_pdds; i++) {
+               struct kfd_process_device *pdd = process->pdds[i];
+               uint64_t tmp = process->exception_enable_mask
+                                               & pdd->exception_status;
+
+               if (!tmp)
+                       continue;
+
+               *event_status = pdd->exception_status;
+               *gpu_id = pdd->dev->id;
+               pdd->exception_status &= ~exception_clear_mask;
+               goto out;
+       }
+
+       /* report process events */
+       if (process->exception_enable_mask & process->exception_status) {
+               *event_status = process->exception_status;
+               process->exception_status &= ~exception_clear_mask;
+       }
+
+out:
+       mutex_unlock(&process->event_mutex);
+       return *event_status ? 0 : -EAGAIN;
+}
+
 void debug_event_write_work_handler(struct work_struct *work)
 {
        struct kfd_process *process;
 
 
 void kfd_dbg_trap_deactivate(struct kfd_process *target, bool unwind, int unwind_count);
 int kfd_dbg_trap_activate(struct kfd_process *target);
+int kfd_dbg_ev_query_debug_event(struct kfd_process *process,
+                       unsigned int *queue_id,
+                       unsigned int *gpu_id,
+                       uint64_t exception_clear_mask,
+                       uint64_t *event_status);
 bool kfd_set_dbg_ev_from_interrupt(struct kfd_node *dev,
                                   unsigned int pasid,
                                   uint32_t doorbell_id,