H A D | hardwall.c | 162 #define mtspr_XDN(hwt, name, val) \ 163 do { (void)(hwt); __insn_mtspr(SPR_UDN_##name, (val)); } while (0) 164 #define mtspr_MPL_XDN(hwt, name, val) \ 165 do { (void)(hwt); __insn_mtspr(SPR_MPL_UDN_##name, (val)); } while (0) 166 #define mfspr_XDN(hwt, name) \ 167 ((void)(hwt), __insn_mfspr(SPR_UDN_##name)) 169 #define mtspr_XDN(hwt, name, val) \ 171 if ((hwt)->is_idn) \ 176 #define mtspr_MPL_XDN(hwt, name, val) \ 178 if ((hwt)->is_idn) \ 183 #define mfspr_XDN(hwt, name) \ 184 ((hwt)->is_idn ? __insn_mfspr(SPR_IDN_##name) : __insn_mfspr(SPR_UDN_##name)) 250 static inline int xdn_which_interrupt(struct hardwall_type *hwt) xdn_which_interrupt() argument 253 if (hwt->is_idn) xdn_which_interrupt() 259 static void enable_firewall_interrupts(struct hardwall_type *hwt) enable_firewall_interrupts() argument 261 arch_local_irq_unmask_now(xdn_which_interrupt(hwt)); enable_firewall_interrupts() 264 static void disable_firewall_interrupts(struct hardwall_type *hwt) disable_firewall_interrupts() argument 266 arch_local_irq_mask_now(xdn_which_interrupt(hwt)); disable_firewall_interrupts() 273 struct hardwall_type *hwt = r->type; hardwall_setup_func() local 288 mtspr_XDN(hwt, DIRECTION_PROTECT, bits); hardwall_setup_func() 289 enable_firewall_interrupts(hwt); hardwall_setup_func() 324 struct hardwall_type *hwt; do_hardwall_trap() local 337 hwt = &hardwall_types[HARDWALL_IDN]; do_hardwall_trap() 341 hwt = &hardwall_types[HARDWALL_UDN]; do_hardwall_trap() 346 BUG_ON(hwt->disabled); do_hardwall_trap() 349 spin_lock(&hwt->lock); do_hardwall_trap() 350 list_for_each_entry(rect, &hwt->list, list) { do_hardwall_trap() 360 BUG_ON(&rect->list == &hwt->list); do_hardwall_trap() 369 cpu, hwt->name, do_hardwall_trap() 370 (long)mfspr_XDN(hwt, DIRECTION_PROTECT)); do_hardwall_trap() 385 cpu, hwt->name, (long)mfspr_XDN(hwt, DIRECTION_PROTECT)); do_hardwall_trap() 391 thread.hardwall[hwt->index].list) { do_hardwall_trap() 392 BUG_ON(p->thread.hardwall[hwt->index].info != rect); do_hardwall_trap() 403 spin_unlock(&hwt->lock); do_hardwall_trap() 412 disable_firewall_interrupts(hwt); do_hardwall_trap() 419 void grant_hardwall_mpls(struct hardwall_type *hwt) grant_hardwall_mpls() argument 422 if (!hwt->is_xdn) { grant_hardwall_mpls() 427 mtspr_MPL_XDN(hwt, ACCESS_SET_0, 1); grant_hardwall_mpls() 428 mtspr_MPL_XDN(hwt, AVAIL_SET_0, 1); grant_hardwall_mpls() 429 mtspr_MPL_XDN(hwt, COMPLETE_SET_0, 1); grant_hardwall_mpls() 430 mtspr_MPL_XDN(hwt, TIMER_SET_0, 1); grant_hardwall_mpls() 432 mtspr_MPL_XDN(hwt, REFILL_SET_0, 1); grant_hardwall_mpls() 433 mtspr_MPL_XDN(hwt, CA_SET_0, 1); grant_hardwall_mpls() 438 void restrict_hardwall_mpls(struct hardwall_type *hwt) restrict_hardwall_mpls() argument 441 if (!hwt->is_xdn) { restrict_hardwall_mpls() 446 mtspr_MPL_XDN(hwt, ACCESS_SET_1, 1); restrict_hardwall_mpls() 447 mtspr_MPL_XDN(hwt, AVAIL_SET_1, 1); restrict_hardwall_mpls() 448 mtspr_MPL_XDN(hwt, COMPLETE_SET_1, 1); restrict_hardwall_mpls() 449 mtspr_MPL_XDN(hwt, TIMER_SET_1, 1); restrict_hardwall_mpls() 451 mtspr_MPL_XDN(hwt, REFILL_SET_1, 1); restrict_hardwall_mpls() 452 mtspr_MPL_XDN(hwt, CA_SET_1, 1); restrict_hardwall_mpls() 488 static struct hardwall_info *hardwall_create(struct hardwall_type *hwt, hardwall_create() argument 529 info->type = hwt; hardwall_create() 534 if (hwt->is_xdn) { hardwall_create() 551 spin_lock_irqsave(&hwt->lock, flags); hardwall_create() 552 list_for_each_entry(iter, &hwt->list, list) { hardwall_create() 554 spin_unlock_irqrestore(&hwt->lock, flags); hardwall_create() 559 list_add_tail(&info->list, &hwt->list); hardwall_create() 560 spin_unlock_irqrestore(&hwt->lock, flags); hardwall_create() 563 if (hwt->is_xdn) hardwall_create() 579 struct hardwall_type *hwt; hardwall_activate() local 603 hwt = info->type; hardwall_activate() 604 if (ts->hardwall[hwt->index].info) { hardwall_activate() 605 BUG_ON(ts->hardwall[hwt->index].info != info); hardwall_activate() 610 ts->hardwall[hwt->index].info = info; hardwall_activate() 611 spin_lock_irqsave(&hwt->lock, flags); hardwall_activate() 612 list_add(&ts->hardwall[hwt->index].list, &info->task_head); hardwall_activate() 613 spin_unlock_irqrestore(&hwt->lock, flags); hardwall_activate() 614 grant_hardwall_mpls(hwt); hardwall_activate() 616 p->pid, p->comm, hwt->name, cpu); hardwall_activate() 626 static void _hardwall_deactivate(struct hardwall_type *hwt, _hardwall_deactivate() argument 633 task->pid, task->comm, hwt->name, _hardwall_deactivate() 638 BUG_ON(ts->hardwall[hwt->index].info == NULL); _hardwall_deactivate() 639 ts->hardwall[hwt->index].info = NULL; _hardwall_deactivate() 640 list_del(&ts->hardwall[hwt->index].list); _hardwall_deactivate() 642 restrict_hardwall_mpls(hwt); _hardwall_deactivate() 646 static int hardwall_deactivate(struct hardwall_type *hwt, hardwall_deactivate() argument 652 spin_lock_irqsave(&hwt->lock, flags); hardwall_deactivate() 653 activated = (task->thread.hardwall[hwt->index].info != NULL); hardwall_deactivate() 655 _hardwall_deactivate(hwt, task); hardwall_deactivate() 656 spin_unlock_irqrestore(&hwt->lock, flags); hardwall_deactivate() 662 task->pid, task->comm, hwt->name, raw_smp_processor_id()); hardwall_deactivate() 695 struct hardwall_type *hwt = arg; stop_xdn_switch() 696 unsigned long protect = mfspr_XDN(hwt, DIRECTION_PROTECT); stop_xdn_switch() 697 mtspr_XDN(hwt, DIRECTION_PROTECT, (protect | C_PROTECT) << 5); stop_xdn_switch() 701 static void empty_xdn_demuxes(struct hardwall_type *hwt) empty_xdn_demuxes() argument 704 if (hwt->is_idn) { empty_xdn_demuxes() 726 struct hardwall_type *hwt = info->type; drain_xdn_switch() local 736 int pending = mfspr_XDN(hwt, PENDING); drain_xdn_switch() 738 empty_xdn_demuxes(hwt); drain_xdn_switch() 739 if (hwt->is_idn) drain_xdn_switch() 746 empty_xdn_demuxes(hwt); drain_xdn_switch() 767 empty_xdn_demuxes(hwt); drain_xdn_switch() 790 static void reset_xdn_network_state(struct hardwall_type *hwt) reset_xdn_network_state() argument 792 if (hwt->disabled) reset_xdn_network_state() 796 mtspr_XDN(hwt, DIRECTION_PROTECT, 0); reset_xdn_network_state() 797 mtspr_XDN(hwt, AVAIL_EN, 0); reset_xdn_network_state() 798 mtspr_XDN(hwt, DEADLOCK_TIMEOUT, 0); reset_xdn_network_state() 837 struct hardwall_type *hwt = arg; restart_xdn_switch() local 841 empty_xdn_demuxes(hwt); restart_xdn_switch() 844 reset_xdn_network_state(hwt); restart_xdn_switch() 847 disable_firewall_interrupts(hwt); restart_xdn_switch() 854 struct hardwall_type *hwt; hardwall_destroy() local 868 hwt = info->type; hardwall_destroy() 870 spin_lock_irqsave(&hwt->lock, flags); hardwall_destroy() 872 thread.hardwall[hwt->index].list) hardwall_destroy() 873 _hardwall_deactivate(hwt, task); hardwall_destroy() 874 spin_unlock_irqrestore(&hwt->lock, flags); hardwall_destroy() 876 if (hwt->is_xdn) { hardwall_destroy() 880 hwt->name, info->width, info->height, hardwall_destroy() 882 on_each_cpu_mask(&info->cpumask, stop_xdn_switch, hwt, 1); hardwall_destroy() 894 on_each_cpu_mask(&info->cpumask, restart_xdn_switch, hwt, 1); hardwall_destroy() 901 spin_lock_irqsave(&hwt->lock, flags); hardwall_destroy() 904 spin_unlock_irqrestore(&hwt->lock, flags); hardwall_destroy() 962 struct hardwall_type *hwt = &hardwall_types[i]; proc_tile_hardwall_init() local 963 if (hwt->disabled) proc_tile_hardwall_init() 967 hwt->proc_dir = proc_mkdir(hwt->name, hardwall_proc_dir); proc_tile_hardwall_init() 980 struct hardwall_type* hwt; hardwall_ioctl() local 991 hwt = &hardwall_types[minor]; hardwall_ioctl() 992 WARN_ON(info && hwt != info->type); hardwall_ioctl() 996 if (hwt->disabled) hardwall_ioctl() 1000 info = hardwall_create(hwt, _IOC_SIZE(a), hardwall_ioctl() 1011 if (current->thread.hardwall[hwt->index].info != info) hardwall_ioctl() 1013 return hardwall_deactivate(hwt, current); hardwall_ioctl() 1049 struct hardwall_type *hwt = info->type; hardwall_flush() local 1050 spin_lock_irqsave(&hwt->lock, flags); hardwall_flush() 1052 thread.hardwall[hwt->index].list) { hardwall_flush() 1054 _hardwall_deactivate(hwt, task); hardwall_flush() 1056 spin_unlock_irqrestore(&hwt->lock, flags); hardwall_flush()
|