From: "Jan Beulich" <JBeulich@novell.com>
To: <linux-kernel@vger.kernel.org>
Subject: [PATCH 10/39] NLKD - console layout change notification
Date: Wed, 09 Nov 2005 15:05:08 +0100 [thread overview]
Message-ID: <43721024.76F0.0078.0@novell.com> (raw)
In-Reply-To: 43720FF6.76F0.0078.0@novell.com
[-- Attachment #1: Type: text/plain, Size: 192 bytes --]
A mechanism to allow (local) debuggers to learn about changes to the
console layout, to adapt their internal state.
Signed-Off-By: Jan Beulich <jbeulich@novell.com>
(actual patch attached)
[-- Attachment #2: linux-2.6.14-nlkd-notify-console.patch --]
[-- Type: application/octet-stream, Size: 8873 bytes --]
A mechanism to allow (local) debuggers to learn about changes to the
console layout, to adapt their internal state.
Signed-Off-By: Jan Beulich <jbeulich@novell.com>
Index: 2.6.14-nlkd/drivers/video/console/fbcon.c
===================================================================
--- 2.6.14-nlkd.orig/drivers/video/console/fbcon.c 2005-11-09 10:40:17.000000000 +0100
+++ 2.6.14-nlkd/drivers/video/console/fbcon.c 2005-11-07 12:09:42.000000000 +0100
@@ -107,7 +107,7 @@ enum {
};
struct display fb_display[MAX_NR_CONSOLES];
-static signed char con2fb_map[MAX_NR_CONSOLES];
+signed char con2fb_map[MAX_NR_CONSOLES];
static signed char con2fb_map_boot[MAX_NR_CONSOLES];
static int logo_height;
static int logo_lines;
@@ -211,6 +211,16 @@ static inline int fbcon_is_inactive(stru
vc->vc_mode != KD_TEXT || ops->graphics);
}
+static inline int fbcon_set_par(struct fb_info *info)
+{
+ if (info->fbops->fb_set_par) {
+ if (fb_notify_clients(FB_EVENT_PRE_MODE_CHANGE, info, &info->var) == NOTIFY_BAD)
+ return -EINVAL;
+ info->fbops->fb_set_par(info);
+ }
+ return 0;
+}
+
static inline int get_color(struct vc_data *vc, struct fb_info *info,
u16 c, int is_fg)
{
@@ -623,15 +633,19 @@ static int con2fb_release_oldinfo(struct
return err;
}
-static void con2fb_init_display(struct vc_data *vc, struct fb_info *info,
+static int con2fb_init_display(struct vc_data *vc, struct fb_info *info,
int unit, int show_logo)
{
struct fbcon_ops *ops = info->fbcon_par;
ops->currcon = fg_console;
- if (info->fbops->fb_set_par && !(ops->flags & FBCON_FLAGS_INIT))
- info->fbops->fb_set_par(info);
+ if (!(ops->flags & FBCON_FLAGS_INIT)) {
+ int err = fbcon_set_par(info);
+
+ if (err)
+ return err;
+ }
ops->flags |= FBCON_FLAGS_INIT;
ops->graphics = 0;
@@ -652,6 +666,7 @@ static void con2fb_init_display(struct v
}
update_screen(vc_cons[fg_console].d);
+ return 0;
}
/**
@@ -708,7 +723,7 @@ static int set_con2fb_map(int unit, int
if (!found)
fbcon_add_cursor_timer(info);
con2fb_map_boot[unit] = newidx;
- con2fb_init_display(vc, info, unit, show_logo);
+ err = con2fb_init_display(vc, info, unit, show_logo);
}
release_console_sem();
@@ -980,9 +995,8 @@ static void fbcon_init(struct vc_data *v
* We need to do it in fbcon_init() to prevent screen corruption.
*/
if (CON_IS_VISIBLE(vc)) {
- if (info->fbops->fb_set_par &&
- !(ops->flags & FBCON_FLAGS_INIT))
- info->fbops->fb_set_par(info);
+ if (!(ops->flags & FBCON_FLAGS_INIT) && fbcon_set_par(info) != 0)
+ return;
ops->flags |= FBCON_FLAGS_INIT;
}
@@ -1988,8 +2002,8 @@ static int fbcon_switch(struct vc_data *
fb_set_var(info, &var);
if (old_info != NULL && old_info != info) {
- if (info->fbops->fb_set_par)
- info->fbops->fb_set_par(info);
+ if (fbcon_set_par(info) != 0)
+ return 0;
fbcon_del_cursor_timer(old_info);
fbcon_add_cursor_timer(info);
}
@@ -2848,6 +2862,12 @@ static const struct consw fb_con = {
.con_resize = fbcon_resize,
};
+int is_fb_con(const struct consw *con)
+{
+ return con == &fb_con;
+}
+EXPORT_SYMBOL(is_fb_con);
+
static struct notifier_block fbcon_event_notifier = {
.notifier_call = fbcon_event_notify,
};
@@ -2892,4 +2912,6 @@ module_exit(fb_console_exit);
#endif
+EXPORT_SYMBOL(con2fb_map);
+
MODULE_LICENSE("GPL");
Index: 2.6.14-nlkd/drivers/video/console/fbcon.h
===================================================================
--- 2.6.14-nlkd.orig/drivers/video/console/fbcon.h 2005-11-09 10:40:17.000000000 +0100
+++ 2.6.14-nlkd/drivers/video/console/fbcon.h 2005-11-07 10:07:01.000000000 +0100
@@ -168,4 +168,7 @@ extern void fbcon_set_tileops(struct vc_
#endif
extern void fbcon_set_bitops(struct fbcon_ops *ops);
+extern int is_fb_con(const struct consw *);
+extern signed char con2fb_map[];
+
#endif /* _VIDEO_FBCON_H */
Index: 2.6.14-nlkd/drivers/video/console/vgacon.c
===================================================================
--- 2.6.14-nlkd.orig/drivers/video/console/vgacon.c 2005-11-09 10:40:17.000000000 +0100
+++ 2.6.14-nlkd/drivers/video/console/vgacon.c 2005-11-04 16:19:34.000000000 +0100
@@ -114,6 +114,8 @@ static int vga_video_font_height;
static int vga_scan_lines;
static unsigned int vga_rolled_over = 0;
+static struct notifier_block *vga_notifier_list;
+
static int __init no_scroll(char *str)
{
/*
@@ -962,6 +964,9 @@ static int vgacon_adjust_height(struct v
outb_p(fsr, vga_video_port_val);
outb_p(0x12, vga_video_port_reg); /* Vertical display limit */
outb_p(vde, vga_video_port_val);
+ notifier_call_chain(&vga_notifier_list,
+ VGACON_EVENT_PRE_ADJUST_HEIGHT | (vga_font_is_default ? VGACON_MC_DEFAULT_FONT : 0),
+ (void*)(long)rows);
spin_unlock_irq(&vga_lock);
for (i = 0; i < MAX_NR_CONSOLES; i++) {
@@ -1185,4 +1190,16 @@ const struct consw vga_con = {
.con_invert_region = vgacon_invert_region,
};
+int vgacon_register_client(struct notifier_block *nb)
+{
+ return notifier_chain_register(&vga_notifier_list, nb);
+}
+EXPORT_SYMBOL(vgacon_register_client);
+
+int vgacon_unregister_client(struct notifier_block *nb)
+{
+ return notifier_chain_unregister(&vga_notifier_list, nb);
+}
+EXPORT_SYMBOL(vgacon_unregister_client);
+
MODULE_LICENSE("GPL");
Index: 2.6.14-nlkd/drivers/video/fbmem.c
===================================================================
--- 2.6.14-nlkd.orig/drivers/video/fbmem.c 2005-11-09 10:40:17.000000000 +0100
+++ 2.6.14-nlkd/drivers/video/fbmem.c 2005-11-07 10:11:34.000000000 +0100
@@ -673,8 +673,17 @@ fb_set_var(struct fb_info *info, struct
if ((var->activate & FB_ACTIVATE_MASK) == FB_ACTIVATE_NOW) {
struct fb_videomode mode;
+ struct fb_event event;
int err = 0;
+ event.info = info;
+ event.data = var;
+ if (notifier_call_chain(&fb_notifier_list,
+ FB_EVENT_PRE_MODE_CHANGE,
+ &event) == NOTIFY_BAD)
+ return -EINVAL;
+
+
info->var = *var;
if (info->fbops->fb_set_par)
info->fbops->fb_set_par(info);
@@ -690,7 +699,6 @@ fb_set_var(struct fb_info *info, struct
err = fb_add_videomode(&mode, &info->modelist);
if (!err && (flags & FBINFO_MISC_USEREVENT)) {
- struct fb_event event;
int evnt = (var->activate & FB_ACTIVATE_ALL) ?
FB_EVENT_MODE_CHANGE_ALL :
FB_EVENT_MODE_CHANGE;
@@ -1117,6 +1125,21 @@ int fb_unregister_client(struct notifier
}
/**
+ * fb_notify_clients - notify all clients
+ * @what: event type
+ * @info: framebuffer affected
+ * @data: event specific data
+ */
+int fb_notify_clients(unsigned long what, struct fb_info *info, void *data)
+{
+ struct fb_event event;
+
+ event.info = info;
+ event.data = data;
+ return notifier_call_chain(&fb_notifier_list, what, &event);
+}
+
+/**
* fb_set_suspend - low level driver signals suspend
* @info: framebuffer affected
* @state: 0 = resuming, !=0 = suspending
@@ -1321,6 +1344,7 @@ EXPORT_SYMBOL(fb_get_buffer_offset);
EXPORT_SYMBOL(fb_set_suspend);
EXPORT_SYMBOL(fb_register_client);
EXPORT_SYMBOL(fb_unregister_client);
+EXPORT_SYMBOL(fb_notify_clients);
EXPORT_SYMBOL(fb_get_options);
EXPORT_SYMBOL(fb_new_modelist);
Index: 2.6.14-nlkd/include/linux/fb.h
===================================================================
--- 2.6.14-nlkd.orig/include/linux/fb.h 2005-11-09 10:40:17.000000000 +0100
+++ 2.6.14-nlkd/include/linux/fb.h 2005-11-09 10:28:14.000000000 +0100
@@ -475,6 +475,8 @@ struct fb_cursor_user {
* Register/unregister for framebuffer events
*/
+/* The resolution of the passed in fb_info is about to change */
+#define FB_EVENT_PRE_MODE_CHANGE 0x00
/* The resolution of the passed in fb_info about to change */
#define FB_EVENT_MODE_CHANGE 0x01
/* The display on this fb_info is beeing suspended, no access to the
@@ -509,6 +511,7 @@ struct fb_event {
extern int fb_register_client(struct notifier_block *nb);
extern int fb_unregister_client(struct notifier_block *nb);
+extern int fb_notify_clients(unsigned long, struct fb_info *, void *);
/*
* Pixmap structure definition
Index: 2.6.14-nlkd/include/video/vga.h
===================================================================
--- 2.6.14-nlkd.orig/include/video/vga.h 2005-11-09 10:40:17.000000000 +0100
+++ 2.6.14-nlkd/include/video/vga.h 2005-11-04 16:19:34.000000000 +0100
@@ -19,6 +19,7 @@
#include <linux/config.h>
#include <linux/types.h>
+#include <linux/notifier.h>
#include <asm/io.h>
#ifndef CONFIG_AMIGA
#include <asm/vga.h>
@@ -479,4 +480,12 @@ static inline void vga_mm_wattr (void __
vga_mm_w (regbase, VGA_ATT_W, val);
}
+#define VGACON_EVENT_PRE_ADJUST_HEIGHT 0x01
+
+#define VGACON_EVENT_FLAGS_MASK 0xff000000
+#define VGACON_MC_DEFAULT_FONT 0x80000000
+
+int vgacon_register_client(struct notifier_block *);
+int vgacon_unregister_client(struct notifier_block *);
+
#endif /* __linux_video_vga_h__ */
next prev parent reply other threads:[~2005-11-09 14:04 UTC|newest]
Thread overview: 105+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-11-09 13:54 [PATCH 0/39] NLKD - Novell Linux Kernel Debugger Jan Beulich
2005-11-09 13:56 ` [PATCH 1/39] NLKD - an alternative kallsyms approach Jan Beulich
2005-11-09 13:57 ` [PATCH 2/39] NLKD - an alternative early ioremap approach Jan Beulich
2005-11-09 13:58 ` [PATCH 3/39] NLKD - early/late CPU up/down notification Jan Beulich
2005-11-09 13:59 ` [PATCH 4/39] NLKD/i386 " Jan Beulich
2005-11-09 14:01 ` [PATCH 5/39] NLKD/x86-64 " Jan Beulich
2005-11-10 13:10 ` Andi Kleen
2005-11-14 8:04 ` [discuss] " Jan Beulich
2005-11-14 12:37 ` Andi Kleen
2005-11-09 14:01 ` [PATCH 6/39] NLKD - early panic notification Jan Beulich
2005-11-09 14:02 ` [PATCH 7/39] NLKD - task create/destroy notification Jan Beulich
2005-11-09 14:03 ` [PATCH 8/39] NLKD - rmmod notification Jan Beulich
2005-11-09 14:04 ` [PATCH 9/39] NLKD - hotkey notification Jan Beulich
2005-11-09 14:05 ` Jan Beulich [this message]
2005-11-09 14:06 ` [PATCH 11/39] NLKD - time adjustment Jan Beulich
2005-11-09 14:06 ` [PATCH 12/39] NLKD/i386 " Jan Beulich
2005-11-09 19:10 ` George Anzinger
2005-11-10 8:12 ` Jan Beulich
2005-11-11 0:17 ` George Anzinger
2005-11-09 14:08 ` [PATCH 13/39] NLKD/x86-64 " Jan Beulich
2005-11-09 14:13 ` [PATCH 18/39] NLKD/x86-64 - INT1/INT3 handling changes Jan Beulich
2005-11-09 14:14 ` [PATCH 19/39] NLKD/x86-64 - stack-pointer-invalid markers Jan Beulich
2005-11-09 14:15 ` [PATCH 20/39] NLKD/x86-64 - switch_to() floating point adjustment Jan Beulich
2005-11-09 14:16 ` [PATCH 21/39] NLKD/x86-64 - core adjustments Jan Beulich
2005-11-10 13:24 ` [PATCH 20/39] NLKD/x86-64 - switch_to() floating point adjustment Andi Kleen
2005-11-10 14:07 ` Jan Beulich
2005-11-10 13:23 ` [PATCH 19/39] NLKD/x86-64 - stack-pointer-invalid markers Andi Kleen
2005-11-10 14:25 ` Jan Beulich
2005-11-10 13:21 ` [PATCH 18/39] NLKD/x86-64 - INT1/INT3 handling changes Andi Kleen
2005-11-10 14:07 ` Jan Beulich
2005-11-10 14:25 ` Andi Kleen
2005-11-10 15:00 ` Jan Beulich
2005-11-11 3:39 ` [discuss] " Andi Kleen
2005-11-10 13:19 ` [PATCH 13/39] NLKD/x86-64 - time adjustment Andi Kleen
2005-11-10 14:23 ` Jan Beulich
2005-11-11 2:12 ` Andi Kleen
2005-11-12 9:22 ` Vojtech Pavlik
2005-11-12 17:21 ` Andi Kleen
2005-11-12 20:44 ` Vojtech Pavlik
2005-11-15 0:38 ` George Anzinger
2005-11-15 1:05 ` [discuss] " Andi Kleen
2005-11-15 7:50 ` Vojtech Pavlik
2005-11-15 8:24 ` Jan Beulich
2005-11-10 14:43 ` Vojtech Pavlik
2005-11-09 14:09 ` [PATCH 14/39] NLKD - kernel trace buffer access Jan Beulich
2005-11-09 14:09 ` [PATCH 15/39] NLKD - early pseudo-fs Jan Beulich
2005-11-09 14:11 ` [PATCH 16/39] NLKD - core adjustments Jan Beulich
2005-11-09 14:11 ` [PATCH 17/39] NLKD/i386 " Jan Beulich
2005-11-09 19:00 ` Adrian Bunk
2005-11-10 8:04 ` Jan Beulich
2005-11-10 10:29 ` Adrian Bunk
2005-11-10 11:52 ` Jan Beulich
2005-11-10 12:36 ` Lars Marowsky-Bree
2005-11-09 14:18 ` [PATCH 22/39] NLKD - core Jan Beulich
2005-11-09 14:19 ` [PATCH 23/39] NLKD/x86 " Jan Beulich
2005-11-09 14:20 ` [PATCH 24/39] NLKD/i386 " Jan Beulich
2005-11-09 14:21 ` [PATCH 25/39] NLKD/x86-64 " Jan Beulich
2005-11-10 13:30 ` Andi Kleen
2005-11-09 14:22 ` [PATCH 26/39] NLKD - run time library Jan Beulich
2005-11-09 14:23 ` [PATCH 27/39] NLKD/i386 " Jan Beulich
2005-11-09 14:23 ` [PATCH 28/39] NLKD/x86-64 " Jan Beulich
2005-11-10 13:32 ` Andi Kleen
[not found] ` <437214B7.76F0.0078.0@novell.com>
[not found] ` <4372156A.76F0.0078.0@novell.com>
2005-11-09 14:28 ` [PATCH 34/39] NLKD/x86 - Console Debug Agent Jan Beulich
[not found] ` <43721600.76F0.0078.0@novell.com>
2005-11-09 14:30 ` [PATCH 38/39] NLKD/i386 - Remote " Jan Beulich
2005-11-09 14:31 ` [PATCH 39/39] NLKD/x86-64 " Jan Beulich
2005-11-09 14:29 ` [PATCH 15/39] NLKD - early pseudo-fs Al Viro
2005-11-09 14:37 ` Jan Beulich
2005-11-09 15:00 ` Al Viro
2005-11-09 16:00 ` Jan Beulich
2005-11-10 5:44 ` [PATCH 14/39] NLKD - kernel trace buffer access Keith Owens
2005-11-10 8:02 ` Jan Beulich
2005-11-09 18:51 ` [PATCH 11/39] NLKD - time adjustment George Anzinger
2005-11-09 16:50 ` [PATCH 6/39] NLKD - early panic notification Greg KH
2005-11-09 16:45 ` [PATCH 3/39] NLKD - early/late CPU up/down notification Greg KH
2005-11-09 17:09 ` Jan Beulich
2005-11-09 17:19 ` Greg KH
2005-11-10 7:41 ` Jan Beulich
2005-11-10 20:59 ` Sam Ravnborg
2005-11-11 7:52 ` Jan Beulich
2005-11-12 20:52 ` Randy.Dunlap
2005-11-10 23:01 ` Greg KH
2005-11-11 10:06 ` [PATCH 2/39] NLKD - an alternative early ioremap approach Pavel Machek
2005-11-11 10:19 ` Jan Beulich
2005-11-09 16:50 ` [PATCH 1/39] NLKD - an alternative kallsyms approach Randy.Dunlap
2005-11-09 16:57 ` Greg KH
2005-11-09 17:20 ` Jan Beulich
2005-11-09 16:59 ` [PATCH 0/39] NLKD - Novell Linux Kernel Debugger Jeff Garzik
2005-11-09 17:06 ` Randy.Dunlap
2005-11-09 17:14 ` Jan Beulich
2005-11-09 17:56 ` Alan Cox
2005-11-09 18:05 ` Greg KH
2005-11-09 18:54 ` Paul Jackson
2005-11-10 12:41 ` Christoph Hellwig
2005-11-13 1:09 ` Andi Kleen
2005-11-13 2:53 ` jmerkey
2005-11-13 3:44 ` Andi Kleen
2005-11-13 3:26 ` Jeff V. Merkey
2005-11-13 3:32 ` Jeff V. Merkey
2005-11-09 17:53 ` Alan Cox
2005-11-09 16:25 ` Jeffrey V. Merkey
2005-11-10 14:48 ` Mark Lord
2005-11-10 15:28 ` Tom Rini
2005-11-10 16:37 ` Alan Cox
2005-11-13 1:11 ` Andi Kleen
[not found] ` <437214E4.76F0.0078.0@novell.com>
[not found] ` <4372153C.76F0.0078.0@novell.com>
2005-11-10 13:33 ` [PATCH 32/39] NLKD/x86-64 - Core Debug Engine Andi Kleen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=43721024.76F0.0078.0@novell.com \
--to=jbeulich@novell.com \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox